自动化脚本执行过程不稳定,又误报了,怎么办?我们来分析下,出现运行不稳定的几种问题:

  1. 问题一、页面加载时快时慢,导致要操作的元素时隐时现!
  2. 问题二、过多的异步加载,虽然控件加载完成了,但是值的填充正在进行!
  3. 问题三、网格列表无法判断,是否加载完成,因为框架加载和数据加载要全部完成,才能操作!否则会webdriver异常;
  4. 问题四、Frame不退出为什么也报错!
  5. 问题五、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框架及期不同版本,这个计数器都是不同的,使用之前需要跟研发确认一下。

实例:定义一个等待动态加载完成的关键字

自动化脚本运行稳定性(一)——脚本健壮性_加载

element should contain | jquery=.recommend >td $  | 3

 

等待关键字

自动化脚本运行稳定性(一)——脚本健壮性_加载_02

Wait Until keyword Succeeds | 2 min | 10 sec |报价

 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了。