前言

在自动化测试中,我们经常会碰到编写脚本过程中操作某个元素的时候, 需要等待页面加载完成后,才能对元素操作,否则会报错,提示页面元素不存在异常,我们需要等待元素加载完成后,
才能继续操作,而Selenium为我们提供了对应的等待方法,来判断元素是否存在。

下面将用一个例子,针对元素等待操作做逐一讲解

实际案例

场景:点击【创建div】按钮,3秒后,页面会出现一个绿色的div块,同时显示文字“我是div,我出现了,哈哈!”,我们需要代码去判断这个div是否存在, 然后高亮,并正常显示文字。

被测html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>等待练习案例</title>
</head>
<style type="text/css">
#green_box {
background-color: chartreuse;
width: 400px;
height: 200px;
border: none;
}
</style> <script type="application/javascript">
function wait_show() {
setTimeout("create_div()", 3000);
} function create_div() {
var divElement = document.createElement('div');
divElement.id = "green_box";
var pElement = document.createElement('p');
pElement.innerText = "我是div,我出现了,哈哈!";
document.body.appendChild(divElement);
divElement.appendChild(pElement);
}
</script>
<body>
<button onclick="wait_show()">创建div</button>
</body>
</html>

  

1、强制等待

强制等待,就是硬等待,使用方法Thread.sleep(int sleeptime),使用该方法会让当前执行进程暂停一段时间(你设定的暂停时间)。弊端就是,你不能确定元素多久能加载完全,如果两秒元素加载出来了,你用了30秒,造成脚本执行时间上的浪费。

具体示例代码如下:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; public class TestWaitDemo { WebDriver driver;
@BeforeClass
public void beforeClass(){
System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe");
driver = new ChromeDriver();
} @Test
public void testByThread() {
//打开测试页面
driver.get("file:///C:/Users/Administrator/Desktop/waitDemo.html");
driver.manage().window().maximize();
driver.findElement(By.id("wait")).click();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//获得div块级元素
WebElement element = driver.findElement(By.id("green_box"));
//获取该元素css样式中background-color属性值
String cssValue = element.getCssValue("background-color");
//输出属性值
System.out.println("cssValue: "+cssValue);
} @AfterClass
public void afterClass(){
driver.quit();
}
}

2、页面等待

有时候我们打开一个网页,网页本身加载速度就比较慢,只能等网页完全加载完毕,才能执行操作,那么就可以用pageLoadTimeout(pageLoadTime,TimeUnit.SECONDS)这个方法,如在设定时间内,网页还没有还没完全加载就会报错,剩下的时间将不再等待。

具体示例代码如下:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; import java.util.concurrent.TimeUnit; public class TestWaitDemo { WebDriver driver;
@BeforeClass
public void beforeClass(){
System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe");
driver = new ChromeDriver();
} @Test
public void testByPageLoad() {
//打开测试页面
driver.get("file:///C:/Users/Administrator/Desktop/waitDemo.html");
//设置等待时间为3秒,如果3秒页面没有全部加载出来,就会报错,如果小于3秒就全部加载出来了,剩下的时间将不再等待,继续下一步操作
driver.manage().timeouts().pageLoadTimeout(3, TimeUnit.SECONDS);
driver.manage().window().maximize();
} @AfterClass
public void afterClass(){
driver.quit();
}
}

3、隐式等待

WebDriver 提供了三种隐性等待方法:

  • implicitlyWait

识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement 异常。

  • setScriptTimeout

异步脚本的超时时间。WebDriver 可以异步执行脚本,这个是设置异步执行脚本,脚本返回结果的超时时间。

  • pageLoadTimeout

页面加载时的超时时间。因为 WebDriver 会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么 WebDriver 就会抛出异常。

隐式等待(implicit),方法implicitlyWait(long time, TimeUnit.SECONDS),即全局设置,对整个driver都有作用,如在设定时间内,特定元素没有加载完成,则抛出异常,如果元素加载完成,剩下的时间将不再等待。

