Selenium用法详解【设置元素等待】【JAVA爬虫】

news2025/1/17 6:14:15

简介

本文主要介绍如何使用java代码利用Selenium操作浏览器,某些网页元素加载慢,如何操作元素就会把找不到元素的异常,此时需要设置元素等待,等待元素加载完,再操作。

设置元素等待

很多页面都使用 ajax 技术,页面的元素不是同时被加载出来的,为了防止定位这些尚在加载的元素报错,可以设置元素等来增加脚本的稳定性。webdriver 中的等待分为 显式等待 和 隐式等待。

显式等待

显式等待:设置一个超时时间,每个一段时间就去检测一次该元素是否存在,如果存在则执行后续内容,如果超过最大时间(超时时间)则抛出超时异常(TimeoutException)。显示等待需要使用 WebDriverWait,同时配合 until 或 not until 。下面详细讲解一下。


import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;


/**
 * @author Lenovo
 */
public class SeleniumDemo {
    private final static String webDriver = "webdriver.chrome.driver";
    private final static String webDriverPath ="E:\\chromedriver\\chromedriver.exe";

    public static void main(String[] args) throws InterruptedException {
        System.setProperty(webDriver, webDriverPath);
        WebDriver driver= new ChromeDriver();
        //博客主页
        driver.get("https://blog.csdn.net/weixin_40986713");
        WebElement element=driver.findElement(By.className("submit"));
        long start=System.currentTimeMillis();
        //等待5秒
        WebDriverWait shortWait = new WebDriverWait(driver, 5);
        //5秒内元素加载出来就执行点击
        shortWait.until(ExpectedConditions.elementToBeClickable(element)).click();
        //忽略找不到元素异常
        shortWait.ignoring(NoSuchElementException.class);
        System.out.println("耗时 "+(System.currentTimeMillis()-start)+" ms");
    }
}
  • until 指定预期条件的判断方法,在等待期间,每隔一段时间调用该方法,判断元素是否存在,直到元素出现。

  • ignoring 指定忽略的异常,如果设定的执行等待超时的时间段内,忽略指定的异常,让程序继续进行。

隐式等待

隐式等待也是指定一个超时时间,如果超出这个时间指定元素还没有被加载出来,就会抛出 NoSuchElementException 异常。

除了抛出的异常不同外,还有一点,隐式等待是全局性的,即运行过程中,如果元素可以定位到,它不会影响代码运行,但如果定位不到,则它会以轮询的方式不断地访问元素直到元素被找到,若超过指定时间,则抛出异常。

使用 driver.manage().timeouts().implicitlyWait() 来实现隐式等待,使用难度相对于显式等待要简单很多。

示例:打开个人主页,设置一个隐式等待时间 5s,通过 id 定位一个不存在的元素,最后打印 抛出的异常 与 运行时间。



import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.concurrent.TimeUnit;

/**
 * @author Lenovo
 */
public class SeleniumDemo {
    private final static String webDriver = "webdriver.chrome.driver";
    private final static String webDriverPath ="E:\\chromedriver\\chromedriver.exe";

    public static void main(String[] args) throws InterruptedException {
        System.setProperty(webDriver, webDriverPath);
        WebDriver driver= new ChromeDriver();
        //博客主页
        driver.get("https://blog.csdn.net/weixin_40986713");
        //设置全局隐式等待
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        long start=System.currentTimeMillis();
        try {
            driver.findElement(By.className("tarzan"));
        }catch (Exception e){
            System.out.println(e);
            System.out.println("耗时 "+(System.currentTimeMillis()-start)+" ms");
        }
    }
}

代码运行到 driver.findElement(By.className("tarzan"));这句之后触发隐式等待,在轮询检查 5s 后仍然没有定位到元素,抛出异常。

强制等待

用java代码强制当前正在执行的线程休眠(暂停执行)

使用 time.sleep() 强制等待,设置固定的休眠时间,对于代码的运行效率会有影响。

以上面的例子作为参照,将 隐式等待 改为 强制等待。


import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;


/**
 * @author Lenovo
 */
public class SeleniumDemo {
    private final static String webDriver = "webdriver.chrome.driver";
    private final static String webDriverPath ="E:\\chromedriver\\chromedriver.exe";

