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

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

  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框架及期不同版本,这个计数器都是不同的,使用之前需要跟研发确认一下

 

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

 

次却出现了其他错误。

  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毫秒,超过后就抛出超时错误)。

 

posted @ 2019-01-29 14:34  澄心  阅读(853)  评论(0编辑  收藏  举报