Selenium等待元素的处理方法
2015-11-27 16:34
330 查看
在开发脚本的过程中,经常会因为网络或者系统性能的问题,导致页面加载很慢,这种问题经常会导致脚本因为超时运行失败,那么就需要等待元素来解决这个问题。
1. Java sleep实现
这个方法是最不推荐的,是用线程等待的方式来实现,每次元素出现在页面的时间不一样,如果设置的时间长了,白白浪费了时间,如果设置的时间短了,脚本依然会报没有找到元素的错误。
2. WebDriver PageLoadTimeOut
这个方法实际上跟上面那个是一样的,也不推荐
3. WebDriver implicitlyWait
这个也是WebDriver的一个方法,是每个driver自己去实现设置超时时间,在当前页面找元素的时候,首先去找web元素,如果没有找到,判断时间否超超过设置的时间,如果没有超过,则再次找这个元素,直到找到元素或者时间超过设置时间。那我们就可以设定一个比较长的超时时间,但同时也不会让程序白白的等待。
这种方式就相对来说灵活一点了,但是有个问题,这个设置是针对全局的,并不是所有的元素都需要等待,比如页面上用js来实现的,点一个按钮或者把鼠标移动到某个区域就会出现期望的元素,这个时候driver也会去执行等待的方法,一两次的时间浪费可能不多,累积起来就很多了。从另一方面,如果期望某个元素在指定的时间内没有出现,这个方法就会浪费很多的方法了。(这个解释不确定对不对,如有异议烦请指正)
4. WebDriverWait
对于这个方法的解释是,每500毫秒扫描一次页面,检查元素是否存在,存在的话返回true,不存在继续等到,直到等到时间超过30秒报错。这个方法就完美解决了上面的所有问题,力荐这个方法。
5 waitForCondition
这个方法是调用JS来实现等待,目前我的框架中用得比较多的是等待整个页面加载完全,而不是指定的元素,因为对JS不是很熟悉,相信应该有等待指定元素的方法,有的话可以留言给我。
1. Java sleep实现
Thread.sleep()
这个方法是最不推荐的,是用线程等待的方式来实现,每次元素出现在页面的时间不一样,如果设置的时间长了,白白浪费了时间,如果设置的时间短了,脚本依然会报没有找到元素的错误。
2. WebDriver PageLoadTimeOut
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
这个方法实际上跟上面那个是一样的,也不推荐
3. WebDriver implicitlyWait
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
这个也是WebDriver的一个方法,是每个driver自己去实现设置超时时间,在当前页面找元素的时候,首先去找web元素,如果没有找到,判断时间否超超过设置的时间,如果没有超过,则再次找这个元素,直到找到元素或者时间超过设置时间。那我们就可以设定一个比较长的超时时间,但同时也不会让程序白白的等待。
这种方式就相对来说灵活一点了,但是有个问题,这个设置是针对全局的,并不是所有的元素都需要等待,比如页面上用js来实现的,点一个按钮或者把鼠标移动到某个区域就会出现期望的元素,这个时候driver也会去执行等待的方法,一两次的时间浪费可能不多,累积起来就很多了。从另一方面,如果期望某个元素在指定的时间内没有出现,这个方法就会浪费很多的方法了。(这个解释不确定对不对,如有异议烦请指正)
4. WebDriverWait
private boolean waitForElement(final By elementLocator) { try { WebDriverWait driverWait = (WebDriverWait) new WebDriverWait(driver, 30, 500).ignoring( StaleElementReferenceException.class).withMessage("元素在30秒内没有出现!"); return driverWait.until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver driver) { try { if (driver.findElement(elementLocator).isDisplayed()) { return false; } } catch (IndexOutOfBoundsException e) { } catch (NoSuchElementException e) { } return true; } }); } catch (Exception e) { return false; } }
对于这个方法的解释是,每500毫秒扫描一次页面,检查元素是否存在,存在的话返回true,不存在继续等到,直到等到时间超过30秒报错。这个方法就完美解决了上面的所有问题,力荐这个方法。
5 waitForCondition
waitForCondition("selenium.browserbot.getUserWindow().$.active == 0;", 30000); waitForCondition("(selenium.browserbot.getCurrentWindow().document.readyState=='interactive') || " + "(selenium.browserbot.getCurrentWindow().document.readyState=='complete');", 30000);
这个方法是调用JS来实现等待,目前我的框架中用得比较多的是等待整个页面加载完全,而不是指定的元素,因为对JS不是很熟悉,相信应该有等待指定元素的方法,有的话可以留言给我。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统