首页 > 其他 > 详细

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

时间:2015-10-31 00:22:45      阅读:840      评论:0      收藏:0      [点我收藏+]

一、解决思路

我们一般的处理方式是加睡眠时间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;
}

 

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

原文:http://www.cnblogs.com/Mr-S/p/4924592.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!