selenium 处理ajix以及文档为未加载完导致的元素定位失败的解决方案

一、解决思路

我们一般的处理方式是加睡眠时间sleep以及通过显示等待某个元素出现后再去执行我们需要的相关操作。但是这两种方式都有很明显的弊端。

第一种方式sleep固定时间,缺点为:1.浪费时间,有时元素已加载ok,但是还是要等sleep时间结束才执行;2.不稳定、较难权衡一个比较合适的等待时间,有时服务器端慢,导致超时了元素还未加载(有的元素是服务器返回的),此时便会抛出元素超时的异常。3.脚本冗余、呆板。

第二种方式通过wait的until函数,加一个条件去显示等待,若找到就直接返回,超时未找到再抛出异常,此种方式较第一种在效率上有所提高,但是写脚本的效率明显降低,代码复杂度变高。

缺点:1.脚本书写效率低,因为需要写的代码量增大,复杂度变高。2.脚本冗余,复杂度变高。 

 

在现在的web应用中,一般都采用了大量的Ajax请求,实现局部刷新。由于页面没有刷新,selenium执行较快,经常会因为元素未加载完,便对其进行操作,进而引发异常抛出。因此最好在每个操作之前,通过js去获取Ajax的活动状态以及文档的活动状态,若都已加载完成,则进行下一步操作。获取Ajax的活动状态可以使用 $.active 去判断,若 $.active 为0,表示Ajax活动完成,通过document.readyState获取页面请求是否完毕,若等于 complete ,表示请求完成。2个判断同时为 true,则进行下一步操作:

public Boolean pageLoaded(){
    JavaScriptExector jse = (JavaScriptExector )driver;
    String jsCode1 = "return $.active;";
    String jsCode2 = "return document.readyState;";
    long time = Systen.currTime;//获取当前时间
    long timeout = 5;//设置超时时间
    while((System.currTime-time)<=timeout*1000){
          if((jse.execJS(jsCode1)==0) &&(jse.execJS(jsCode2)=="complete")){
              return true;
            }
  }  
  System.out.printf("页面加载存在超时!");
  return false;
}

 

posted @ 2015-10-30 23:36  布谷~  阅读(850)  评论(0编辑  收藏  举报