码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-10-31 00:24:47      阅读:166      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!