自动化脚本执行过程不稳定,又误报了,怎么办?我们来分析下,出现运行不稳定的几种问题:
- 问题一、页面加载时快时慢,导致要操作的元素时隐时现!
- 问题二、过多的异步加载,虽然控件加载完成了,但是值的填充正在进行!
- 问题三、网格列表无法判断,是否加载完成,因为框架加载和数据加载要全部完成,才能操作!否则会webdriver异常;
- 问题四、Frame不退出为什么也报错!
- 问题五、AJAX异步加载导致的脚本不稳定,如何解决!
---------------------------------------------------------------------------------------------------------
第一个问题:
1、在操作元素之前,需要先判断元素是否可见,Wait Until Element Is Visible
2、打开浏览器后使用Set Browser Implicit Wait方法,隐式等待元素出现或命令执行完成。
3、打开浏览器后,使用Set Selenium Speed 方法,让每步操作后都等待指定的时间。(该方法等于sleep了每个命令,适合调试。)
解决方法分析:
页面load慢导致定位元素失败
a.优先考虑使用wait until page contain *
b.其次考虑 Set * Implicit Wait
c.最后再考虑 wait until keyword succeeds 因为这个关键字需要和其他关键字组合才有效果
Wait Until Keyword Succeeds| timeout, retry_interval, name, *args
等到指定的关键字成功或给定的超时过期。| timeout 表示超时 | retry_interval 表示重新操作的间隔时间 | name表示要等待的关键字名称 | *args 表示所需等待加载的locator
d.最差的考虑是 Set Selenium Speed ,适合调试
第二个问题:2个解决方案;
a、Wait Until Keyword Succeeds 等待后面的关键字执行成功,可设置超时时间和重试间隔时间
b、如果你能确定,是否个元素值,加载最晚,就可以使用“第一个问题”的解决办法;
第三个问题:
通常会对网格进行选中、双击、单击、验证等处理;如果网格数据未加载完成,webdriver会报错,以下2种解决办法;
a、在数据加载时,开发会实现loading效果,我们可以用Js调用开发的Loading判断,通过返回值,来确定网格列表加载完成没有;
b、以网格中某行为锚点,判断这个行是否可见了,如果可见,说明网格基本加载成功,可以使用“第一个问题”的解决办法;
第四个问题:
点击一个按钮,出现一个弹出界面,通常实现是Div里面嵌套一个Iframe;有人会习惯,关闭这个弹出界面后,就直接操作父页面了;
研究发现,在某些浏览器的某些版本下,select Frame 后不退出,直接操作父页面,是OK的;但同时也发现,在一些版本下,即使Frame消亡,不退出frame,webdriver也会报错;所以还是老实的遵守规则吧!
第五个问题:
AJAX文档ready状态不代表所有的AJAX已返回,也可能造成selenium过早地进行页面操作,而造成执行错误,这时大家首先往往会使用sleep,这会短期解决问题,但会造成执行更慢,此方法不是最好的解决办法。
解决:
大多数AJAX框架里面都有一个记录当前活跃AJAX链接数的变量,我们可以等待这个变量为0时,再进行后一步的操作,这样就可以解决AJAX动态等待的问题了,
JQuery1.3.2为例 :Wait For Condition | return window.jQuery.active==0;
注:每种AJAX框架及期不同版本,这个计数器都是不同的,使用之前需要跟研发确认一下。
实例:定义一个等待动态加载完成的关键字
等待关键字
AJAX页面其他可用关键字:
Wait For Condition | condition //尤其是Wait For Condition,由于能够直接访问JavaScript代码,它异常强大
Wait Until page contains | text
wait until page contains element | locator |timeout
---小实验---
为了解决这个问题,我们应该在 click button 关键字的后面加上 don't wait参数,这样就不会出现500错误了。
click button | xpath=//button[1] | don't wait |
修改后我们继续运行一遍测试用例,没有500错误出现,但这次却出现了其他错误。
TestFail | FAIL |
Page should have contained text '本内容是使用 GET 方法请求的' but did not
这又是为什么呢?记住。Ajax的刷新是异步的,返回文字需要时间。而由于使用了don't wait参数,Robot Framework直接执行了下一个关键字 Page should contain,此时返回文字这时还没有出现,自然会失败。
这时候我们就用到了另外一个关键字 Wait Until Page Contains
我们将Page should contain 这一句换成下面这一句(第二个参数5000指的是等待5000毫秒,超过后就抛出超时错误)。
Wait Until Page Contains | 本内容是使用 GET 方法请求的 | 5000 |
这样再次运行测试用例,就得到TestPass了。