    public static void main(String[] args) throws InterruptedException {
        System.setProperty(webDriver, webDriverPath);
        WebDriver driver= new ChromeDriver();
        //博客主页
        driver.get("https://blog.csdn.net/weixin_40986713");
        long start=System.currentTimeMillis();
        //等待5s
        Thread.sleep(5000);
        try {
            driver.findElement(By.className("tarzan"));
        }catch (Exception e){
            System.out.println(e);
            System.out.println("耗时 "+(System.currentTimeMillis()-start)+" ms");
        }
    }
}

值得一提的是,对于定位不到元素的时候,从耗时方面隐式等待和强制等待没什么区别。但如果元素经过 2s 后被加载出来,这时隐式等待就会继续执行下面的代码,但 sleep还要继续等待 3s。

总结

推荐使用的隐式等待,也就是implicitlyWait。

理由:

使用implicitlyWait或者明确等待(explicitly wait),方法参数是等待的最大时长。

也就是只要一找到元素,就会立刻执行下一行代码,不会强制等待参数里设置的时间。

而第三种(线程休眠)则不同,会强制等待设置的时间。设想一下,如果你的工程有好几百个case,

需要等待的元素都采用第三种,会大大加长所有case执行的时间,而你又急着要report,岂不是很惨。

使用implicitlyWait,webdriver会自动应用到case中的所有element中。在启动浏览器(driver.get)之后设置上,这样就不用针对某个元素去设置了,简直太方便了,不过有些特殊的元素,确实等待时间较长的,可以再采用explicit wait。

如果implicitlyWait和explicitly wait都在用在代码里,那么最大等待时间不是两个时间的叠加,而是取最大值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python - Flask 整合 UEditor

1. 引言 UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本 web 编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码 官方文档地址:http://fex.baidu.com/ued…

软件构造与与体系结构习题

软件构造与与体系结构习题第一章第二章第三章第一章 1.下面关于类的描述正确的是?A A、类是一组相似事物的统称。 B、一个事物可以称为一类。 C、两个完全相同的事物可以称为一类。 D、“奥巴马”和“特朗普”可以统称为“奥巴马”。 解析: 类&am…

【Python笔记】课时01:Python3+Pip环境配置(python安装)

1. 不同环境下安装python windows(不好安装相关python包,不推荐)anaconda(科学计算环境 python 相关python包)(推荐)linux(如 ubuntu)macos 2.1. windows 安装 pytho…

前端性能优化(五):webpack构建优化

目录 一:webpack的优化配置 1.1.Tree-shaking 1.2.JS压缩 1.3.作用域提升 1.4.Babel 优化配置 二:webpack的依赖优化 2.1.noParse(不解析) 2.2.DllPlugin 三:webpack 细节优化 四:webpack的资源压…

Linux和windows文件互传

文章目录一、方法1:设置共享剪切版二、方法2:使用FileZilla软件1.开启 Ubuntu 下的 FTP 服务2.查看Ubuntu的ip地址2.windows安装FileZilla注意一、方法1:设置共享剪切版 在Ubuntu20版本中好像已经自动实现 本人使用的是旧版18.4&#xff0c…

【每日十分钟前端】基础篇21,为什么HTTPS更安全(SSL原理)、单行/多行文本溢出的省略样式、DOM常见的操作有哪些

1、[HTML]为什么HTTPS更安全(SSL原理):对称加密、非对称加密、摘要、数字签名、数字证书。 2、[CSS]单行/多行文本溢出的省略样式。 3、[JS]DOM常见的操作有哪些? 1、[HTML]为什么HTTPS更安全(SSL原理): 对称加密:协商密钥对数据…

异常检测实战应用案例精讲-【工具篇】时序异常检测TODS

前言 时间序列异常值检测旨在识别数据中意外或罕见的实例。作为数据分析最重要的任务之一,异常值检测在时间序列数据上有多种应用,例如欺诈检测、故障检测和网络安全攻击检测。例如,雅虎 和微软 已经建立了自己的时间序列异常值检测服务来监控他们的业务数据并触发异常值…

Hudi、Iceberg底层索引Z-Order

目录 第一部分 数据库领域的Z-Order 1.1 最左匹配原则 1.2 Z-Order动机 1.3 OLTP 1.4 OLAP 第二部分 Z-Order效率分析 2.1 按照A进行查询 2.2 按照B进行查询 2.3 总结 第三部分 Z-Order缺陷 第四部分 总结及建议 参考文章 Z-Order最早是1966提出的一项将多维数据映…

