Selenium、Pytest自动化测试
Selenium、Pytest自动化测试----参数化&断言
- 前言
- 多条用例之间相互影响
- toast&alert断言
- 参数化时对不同的用例进行断言
前言
在学习Selenium、Pytest时,遇到了一些问题,在此记录
多条用例之间相互影响
在验证同一个模块的不同用例时,需要保证各个用例之间不能相互影响。例如,在验证登录功能时,第一条用例是验证用户名密码错误登录失败的功能,第二条的用例是验证登录成功功能,代码如下:
deftest_login_01(self,username,password,result):self.driver.find_element(By.XPATH,"//input[@placeholder='ID 或 邮箱']").send_keys(username)self.driver.find_element(By.XPATH,"//input[@placeholder='密码']").send_keys(password)self.driver.find_element(By.XPATH,"//button[@type='button']").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,然后刷新浏览器,这样在执行完一条用例之后就会重置状态,以免影响后续用例。
toast&alert断言
要正确区分toast与alert的区别,项目在登录失败时会出现一个toast提示登录失败,最开始时,博主将toast当成了alert进行断言,执行后程序一直报错:
alert=WebDriverWait(self.driver,5).until(EC.alert_is_present())Raises: TimeoutException: If 'method' does not return a truthy value within the WebDriverWait object's timeout.这里设置的等待alert弹窗出现时间为5秒,由于是toast弹窗,所以一直没有等到alert弹窗出现,导致了timeoutexception异常,后续发现是toast提示,修改代码:
toast=WebDriverWait(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)assertresult==self.driver.current_url