Selenium+java - 中常见等待的几种形式

前言

在自动化测试中,我们经常会碰到编写脚本过程中操作某个元素的时候, 需要等待页面加载完成后,才能对元素操作,否则会报错,提示页面元素不存在异常,我们需要等待元素加载完成后,
才能继续操作,而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;
 org.openqa.selenium.WebDriver;
 org.openqa.selenium.WebElement;
 org.openqa.selenium.chrome.ChromeDriver;
 org.testng.annotations.AfterClass;
 org.testng.annotations.BeforeClass;
 org.testng.annotations.Test;

public class TestWaitDemo {

    WebDriver driver;
    @BeforeClass
    void beforeClass(){
        System.setProperty("webdriver.chrome.driver","driver/chromedriver.exe");
        driver = new ChromeDriver();
    }

    @Test
     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
     afterClass(){
        driver.quit();
    }
}

2、页面等待

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

具体示例代码如下:

 java.util.concurrent.TimeUnit;

 testByPageLoad() {
        设置等待时间为3秒,如果3秒页面没有全部加载出来,就会报错,如果小于3秒就全部加载出来了,剩下的时间将不再等待,继续下一步操作
        driver.manage().timeouts().pageLoadTimeout(3,TimeUnit.SECONDS);
        driver.manage().window().maximize();
    }

    @AfterClass
     afterClass(){
        driver.quit();
    }
}

3、隐式等待

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

  • implicitlyWait

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

  • setScriptTimeout

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

  • pageLoadTimeout

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

 

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

