Selenium、Pytest自动化测试
Selenium、Pytest自动化测试----参数化断言前言多条用例之间相互影响toastalert断言参数化时对不同的用例进行断言前言在学习Selenium、Pytest时遇到了一些问题在此记录多条用例之间相互影响在验证同一个模块的不同用例时需要保证各个用例之间不能相互影响。例如在验证登录功能时第一条用例是验证用户名密码错误登录失败的功能第二条的用例是验证登录成功功能代码如下deftest_login_01(self,username,password,result):self.driver.find_element(By.XPATH,//input[placeholderID 或 邮箱]).send_keys(username)self.driver.find_element(By.XPATH,//input[placeholder密码]).send_keys(password)self.driver.find_element(By.XPATH,//button[typebutton]).click()由于第一条用例执行后并没有做文本框的清除功能就导致在执行第二条用例时第一条用例在文本框输入的数据与第二条用例在文本框输入的数据叠加导致第二条也不能登录成功最开始采用在每条用例执行完之后定位到文本框元素然后使用**clear()**方法执行清除操作但是在执行登录成功的用例时登陆成功后跳转页面导致无法找到登录页面的文本框会报错所以采用了刷新页面的方法在每条用例执行后重置状态保证每条用例之间不能相互影响defteardown_method(self):self.driver.get(https://test-metersphere.com/#/login)self.driver.delete_all_cookies()self.driver.refresh()time.sleep(5)这里使用了teardown后置处理并且把范围限制为类中的方法重置驱动url并且删除cookie然后刷新浏览器这样在执行完一条用例之后就会重置状态以免影响后续用例。toastalert断言要正确区分toast与alert的区别项目在登录失败时会出现一个toast提示登录失败最开始时博主将toast当成了alert进行断言执行后程序一直报错alertWebDriverWait(self.driver,5).until(EC.alert_is_present())Raises: TimeoutException: If method does not return a truthy value within the WebDriverWait objects timeout.这里设置的等待alert弹窗出现时间为5秒由于是toast弹窗所以一直没有等到alert弹窗出现导致了timeoutexception异常后续发现是toast提示修改代码toastWebDriverWait(self.driver,5).until(EC.visibility_of_element_located((By.XPATH,//div[normalize-space()用户名或密码不正确])))然后在使用assert断言toast弹框文本第一条登录失败的用例就执行成功了。注意在等待toast元素出现时代码中EC.visibility_of_element_located()方法的入参期望的是一个定位器元组即 (By.方式, “值”)而不是两个分开的参数注意要多加一层括号。设置合理的等待时间很有必要如果页面没有渲染完成就去定位元素可能出现异常但是如果设置的等待时间过程又会拉低程序执行的效率所以要注意这一点等博主后续深入了解后再另作分享。参数化时对不同的用例进行断言这里博主使用简单的if语句对预期result进行判断然后在设置不同的断言较为简单后续深入了解再分享注意这里第二条用例执行成功后会跳转到系统首页博主对当前地址进行了断言操作由于跳转需要等待加载时间所以在断言前设置了3s的等待时间否则可能会断言失败。time.sleep(3)assertresultself.driver.current_url