跳过(skip)及预期失败(xFail)
skip使用场景
@pytest.mark.skip
@pytest.mark.skipif
pytest.skip(reason)
xfail 使用场景
@pytest.mark.xfail
参数化
mark-参数化测试函数
@pytest.mark.parametrize
进行参数化和数据驱动,更灵活mark:参数化测试函数的使用
单参数
search_list = ['appium', 'selenium', 'pytest'] @pytest.mark.parametrize('name', search_list) def test_search(name): assert name in search_list
多参数
@pytest.mark.parametrize("test_input, expected", [("3+5", 8), ("2+5", 7), ("7+5", 12)]) def test_mark_more(test_input, expected): assert eval(test_input) == expected
用例重命名-添加ids参数
@pytest.mark.parametrize("test_input, expected", [("3+5", 8), ("2+5", 7), ("7+5", 12)], ids=['add_3+5=8', 'add_2+5=7', 'add_3+5=12']) def test_mark_more(test_input, expected): assert eval(test_input) == expected
笛卡尔积
a=[1,2,3], b=[a,b,c]
执行:
使用main函数
使用python -m pytest 调用 pytest(jenkins持续集成用到)
if __name__ == "__main__": # 1、运行当前目录下所有符合规则的用例,包括子目录 (test_*.py 和 *_test.py) pytest.main() # 2、运行test_mark1.py::test_dk模块中的某一条用例 pytest.main(['test_mark1.py::test_dk', '-vs']) # 3、运行某个标签 pytest.main(['test_mark1.py', '-vs', '-m', 'dk'])
常用的异常处理方法
+try...except
try: 可能产生异常的代码块 except [(ERROR1, ERROR2, ...)] [as e]: 处理异常的代码块1 except [(ERROR3, ERROR4, ...)] [as e]: 处理异常的代码块2 except [Exception]: 处理其他异常
pytest.raise()
def test_raise(): with pytest.raises(ValueError, match='must be 0 or None'): raise ValueError("value must be 0 or None") def test_raise1(): with pytest.raises(ValueError) as exc_info: raise ValueError("value must be 42") assert exc_info.type is ValueError assert exc_info.value.args[0] == "value must be 42"
Selenium定位的方法有几种?分别是?
定位不到元素是什么原因导致的?
定位编写错误
元素还没有完全加载出来,就去进行定位,导致找不到元素。
$x("//*[text()='文本信息']")
id通常是唯一且不会变化的,但是因为后面前端技术栈的发展,很多ID都是动态生成的,且一直再变化
$x("//*[text()='文本信息']")
页面有iframe,确认是否有iframe:Ctri+F再element页面搜索,找到即代表有,确定要定位的元素是否在iframe里,如果包含,那么就需要切换iframe
switch_to.frame(frame)
存在页面切换
解决方法:切换到新窗口后,再进行定位
windows = self.driver.window_handles # 获取当前所有窗口 self.driver.switch_to.window(-1) # 切换到最新的窗口
元素是隐藏的,如果点击或者操作,那么就会报ElementNotInteractableException
,辨别:style="display: none;"
或者 hidden="hidden"
就是元素的隐藏状态
self.driver.execute_script('document.querySelector(".el-button--info").click()') # el-button--info为class值
元素被遮挡
selenium中隐藏元素如何定位?
如何定位动态元素?
$x("//*[text()='文本信息']")
如何通过子元素定位父元素?
解决方案:
使用css 或者其他方式都无法实现,只有xpath表达式可以实现
定位到子元素(使用xpath表达式):
通过 /..
即可定位到父元素
console里输入表达式:$x("//*[@data-sort-order='default']")
定位到子元素,data-sort-order为属性名,'default’为属性值,然后通过输入表达式:$x("//*[@data-sort-order='default']/..")
定位到父元素
如何通过父元素定位子元素?
通过父元素的class定位到父元素,console里输入 $(".class")
回车定位,class为父元素的class值,然后输入$(".class .sub")
回车定位子元素,sub为子元素的属性值。
如何判断一个页面上元素是否存在?
有的元素就在加载页面上,但是却定位不到,怎么解决?
如果产品总是出现弹窗,导致用例无法执行,应该如何解决?
一个元素明明定位到了,点击无效(也没报错),如何解决?