使用 pytest 编写测试用例过程中,需要用到断言是否抛出一个预期中的异常。
什么意思呢? 通过这个实例了解一下。
例:在网页中有一个滑块 ele_drag,需要拖拽到指定位置 ele_drop(class=“item”),当滑块填充完成后,ele_drop 的 class 就会变更名称,如何断言?
def test_hold_move_to_ele(self):
self.driver.get(window) # window 是测试网页
# 有一个可填充区域,class = item
# 当拖动滑块填充完成该区域后,class 变更为其他名称
# 滑块控件
ele_drag = self.driver.find_element_by_id("dragger")
# 可填充区域控件
ele_drop = self.driver.find_elements_by_xpath(f"//div[@class='item']")[0]
# 进行移动
self.action.click_and_hold(ele_drag).move_to_element(ele_drop).release().perform()
# 断言滑块控件的 class 不存在
通常办法有两种:
1、 通过 find_elements 获取元素的列表,判断是否为空;
2、通过 try except 捕获异常,如果 try 内的 find_element 没有报错,则赋值一个变量为真,证明元素存在,否则赋值变量为 false。
还有一种办法:
当元素查找不到时会抛出 NoSuchElementException
异常,那么在用例最后查找 class=item
的元素时,只要抛出该异常,那么就符合我的预期,对吧?
pytest 提供了这样的实现方式,经过测试,可用且代码优雅。
def test_hold_move_to_ele(self):
self.driver.get(window) # window 是测试网页
# 有一个可填充区域,class = item
# 当拖动滑块填充完成该区域后,class 变更为其他名称
# 滑块控件
ele_drag = self.driver.find_element_by_id("dragger")
# 可填充区域控件
ele_drop = self.driver.find_elements_by_xpath(f"//div[@class='item']")[0]
# 进行移动
self.action.click_and_hold(ele_drag).move_to_element(ele_drop).release().perform()
# 断言是否抛出预期异常,是则用例通过,否则用例失败
with pytest.raises(NoSuchElementException):
self.driver.find_element_by_xpath(f"//div[@class='item']")