具体示例代码如下:

 testByImplicitlyWait() {
        打开测试页面
        driver.get("file:///C:/Users/Administrator/Desktop/waitDemo.html"设置等待时间为3秒,如果3秒元素没有加载出来,就会报错,如果小于3秒元素加载出来了,剩下的时间将不再等待,继续下一步操作
        driver.manage().timeouts().implicitlyWait(3 afterClass(){
        driver.quit();
    }
}

4、显式等待

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

方法一:

具体代码如下:

package com.brower.demo;

 org.openqa.selenium.support.ui.ExpectedCondition;
 org.openqa.selenium.support.ui.WebDriverWait;
 TestWaitDemo {

    WebDriver driver;

    @BeforeClass
     beforeClass() {
        System.setProperty("webdriver.chrome.driver",1)"> testByShowWaiting() {
        /**
         *等待时间为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")); } }); 输出属性值 System.out.println("cssValue: " + cssValue); } @AfterClass afterClass() { driver.quit(); } }

方法二

示例代码如下:

 org.openqa.selenium.support.ui.ExpectedConditions;
);
        wait.until(ExpectedConditions.presenceOfElementLocated(By.id("green_box")));
         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()     检查元素是否可见

运行结果

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


转载地址:https://www.cnblogs.com/mini-monkey/p/12104821.html前言有时候测试过程中会遇到日期控件场景,这时候需要特殊处理,下文以12306网站为例1.处理方式通常是通过js去除只读属性(2种方法),然后通过send_keys重新写值fromtimeimportsleepdriver=webdriver.Chrome()dr
web自动化测试过程中页面截图相对比较简单,可以直接使用selenium自带的方法save_screenshot()。示例:对百度首页整个页面进行截图。#coding=utf-8fromseleniumimportwebdriverd=webdriver.Chrome()d.get('https://www.baidu.com/')#对页面进行截图d.save_screensh
目录前言一、Selenium简介二、浏览器驱动1.浏览器驱动参考2.Windows下载Chrome驱动三、代码实现1.新建控制台项目WeatherWebCrawler2.选择.NET6.03.安装NuGet包4.将下载好的驱动放到项目生成目录下5.编写代码四、完整代码总结前言提示:爬虫本身并不违法,所有爬虫都
一、iframe的含义:iframe是HTML中框架的一种形式,在对界面添加嵌套另一个页面时可以使用iframe。做ui自动化的时候,元素定位不到的一个很重要原因就是页面存在iframe。Iframe可以比喻成一道门,打开这道门才能进入屋子里。二、怎么判断页面上存在iframe?谷歌浏览器F12(或者右
转载请注明出处❤️作者:测试蔡坨坨原文链接:caituotuo.top/d59b986c.html你好,我是测试蔡坨坨。众所周知,Selenium在2021年10月13号发布了Selenium4,目前最新的版本应该是Selenium4.4.0。以前一直用的Selenium3,那么Selenium4相对Selenium3对我们做自动化测试来说有哪些需要注意的
'''##**认识selenium**​**下载:pipinstallselenium**​官方文档:https://selenium-python.readthedocs.io/###什么是selenium?​selenium是一套完整的web应用程序测试系统,包含了测试的录制(seleniumIDE),编写及运行(SeleniumRemoteControl)和测试的并行处理(SeleniumGr
importtimefromselenium.webdriver.support.waitimportWebDriverWaitfromseleniumimportwebdriverfromselenium.webdriver.common.byimportBydriver=webdriver.Chrome(r"D:\百分浏览器\CentBrowser\Application\chromedriver.exe");driver.get("htt
前言:当鼠标悬停在隐藏文本内容上时,显示所有内容。场景案例:百度首页,要选择‘高级搜索’,先得把鼠标放在‘设置上’F12-在页面中搜索‘高级搜索’,找到‘高级搜索’文本,鼠标放到‘设置’上,display的值变为block;鼠标不放上去之前是none,即不可见元素。隐藏的元素操作,会出现报
selenium中的ActionChains初始化时传入driverActionChains中存储的所有行为click(on_element=None)——单击鼠标左键click_and_hold(on_element=None)——点击鼠标左键,不松开context_click(on_element=None)——点击鼠标右键double_click(on_element=None)——双击鼠标
介绍常见的表单元素 Input,button,checkbox,select。表单使用表单标签(<form>)定义。例如:<form><input/></form> 保存HTML到本地进行操作<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title&g
1、处理定位报错的问题判断该元素存在,再输入。判断该元素不存在,抛出异常。依然是通过EC这个模块。2、判断是否存在邮箱地址,存在,再操作。就不用担心元素不存在,程序报错。3、判断传入的元素是否可见,是否在显示范围内。还是要先找元素但这样找,只能顺利的执行一次。fr
1、使用国内的镜像地址https:/egistry.npmmirror.com/binary.html?path=chromedriver/ 2、通过simulation模拟用户点击来下载(只贴出部分方法)#!/usr/bin/envpython#-*-coding:utf-8-*-importosimportplatformimportsignalimporttimeimportallureimport
案例描述https://www.healthsmart.com.hk/hs-home/#!/link/home这个网页你手工打开的时候你会发现一直处于加载中,一定时间后才好。我们的需求是点击会员,弹出菜单,进行下一步操作,如果没有加载好是点不了的(业务特点)。我们来看看代码怎么写示例代码1:时间去哪里了fromselen
  分析了好几个小时淘宝的登陆,对其反爬虫方案有了点思路,先记录一下,后面会持续进行分析。当然想要玩更高级的Python爬虫首先你要把基础打牢,这里小编准备了一份Python爬虫入门资料,进群:700341555即可免费领取!  众所周知目前使用selenium打开浏览器访问淘宝,不管你是手动
在python+selenium中经常会遇到找到的元素不唯一,导致定位到的元素不是预期的或者定位不到元素解决方法:只要在页面进行确认找到的元素唯一后,再进行操作 页面确认方法:1、通过html中检索功能确认进入开发者模式:点击右上角三个点-->选则search进行查找或
引入       使用Scrapy框架爬取某些网站的数据时,往往会页面动态加载数据的情况。如果是直接使用Scrapy对其url发起请求,是绝对获取不到动态加载的数据的。但是通过观察我们会发现,通过浏览器对其url发起请求则会加载出对应的动态数据。那么,如果我们想要在Scrapy中获取
孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1 (完整学习过程屏幕记录视频地址在文末) 要模拟进行浏览器操作,只用requests是不行的,因此今天了解到有专门的解决方案:selenium模块及与火狐浏览器的配合使用。一、环境配置(一)、安装selenium模块pipinstallse
selenium确认进入了预期页面在自动化操作中,浏览器每次进入一个新的需要,都需要确认该页面是否打开或打开的页面是否是预期的页面需要进行确认页面后方可进行下一步操作确认页面有很多中方法,像笔者所在项目的中每个页面都有一个固定属性(ng-page=‘xxx’)来确认,所以确认页面的时候