前言:本文主要记录写编写自动化用例中遇到的问题,以及当时采取的解决办法,方面后续查看
1.Message: Element is not visible
解决办法:可以把这个id下所有该类型的元素找出来,然后看看其中哪一个的属性里有和界面控件上相同的文本
2.应用程序无法启动
描述:有一个进程无法关闭,该进程有一个ppid(父进程的id),但是用ppid查询不到这个进程;这个进程的关闭一直不成功,就阻塞了整个程序的运行
3 用坐标拾取点拾取不上时
注意是否是获取坐标点时的屏幕分辨率和显示百分比与程序的默认配置不同
采用的是,默认是1920*1080 100%显示
4 表单空间虽然关闭了,但是driver的page_source中还是会有表单的UI信息
从而导致element找不到正确的那个
5 pyhton中的浅拷贝与深拷贝
描述:测试用例有重跑机制,测试数据中有列表,运行测试用例时会对列表数据进行pop操作,最终发现测试用例第一次运行失败后,第二次重跑时测试用例的列表数据为空
原因:重跑机制的装饰器只是让用例的执行过程再次执行了,并没有重新执行从数据库取数据的操作,对测试数据的使用是直接赋值使用的(使用“=”),python里这是浅拷贝,所以原有数据产生影响,即第一次执行用例时把列表数据弹空了,第二次重跑的时候列表就是空的
解决方法:用深拷贝代替浅拷贝,即使用copy库中的deepcopy方法
6 debug模式程序正常执行,run模式就遇到异常
- 由于浏览器的渲染需要耗费一定的时间,而在程序执行时几乎是瞬间完成, 从而也就导致了后续的错误。而在debug模式下,由于单步调试存在一定的时间间隔,因此不会出现错误。 可以在相关地方加上time.sleep来解决
- 自动化的过程中忽略了一些手工测试看上去是无效的操作,如鼠标的滑动:鼠标在滑动中被测程序可能完成了部分功能,而程序执行时如果使用 ActionChains中的
perform、click
方法来连续点击屏幕上两个相同的点,可能就会带来问题。可以在相应的地方使用pyautogui中的moveTo
方法模拟物理鼠标的操作,来避免上述的风险。
7 抛出异常Message:Target is out of view in non scrolable widget
描述:一个没有滚动条的面板,当整个整个程序没有全屏展示时,有些按钮就会被遮挡,这时直接对找到的元素执行selenium的click操作就会抛出此异常
解决方法:使用actionchains里的move_to_element后再进行click,示例代码如下:
action = ActionChains(driver)
action.move_to_element(btn_element).click().perform()
action.reset_actions()
8 某个元素无法用selenium自带的click激活
解决办法:根据元素的location、size计算出屏幕上的绝对坐标(x,y),再使用pyautogui的click方法进行点击
9 pydirectinput.rightClick未起效或效果与直接手动鼠标右键效果不一致
有一种可能是右键中间的停顿的太短,被操作的程序没来得及做出完整响应,可尝试使用以下代码替换pydirectinput.rightClick
pydirectinput.mouseDown(point_x, point_y, button="right")
time.sleep(1)
pydirectinput.mouseUp(button="right")
10 使用esc退出
遇到过这样一个情况:debug模式下一行行调试没有问题,但直接运行时获取窗口时会有异常(操作A会弹出一个新窗口,为了切到这个新窗口上,会在操作A执行前后获取webdriver.window_handles做差),后来发现是操作A之前的操作B看上去结束了,但会有残留,最后在操作B执行后调用pygui.press("esc")
解决了这个问题
注意点
对于引入的库的操作,如selenium,最好自己本地再做一次封装,防止库发生更新的时候,整个项目要进行多出更改
要避免用例之间的相互影响,不管上一个用例发生了什么都不能影响下一个用例的正常执行,可以加上时间阈值(一个用例过了多久还没执行完就自动关闭);要做好用例在各种地方都会失败的可能,做好各种异常捕捉
结合uiautomation使用
有时候selenium不能完全解决的,可使用uiautomation尝试解决