具体示例代码如下:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; import java.util.concurrent.TimeUnit; public class TestWaitDemo { WebDriver driver;
@BeforeClass
public void beforeClass(){
System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe");
driver = new ChromeDriver();
} @Test
public void testByImplicitlyWait() {
//打开测试页面
driver.get("file:///C:/Users/Administrator/Desktop/waitDemo.html");
//设置等待时间为3秒,如果3秒元素没有加载出来,就会报错,如果小于3秒元素加载出来了,剩下的时间将不再等待,继续下一步操作
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.findElement(By.id("wait")).click();
//获得div块级元素
WebElement element = driver.findElement(By.id("green_box"));
//获取该元素css样式中background-color属性值
String cssValue = element.getCssValue("background-color");
//输出属性值
System.out.println("cssValue: "+cssValue);
} @AfterClass
public void afterClass(){
driver.quit();
}
}

4、显式等待

显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件等到为止,才会继续执行后续操作,等不到,就一直等,除非在规定的时间之内都没找到,那么就抛出异常了

方法一:

具体代码如下:

package com.brower.demo;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; public class TestWaitDemo { WebDriver driver; @BeforeClass
public void beforeClass() {
System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe");
driver = new ChromeDriver();
} @Test
public void testByShowWaiting() {
//打开测试页面
driver.get("file:///C:/Users/Administrator/Desktop/waitDemo.html");
driver.manage().window().maximize();
driver.findElement(By.id("wait")).click();
/**
*等待时间为3秒,WebDriverWait默认每500ms就调用一次ExpectedCondition直到定位到div,如果3秒内div显示出来,则继续下一步,
* 如果超过3秒没有显示出来,那么则until()会抛出org.openqa.selenium.TimeoutExceptionn异常
*/
WebDriverWait wait = new WebDriverWait(driver, 3);
//元素是否存在,如果超过设置时间检测不到则抛出异常。
wait.until(new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
//重写方法
return driver.findElement(By.id("green_box"));
}
});
//获得div块级元素
WebElement element = driver.findElement(By.id("green_box"));
//获取该元素css样式中background-color属性值
String cssValue = element.getCssValue("background-color");
//输出属性值
System.out.println("cssValue: " + cssValue);
} @AfterClass
public void afterClass() {
driver.quit();
}
}

方法二

示例代码如下:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; public class TestWaitDemo { WebDriver driver; @BeforeClass
public void beforeClass() {
System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe");
driver = new ChromeDriver();
} @Test
public void testByShowWaiting() {
//打开测试页面
driver.get("file:///C:/Users/Administrator/Desktop/waitDemo.html");
driver.manage().window().maximize();
driver.findElement(By.id("wait")).click();
/**
*等待时间为3秒,WebDriverWait默认每500ms就调用一次ExpectedCondition直到定位到div,如果3秒内div显示出来,则继续下一步,
* 如果超过3秒没有显示出来,那么则until()会抛出org.openqa.selenium.TimeoutExceptionn异常
*/
WebDriverWait wait = new WebDriverWait(driver, 3);
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("green_box")));
//获得div块级元素
WebElement element = driver.findElement(By.id("green_box"));
//获取该元素css样式中background-color属性值
String cssValue = element.getCssValue("background-color");
//输出属性值
System.out.println("cssValue: " + cssValue);
} @AfterClass
public void afterClass() {
driver.quit();
}
}

显式等待使用ExpectedConditions类中自带方法, 可以进行显式等待的判断,常用的判断条件如下表:

等待的条件方法名称 描述
elementToBeClickable(By locator) 页面元素是否在页面上可用和可被单击
elementToBeSelected(WebElement element) 页面元素处于被选中状态
presenceOfElementLocated(By locator) 页面元素在页面中存在
textToBePresentInElement(By locator) 在页面元素中是否包含特定的文本
textToBePresentInElementValue(By locator, java.lang.String text) 页面元素值
titleContains(java.lang.String title)   标题 (title)

