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;
}
时间: 2024-11-08 19:13:26

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

Chrome设计文档-多进程资源加载

原文:Multi-process Resource Loading 背景 浏览器主进程及browser process处理所有的网络通信.原因有三点: Browser process可以控制每一个renderer进程的网络访问 Browser process可以在进程间管理session状态,保持其一致性 Browser process可以针对每个host管理最大链接数 概述 作为一个多进程应用,Chrome分为三层.最底层的是webkit库,它主要负责页面渲染工作.之上是渲染进程Rendere

js图片未加载完显示loading效果

<html> <title>js图片未加载完显示loading效果</title> <body> <style> img{float:left;width:200px;height:200px;margin:0 10px 10px 0} </style> <script> //判断浏览器 var Browser=new Object(); Browser.userAgent=window.navigator.userAge

如果在文档已完成加载后执行 document.write,整个 HTML 页面将被覆盖

<!DOCTYPE html> <html> <body> <h1>My First Web Page</h1> <p>My First Paragraph.</p> <button onclick="myFunction()">点击这里</button> <script> function myFunction() { document.write("糟糕

如果在文档已完成加载后执行&#160;document.write,整个&#160;HTML&#160;页面将被覆盖

个人理解是当触发某个包含document.write()的事件,HTML页面中body中的元素会消失,显示document.write()里面的内容.如下面的代码: 1 <p>我的第一个段落</p> 2 <button onclick="changeP()">点击<button> 3 function changeP(){ 4 document.write(Date()); 5 } 点击确定以后标签p和button里面的内容消失,在页面上

vs2010 单文档MFC 通过加载位图文件作为客户区背景

实现效果: 这个其实是一个非常常见的功能,大家都会考虑给自己简单的工程做一个背景界面.其实只要在view类中重载OnEraseBkgnd()这个函数就好了. 代码如下: BOOL CdddView::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CString string("b.bmp"); HBITMAP hbitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),strin

C# 加载xml文档文件及加载xml字符串

//创建XmlDocument对象 XmlDocument xmlDoc = new XmlDocument(); //载入xml文件名 xmlDoc.Load(filename); //如果是xml字符串,则用以下形式 xmlDoc.LoadXml(xmldata); //读取根节点的所有子节点,放到xn0中 XmlNodeList xn0 = xmlDoc.SelectSingleNode("Document").ChildNodes; //查找二级节点的内容或属性 foreach

webView未加载完,退出方法

经验证此方法比较保险 @Override protected void onDestroy() { // TODO Auto-generated method stub if(webView!=null){ webView.destroy(); webView=null;//释放资源 } super.onDestroy(); }

【JS教程16】jquery文档加载完再执行

jquery文档加载完再执行 将获取元素的语句写到页面头部,会因为元素还没有加载而出错,jquery提供了ready方法解决这个问题,它的速度比原生的 window.onload 更快. <script type="text/javascript"> $(document).ready(function(){ ...... }); </script> 可以简写为: <script type="text/javascript"> $

js文件代码未加载或者没有js效果

问题:在页面中js文件中的代码未加载或者没有任何效果. 原因: 成功引用了js文件,但无效果或者提示未加载该文档中的代码. 可能页面引用js文件的路径存在问题 解决: 重新检查你引用的js文件的路径是否正确: 一般是js代码存在语法问题,仔细检查标点符号.单双引号(本人源于这个问题),以及页面中是否有未结束的<!--的符号. js文件代码未加载或者没有js效果