2023.8.25 关于 Selenium 常用 API 详解

目录

引言

打开页面

查找页面元素

 输入文本 

点击操作

提交操作

清除文本 

获取文本和属性值

​编辑

选择多个元素

获取页面标题和URL

等待操作

浏览器操作

多层框架定位

窗口操作

屏幕截图

下拉框元素选择操作

​编辑

执行脚本 

文件上传 


引言

本文讲的所有API均基于谷歌浏览器驱动,即 ChromeDriver 类中的 API

WebDriver webDriver = new ChromeDriver();

打开页面

webDriver.get("https://www.baidu.com");
  • 在 get 方法中输入想打开的网址,即可打开该网址页面

查找页面元素

//        找到百度搜索输入框
//        这是通过 CSS 选择器进行选择WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
//        这是通过 xpath 选择器进行选择WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));

CSS 选择语法(效率比 xpath 高)

id选择器:#id 

  • By.cssSelector("#kw")

类选择器:.class

  •  By.cssSelector(".s_ipt")

标签选择器:标签名

  •   By.cssSelector("input")

后代选择器:父级选择器 子级选择器

  •    By.cssSelector("form input")

XPath 选择语法

绝对路径:(不常用)

  •  By.xpath("/html/head/title")

相对路径:

相对路径+索引

  •   By.xpath("//form/span[1]/input")
相对路径+属性值
  •   By.xpath("//input[@class="s_ipt"]")
相对路径+通配符
  •    By.xpath("//*[@id="su"]")     

注意: ' * ' 符号 代表通配符 该示例表示任何一个标签其属性值 id 为 su 就会被选中

相对路径+文本匹配

  •     By.xpath("//a[text()="新闻"]")     

简捷方法:

通过在浏览器页面 按 F12 进行下面操作,直接获取到任意标签的 CSS 路径、XPath 路径

 

 输入文本 

//        找到百度搜索输入框
//        这是通过 Css 选择器进行选择
//        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
//        这是通过 xpath 选择器进行选择WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
//        在搜索框中输入element.sendKeys("不孕不育");
  • sendKeys 方法可对你选中的元素进行输入文本,但是仅适用于文本文字和内容可以编辑的元素

点击操作

//        找到百度一下按钮 并 点击webDriver.findElement(By.cssSelector("#su")).click();
  • 定位到选中元素使用 click 方法 即为鼠标的点击操作

提交操作

//        点击百度一下按钮webDriver.findElement(By.cssSelector("#su")).submit();
  • 定位到选中元素使用 submit 方法 即为按下 Enter 键效果一样
  • 不推荐使用 submit 方法,click 方法能完全代替 submit 方法

注意:

  • 选中元素在 from 标签中,使用 submit 方法 实现的效果和 click 方法 是一样的
  • 选中元素放在 非 from 标签中,使用 submit() 会报错

清除文本 

//        清空百度搜索输入框中的数据webDriver.findElement(By.cssSelector("#kw")).clear();
  • 定位到选中元素使用 clear 方法 即可清空其文本内容

获取文本和属性值

//        获取 选中标签的文本内容String text = webDriver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(3) > a > span.title-content-title")).getText();
  • 定位到选中元素使用 getText 方法 即可获取到该元素的文本内容

 

//        获取 属性名为 value 的值String button_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
  • 定位到选中元素使用 getAttribute 方法 即可获取到该元素 相应属性名 的值
  • 除了 value 属性值 也可获取 id 属性值、class 属性值、type 属性值 等等

选择多个元素

示例:自动选择 checkbox 类型的元素