显式等待常跟以下三种方法一起使用,用来判断元素

  • isEnable()    检查元素是否被启用
  • isSelected()   检查元素是否被选中
  • isDisplay()     检查元素是否可见

运行结果

selenium Java中常见等待的几种形式的更多相关文章

  1. Java中常见的5种WEB服务器介绍

    这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的 ...

  2. java中常见的六种线程池详解

    之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...

  3. java中for循环的6种写法

    有些写法上的说明写的过于武断,可能有很多不当之处,仅供参考.   package ForLoop; import java.util.ArrayList; import java.util.Itera ...

  4. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  5. Java 中的等待唤醒机制透彻讲解

    线程的状态 首先了解一下什么是线程的状态,线程状态就是当线程被创建(new),并且启动(start)后,它不是一启动就进入了执行状态(run),也不是一直都处于执行状态. 这里说一下Java 的Thr ...

  6. Java中Compareable和Comparator两种比较器的区别

    Java中Compareable和Comparator两种比较器的区别 参考原文链接:https://www.cnblogs.com/ldy-blogs/p/8488138.html 1.引言 在ja ...

  7. Java中HashMap遍历的两种方式

    Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...

  8. JAVA中集合输出的四种方式

    在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public stat ...

  9. Java中常见的Exception种类

    Java中常见的Exception种类 1.ClassNotFoundException 2.IOException 3.NoSuchFieldException 4.NoSuchMethodExce ...

随机推荐

  1. android 写文件到sd卡问题小记

    android 写文件到sd卡问题小记 事情是这样子的.... 这天我开始编写项目调试工具,高大上不?-----其实就是记录实时网络请求和崩溃日志相关等的小工具(此处一个会心的微笑). 然后我是这样写 ...

  2. Spring注解?啥玩意?

    目录 基础概念:@Bean 和 @Configuration 使用AnnotationConfigApplicationContext 实例化Spring容器 简单的构造 使用register注册IO ...

  3. css之vw布局

    vw,vh是视口单位,是相对视口单位,与百分百布局不一样的是,百分百是相对于父及元素,而vw布局是相对与窗口. 而rem布局是要与js一起配合 // 以iphone6设计稿 @function px2 ...

  4. java 字节码指令集

    This is a list of the instructions that make up the Java bytecode, an abstract machine language that ...

  5. Google浏览器插件之闪存过滤器

    一件很有意思的事情引发的无聊尝试. 博客园有个很有趣的功能,就是闪存,翻阅到07年园长对闪存的定义:      记录一闪而过的想法,高兴或者不高兴都可以发一下.我用这个一直以来的想法就是,想到点啥发点 ...

  6. TCP/IP 第三章

    1,ip协议不可靠.无连接特性介绍 不可靠:计算机A往计算机B发送数据报1,若途径的路由器缓存已满,或者ttl(time to live 生存周期)到了,则路由器直接丢弃数据包1,并产生icmp数据包 ...

  7. JIRA7.10迁移

    1.准备环境 系统环境:Centos7.3  防火墙和Selinux管闭 [root@localhost ~]# useradd jira [root@localhost ~]# yum instal ...

  8. [python] 安装TensorFlow问题 解决Cannot uninstall 'wrapt'. It is a distutils installed project

    cmd安装 pip install tensorflow 1.遇到了 ERROR: Cannot uninstall 'wrapt'. It is a distutils installed proj ...

  9. 思维导图xmind的使用方法

    什么是Xmind Xmind是一款简单好用的思维导图软件,除了可以轻松绘制基本逻辑图,还支持组织结构图(竖直).树状图(水平+竖直).思维导图(辐射).鱼骨图.二维图(表格)模型.免费版可以把思维导图 ...

  10. python面试题(二)字符串常用函数

    今天在微信的公众号上看到了一遍python学习开发的文章,里面有一些python的面试题,碰巧最近python不知道学什么了,索性学一下这篇文章啊!!先写一下一些字符串的常用函数.(ps:本人太菜,若 ...