博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Selenium webdriver+Java-------如何等待页面元素加载完成
阅读量:6962 次
发布时间:2019-06-27

本文共 3540 字,大约阅读时间需要 11 分钟。

 

web的自动化测试中,我们经常会遇到这样一种情况:当我们的程序执行时需要页面某个元素,而此时这个元素还未加载完成,这时我们的程序就会报错。怎么办?等待。等待元素出现后再进行对这个元素的操作。

在selenium-webdriver中我们用两种方式进行等待:明确的等待和隐性的等待。

 

一、明确的等待

 

明确的等待是指在代码进行下一步操作之前等待某一个条件的发生。最不好的情况是使用Thread.sleep()去设置一段确认的时间去等待。但为什么说最不好呢?因为一个元素的加载时间有长有短,你在设置sleep的时间之前要自己把握长短,太短容易超时,太长浪费时间。selenium webdriver提供了一些方法帮助我们等待正好需要等待的时间。利用WebDriverWait类和ExpectedCondition接口就能实现这一点。

 

下面的html代码实现了这样的一种效果:点击click按钮5秒钟后,页面上会出现一个红色的div块。我们需要写一段自动化脚本去捕获这个出现的div,然后高亮之。

Wait.html            Set Timeout                                    
 

下面的代码实现了高亮动态生成的div块的功能:

 

import org.openqa.selenium.By;import org.openqa.selenium.JavascriptExecutor;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.openqa.selenium.support.ui.ExpectedCondition;import org.openqa.selenium.support.ui.WebDriverWait;public class WaitForSomthing {    /**     * @author gongjf     */    public static void main(String[] args) {        // TODO Auto-generated method stub        System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");          WebDriver dr = new FirefoxDriver();        String url = "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Wait.html";// "/Your/Path/to/Wait.html"        dr.get(url);        WebDriverWait wait = new WebDriverWait(dr,10);        wait.until(new ExpectedCondition
(){ @Override public WebElement apply(WebDriver d) { return d.findElement(By.id("b")); }}).click(); WebElement element = dr.findElement(By.cssSelector(".red_box")); ((JavascriptExecutor)dr).executeScript("arguments[0].style.border = \"5px solid yellow\"",element); }}
 

上面的代码WebDriverWait类的构造方法接受了一个WebDriver对象和一个等待最长时间(10秒)。然后调用until方法,其中重写了ExpectedCondition接口中的apply方法,让其返回一个WebElement,即加载完成的元素,然后点击。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到有成功的返回,当然如果超过设定的值还没有成功的返回,将抛出异常。

 

二、隐性等待

 

隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用。上面的代码就变成了这样:

 

import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.JavascriptExecutor;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.openqa.selenium.support.ui.ExpectedCondition;import org.openqa.selenium.support.ui.WebDriverWait;public class WaitForSomthing {    /**     * @author gongjf     */    public static void main(String[] args) {        // TODO Auto-generated method stub        System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");          WebDriver dr = new FirefoxDriver();                //设置10秒        dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);                String url = "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Wait.html";// "/Your/Path/to/Wait.html"        dr.get(url);        //注释掉原来的        /*WebDriverWait wait = new WebDriverWait(dr,10);        wait.until(new ExpectedCondition
(){ @Override public WebElement apply(WebDriver d) { return d.findElement(By.id("b")); }}).click();*/ dr.findElement(By.id("b")).click(); WebElement element = dr.findElement(By.cssSelector(".red_box")); ((JavascriptExecutor)dr).executeScript("arguments[0].style.border = \"5px solid yellow\"",element); }}
 

两者选其一,第二种看起来一劳永逸。

 

转载于:https://www.cnblogs.com/ysjt/p/6564808.html

你可能感兴趣的文章
eclipse导入tomcat 8.0x源码
查看>>
shell脚本——爬取域名一级页面元素并判断其可缓存性
查看>>
Linux平台下代理服务器的实现(squid)
查看>>
简单的tab切换
查看>>
yii中文显示
查看>>
四层和七层负载均衡
查看>>
2016清单
查看>>
从一个多层嵌套循环中直接跳出(先想想自己代码设计的是否合理)
查看>>
linux升级内核
查看>>
安卓仿微信右上角弹出菜单窗口
查看>>
PVS让存储颤抖,系列博文之三:PVS的写缓存新技术之Win7桌面实测篇
查看>>
Java控制车速
查看>>
传入含中文的字符串 返回中文首字母
查看>>
thinkphp5 下 Linux 定时任务
查看>>
IOS 动画组
查看>>
数据库模型设计——关系的实现,主键的设计
查看>>
webistrano的安装方法和一些用法
查看>>
Memcache集群高可用方案
查看>>
mysql数据据存储引擎InnoDB和MyISAM的优势及区别
查看>>
PowerShell中iso8601格式日期和DateTime对象互转实例
查看>>