数据分析-深度学习 Day1

目录:第一节 机器学习&深度学习介绍第二节 机器学习攻略一、机器学习的框架二、模型训练攻略三、针对Optimization Issue的优化,类神经网络训练不起来怎么办(一) 局部最优点和鞍点(二) 批处理和momentum(三) 自动调节学习率Learning rate(四) 损失函…

cmake的常用语法

cmake 的注释 # 注释 #[[大段注释 第二行注释 第三行注释]]cmake的log -message cmake messagemessage(arg1 arg2 arg3 arg4) # 会自动连起message 多级别输出 message(FATAL_ERROR,"abc") # 最严重的错误,直接停止执行 message(SEND_ERROR,"aba…

NOP+终于来了,看看蔚来随NOP+释放的数据和思考

1. 行驶数据 ADAS功能累计用户行驶里程4.9亿公里;NT1的NOP功能累计行驶2.3亿公里;NT2的Pilot功能累计行驶了1700万公里。2. 统一辅助驾驶软件架构原来NOP将直路行驶和匝道作为两个场景开发,场景分割思路了城区和低速就变得无穷无尽。新NOP是以…

K_A11_001 基于STM32等单片机驱动DHT11 串口与OLED0.96双显示

K_A11_001 基于STM32等单片机驱动DHT11 串口与OLED0.96双显示一、资源说明二、基本参数1.参数2.引脚说明三、驱动说明时序对应程序:四、部分代码说明1、接线说明1.1、STC89C52RCDHT11模块1.2、STM32F103C8T6DHT11模块五、基础知识学习与相关资料下载六、视频效果展示与程序资料…

锁的分类,以及锁升级原理

1. 前言 锁在并发编程中非常重要,但是锁的种类有点多。这边文章的目的就是为了梳理锁的分类以及 锁升级的原理。 2. 锁的分类 种类\名称synchronizedReentrantLockReentrantReadWriteLock可重入锁√√√不可重入锁乐观锁①①①悲观锁√√√公平锁√√非公平锁√√√…

javaweb-Servlet基本使用

1, Servlet 1.1 简介 Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。 使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容。 Servlet是JavaEE规范之一,其实就是一个接口&#xff0c…

关于分组函数(聚合函数)

分组函数:也叫"多行处理函数"或"聚合函数" (特点:输入多行,最终输出一行) 用于对表中指定字段下的内容进行统计的函数。 - count() 计数(返回指定字段下内容不为null的数…

一文看懂Linux内存管理:虚拟内存、用户空间、内核空间、用户态、内核态、IPC通信原理

目录 一、虚拟内存地址 1.为什么要有虚拟内存地址? 2.虚拟地址好处 二、用户空间和内核空间 1.概念 2.用户态和内核态 3.IPC通信原理 一、虚拟内存地址 1.为什么要有虚拟内存地址? 因为如果CPU直接访问物理内存,那如果两个进程写入一…

MSF客户端渗透

利用Acrobat Reader漏洞执行payload ● 构造PDF文件 exploit/windows/fileformat/adobe_utilprintf仅支持8.1.2软件版本和XP系统; ● 构造恶意网站 exploit/windows/browser/adobe_utilprintf#同理,浏览器上运行pDF● 之后可以通过Meterpreter进行下一…

克罗格 Kroger EDI需求分析及注意事项

项目背景 Kroger(美国克罗格公司)是具有百年历史的名店之一。它虽然历史悠久,但并没有被变化的世界所淘汰,相反,它围绕着市场消费需求的变化,不断地进行创新,创造了世界零售百年史上的若干个第…

Linux物理内存管理:page、zone、node

基本概念页:struct page ,如下图所示,x86架构下一般为4K为大小分区:struct zone ,如下图所示,x86架构下分为三个区 ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM内存节点:struct node。对于一个简单的嵌入…

杭州社保解读截止2023

杭州社保新政规定的社保内容以及缴费比例是怎样的? 1、养老保险:单位,14%;个人,8%。 2、医疗保险:单位,9.9%;个人,2% 。 3、失业保险:单位,0.5%;个人,0.5%。 4、工伤…