List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));for (int i = 0; i < webElements.size(); i++) {
//            如果每个元素 type 值等于 checkbox 进行点击if(webElements.get(i).getAttribute("type").equals("checkbox")){webElements.get(i).click();}}
  • 使用 findElements 方法 获取到标签为 input 的元素集合

获取页面标题和URL

//        打开百度首页webDriver.get("https://www.baidu.com");
//        获取 get 方法所打开页面的 URLString url = webDriver.getCurrentUrl();
//        获取 get 方法所打开页面 标签为 title 的值String title = webDriver.getTitle();
  • 使用 getCurrentUrl 方法 即可获取 get 方法打开页面的 URL 值
  • 使用 getTitle 方法 即可获取 get 方法打开页面标签为 title 的值

等待操作

引言

  • 程序执行速度远快于浏览器渲染速度
  • 当自动化打开某一页面且需要选中该页面某一元素时
  • 情况1:在选择元素时,页面渲染完成,成功选中该元素
  • 情况2:在选中元素时,页面还未完全渲染(被选中元素还未加载出来),此时选择该元素时便会报错!
  • 为了避免 情况2 的发生,我们可以引入等待操作

强制等待

//        这是强制等待 3秒sleep(3000); 
  • 当自动化程序代码执行到 sleep 方法时,便会强制等待自定义时长,继而执行后面代码

隐式等待

//        创建驱动WebDriver webDriver = new ChromeDriver();
//        这是隐式等待 3天webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
//        打开百度首页webDriver.get("https://www.baidu.com");
//        在搜索框输入"不孕不育" webDriver.findElement(By.cssSelector("#kw")).sendKeys("不孕不育");
//        点击百度一下webDriver.findElement(By.cssSelector("#su")).click();
//        退出webDriver.quit();
  • 隐式等待贯穿于 webDriver 的整个生命周期
  • 在自定义时间内反复判断元素是否存在,直到元素能被找到,便停止等待
  • 超出自定义时间还未找到,便会报错
  • TimeUnit.DAYS 代表时间单位 天 ,也有秒、小时、分钟等单位,可自行选择

显式等待

//        显示等待 3秒WebDriverWait wait = new WebDriverWait(webDriver,3000);
//        等待至该元素被选择,才继续执行后面代码wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div > p:nth-child(8)")));
//        等待至是否可以判断该元素的 title 标签为 ”百度一下,你就知道“ 才继续执行后面代码wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
  • 显式等待仅作用于某一条代码
  • 在自定义时间内判断 该条代码 元素是否存在,直到元素能被找到,便停止等待
  • 超出自定义时间还未找到,便会报错
  • 使用 until 方法,来自定义要进行显示等待的代码

浏览器操作

前进操作

//        浏览器前进webDriver.navigate().forward();

后退操作

//        浏览器后退webDriver.navigate().back();

刷新操作

//        浏览器刷新webDriver.navigate().refresh();

多层框架定位

 

//        先进行框架的定位webDriver.switchTo().frame("f1");
//        再进行元素的选择webDriver.findElement(By.cssSelector("body > div > div > a")).click();
  • 在含有多个框架的页面中,我们必须要先对框架进行定位,才能进行相应的元素选择

窗口操作

设置窗口大小

//        浏览器最大化webDriver.manage().window().maximize();
//        浏览器全屏webDriver.manage().window().fullscreen();
//        浏览器窗口设置指定大小 (宽 , 高)webDriver.manage().window().setSize(new Dimension(600,1000));

窗口切换

  • 操作窗口是指被 自动化代码 操作的窗口
  • 最初的操作窗口,是使用 get 方法 打开的窗口
  • 在操作窗口中打开新窗口,该新窗口不会变为操作窗口
  • 我们需用到窗口切换,来切换我们的操作窗口,使新窗口成为被 自动化代码 操作的窗口
  • 当浏览器每打开一个窗口时,会自动给每个窗口进行标识,也被称为 句柄
  • 句柄 是窗口切换操作的关键所在
//        通过 getWindowHandles 获取所有的窗口句柄
//        通过 getWindowHandle 获取 get 方法所打开的页面窗口句柄System.out.println(webDriver.getWindowHandle());Set<String> handles = webDriver.getWindowHandles();String target_handle = "";
//        这里的循环是为了获取到 新窗口 对应的句柄for (String handle:handles) {target_handle = handle;System.out.println("target_handle = " + target_handle);}webDriver.switchTo().window(target_handle);

屏幕截图

1.在 pom.xml 中引入相应依赖

<!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency>

2.截图操作代码

//        屏幕截图操作 OutputType.FILE 表示以文件的形式保存File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
//        把文件存入 自定义路径下 没输入路径时,便是当前项目路径下FileUtils.copyFile(file,new File("E://20230826test.png"));
  • 在保存截图的时候我们可以为文件名加入时间戳,使得每次所得截图的文件名是动态的、不相同的,从而可以避免程序多次生成的截图因文件同名而被覆盖
  • 在有弹窗的情况下使用截图会报错

//        alert 弹窗取消webDriver.switchTo().alert().dismiss();
//        alert 弹窗中加入小林webDriver.switchTo().alert().sendKeys("小林");
//        alert 弹窗确定webDriver.switchTo().alert().accept();
  • 在提示弹窗进行输入文本的输入,在页面上是看不到输入文本的执行效果

下拉框元素选择操作

        WebElement element = webDriver.findElement(By.cssSelector("#ShippingMethod"));Select select = new Select(element);
//        根据下标进行选择 下标从 0 开始select.selectByIndex(3);
//        直接根据值进行选择select.selectByValue("12.51");
  • 先创建出一个 select 对象
  • selectByIndex 方法为下标选择法
  • selectByValue 方法为值选择法

执行脚本 

//        浏览器滚动条滚动((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
  • 先将 webDriver 转化为 JavascriptExecutor 类型
  • 再在 executeScript 方法填入 想执行的 JavaScript 代码,从而进行相应的页面操作

文件上传 

//    先选中 文件上传按钮 再进行上传文件 webDriver.findElement(By.cssSelector("input")).sendKeys("E:\\test.jpg");
  • 在 sendKeys 方法中填入 想要上传文件的 绝对路径

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java属性映射使用MapStruct的坑

目录 1.实体类和映射类只加注解Data 2.将Data换成getter和setter后build 3.那么此时我把getter和setter换成lombok的getter和setter 1.实体类和映射类只加注解Data 映射关系类 这个时候运行 提示源参数中不存在 注意这个文件夹 2.将Data换成getter和setter后build package c…

【C# Programming】编程入门:数组、操作符、控制流

目录 一、数组 1、数组的声明 1.1 一维数组声明&#xff1a; 1.2 多维数组声明&#xff1a; 2、数组的实例化和赋值 2.1 数组在声明时通过在花括号中使用以逗号分隔的数据项对数组赋值&#xff0c; 例如&#xff1a; 2.2 如果在声明后赋值&#xff0c;则需…

【JS案例】JS实现手风琴效果

JS案例手风琴 &#x1f31f;效果展示 &#x1f31f;HTML结构 &#x1f31f;CSS样式 &#x1f31f;实现思路 &#x1f31f;具体实现 1.绑定事件 2.自定义元素属性 3.切换菜单 &#x1f31f;完整JS代码 &#x1f31f;写在最后 &#x1f31f;效果展示 &#x1f31f;HTML…

Java课题笔记~ 综合案例

3.综合案例 3.1 功能介绍 以上是我们在综合案例要实现的功能。除了对数据的增删改查功能外&#xff0c;还有一些复杂的功能&#xff0c;如 批量删除、分页查询、条件查询 等功能 批量删除 功能&#xff1a;每条数据前都有复选框&#xff0c;当我选中多条数据并点击 批量删除 按…

PHP环境配置

1.服务器 简单理解&#xff1a;服务器也是一台计算机&#xff0c;只是比平时用到的计算机在性能上更强大&#xff0c;开发中通常都需要将开发好的项目部署到服务器进行访问&#xff0c;例如&#xff1a;我们可以访问百度、淘宝、京东等&#xff0c;都是因为有服务器的存在&…

【C++】—— 异常处理

前言&#xff1a; 本期&#xff0c;我将给大家讲解的是有关 异常处理 的相关知识&#xff01; 目录 &#xff08;一&#xff09;C语言传统的处理错误的方式 &#xff08;二&#xff09;C异常概念 &#xff08;三&#xff09;异常的使用 1、异常的抛出和捕获 1️⃣ 异常的…

vue使用命令npm install 报错 cb() never called!

一.错误说明,npm本身下载就慢&#xff0c;有可能是网络的问题。 二.解决方案,把npm设置成淘宝镜像后,再重新npm install npm config set registry https://registry.npm.taobao.org 三.还是不行&#xff0c;还会出现同样的问题&#xff0c;那接下来先清理一下npm缓存 npm cache…

工地扬尘监测系统 yolo

工地扬尘监测系统算法能够通过yolo网络框架模型&#xff0c;工地扬尘监测系统算法自动对区域的扬尘、粉尘颗粒进行实时监测识别&#xff0c;并及时进行预警&#xff0c;有效防止扬尘污染。Yolo意思是You Only Look Once&#xff0c;它并没有真正的去掉候选区域&#xff0c;而是…

Arduino程序设计(四)按键消抖+按键计数

按键消抖按键计数 前言一、按键消抖二、按键计数1、示例代码2、按键计数实验 参考资料 前言 本文主要介绍两种按键控制LED实验&#xff1a;第一种是采用软件消抖的方法检测按键按下的效果&#xff1b;第二种是根据按键按下次数&#xff0c;四个LED灯呈现不同的流水灯效果。 一…

异地使用PLSQL远程连接访问Oracle数据库【内网穿透】

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!

文章目录 前言dayofweek 函数官方说明BUG 重现Spark SQL 中的使用总结 前言 使用的集群环境为&#xff1a; hive 3.1.2spark 3.0.2 dayofweek 函数官方说明 dayofweek(date) - Returns the day of the week for date/timestamp (1 Sunday, 2 Monday, …, 7 Saturday). …

Win11共享文件,能发现主机但无法访问,提示找不到网络路径

加密长度选择如下&#xff1a; 参考以下链接&#xff1a; Redirectinghttps://answers.microsoft.com/zh-hans/windows/forum/all/win11%E8%AE%BE%E7%BD%AE%E6%96%87%E4%BB%B6%E5%A4%B9/554343a9-d963-449a-aa59-ce1e6f7c8982?tabAllReplies#tabs

【LeetCode-中等题】189. 轮转数组

题目 题解一&#xff1a;开辟数组 取模运算寻找位置(ik)mod n 新位置 思路&#xff1a;通过&#xff0c;开辟数组 取模运算寻找新位置------位置(ik)mod n 新位置 int[] newNums new int[nums.length];for(int i 0;i<nums.length;i){newNums[(ik)%nums.length] nums[i…

网络知识点之-堆叠与集群(2-集群)

本文章收录至《网络》专栏&#xff0c;点击右上角专栏图标可访问本专栏&#xff01; 集群是一种用于集团调度指挥通信的​​​​​​移动通信系统&#xff0c;主要应用在专业移动通信领域。该系统具有的可用信道可为系统的全体用户共用&#xff0c;具有自动选择信道功能&#x…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 4 Data store标签页介绍

这篇文章我们继续讲解code-mapping的Data stores页,这个页的内容对应的SIMULINK中的模块是Data store memory。 我们首先在模型中创建一个Data store memory模块,如图: Data store memory模块的作用相当于一个全局变量,我们可以在模型的功能逻辑里将一个信号存进去,在另…

[oneAPI] 基于BERT预训练模型的SWAG问答任务

[oneAPI] 基于BERT预训练模型的SWAG问答任务 基于Intel DevCloud for oneAPI下的Intel Optimization for PyTorch基于BERT预训练模型的SWAG问答任务数据集下载和描述数据集构建问答选择模型训练 结果参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d…

【Hadoop】HDFS读写流程和客户端命令使用

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

一文速学-让神经网络不再神秘,一天速学神经网络基础-前向传播(三)

前言 思索了很久到底要不要出深度学习内容&#xff0c;毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新&#xff0c;很多坑都没有填满&#xff0c;而且现在深度学习的文章和学习课程都十分的多&#xff0c;我考虑了很久决定还是得出神经网络系列文章&#xff0c;…

【Linux】深入理解文件缓冲区

文章目录 问题引入如何理解缓冲区缓冲区刷新策略问题解释模拟一个文件缓冲区 问题引入 首先看一段代码&#xff1a; #include <stdio.h> #include <string.h> int main() {const char *msg0"hello printf\n";const char *msg1"hello fwrite\n&quo…

Matlab(变量与文本读取)

目录 1.变量&#xff08;数据&#xff09;类型转换 1.1 字符 1.2 字符串 1.3 逻辑操作与赋值 2.Struct结构体数组 2.1函数的详细介绍&#xff1a; 2.1.1 cell2struct 2.1.1.1 垂直维度转换 2.1.1.2 水平维度转换 2.1.1.3 部分进行转换 2.1.2 rmfield 2.1.3 fieldnames(查…