一、解决思路
我们一般的处理方式是加睡眠时间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