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.mzph.cn/news/57532.shtml

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

相关文章

广州华锐互动:VR垃圾分类虚拟科普系统让学习过程更加丰富有趣

在我们的日常生活中&#xff0c;垃圾分类已成为一项重要的公民责任。然而&#xff0c;由于缺乏对垃圾分类的深入理解和相关知识&#xff0c;许多人在实践中往往感到困惑和挫败。为了解决这个问题&#xff0c;一种创新的解决方案应运而生&#xff1a;垃圾分类VR虚拟仿真教学系统…

MySQL - 表空间碎片整理方法

MySQL数据库中的表在进行了多次delete、update和insert后&#xff0c;表空间会出现碎片。定期进行表空间整理&#xff0c;消除碎片可以提高访问表空间的性能。 检查表空间碎片 下面这个实验用于验证进行表空间整理后对性能的影响&#xff0c;首先检查这个有100万记录表的大小&…

2023年7月京东空气净化器行业品牌销售排行榜(京东运营数据分析)

随着科技发展&#xff0c;智能家具在日常生活中出现的频率越来越高&#xff0c;许多曾经不被关注的家电也出现在其中&#xff0c;包括近年来逐渐兴起的空气净化器。伴随人们对自身健康的重视度越来越高&#xff0c;作为能够杀灭空气污染物、有效提高空气清洁度的产品&#xff0…

怎样快速选择正确的可视化图表?

数据可视化的图表类型十分丰富&#xff0c;好的图表可以有效、清晰地呈现数据的信息。对于用户而言&#xff0c;选择正确的图表是十分关键的&#xff0c;不仅可以达到“一图胜千言”的效果&#xff0c;而且会直接影响分析的结果。 用户选择正确的数据可视化图表前&#xff0c;…

Android学习之路(10) Bundle

Bundle的概念理解 Bundle经常出现在以下场合&#xff1a; Activity状态数据的保存与恢复涉及到的两个回调&#xff1a;void onSaveInstanceState (Bundle outState)、void onCreate (Bundle savedInstanceState)Fragment的setArguments方法&#xff1a;void setArguments (Bu…

基于云原生网关的流量防护实践

作者&#xff1a;涂鸦 背景 在分布式系统架构中&#xff0c;每个请求都会经过很多层处理&#xff0c;比如从入口网关再到 Web Server 再到服务之间的调用&#xff0c;再到服务访问缓存或 DB 等存储。在下图流量防护体系中&#xff0c;我们通常遵循流量漏斗原则进行流量防护。…

论文阅读_模型结构_LoRA

name_en: LoRA: Low-Rank Adaptation of Large Language Models name_ch: LORA&#xff1a;大语言模型的低阶自适应 paper_addr: http://arxiv.org/abs/2106.09685 date_read: 2023-08-17 date_publish: 2021-10-16 tags: [‘深度学习’,‘大模型’] author: Edward J. Hu cita…

自然语言处理(三):基于跳元模型的word2vec实现

跳元模型 回顾一下第一节讲过的跳元模型 跳元模型&#xff08;Skip-gram Model&#xff09;是一种用于学习词向量的模型&#xff0c;属于Word2Vec算法中的一种。它的目标是通过给定一个中心词语来预测其周围的上下文词语。 这节我们以跳元模型为例&#xff0c;讲解word2vec的…

java中的序列化和反序列化

1、序列化是干啥用的&#xff1f; 序列化的原本意图是希望对一个java对象做一下“变换”&#xff0c;变成字节序列&#xff0c;这样一来方便持久化存储到磁盘&#xff0c;另外变换成字节序列也更方便在网络运输和传播&#xff0c;所以概念上很好理解&#xff1a; 序列化&…

python怎么提取视频中的音频

目录 操作步骤 1. 安装MoviePy库&#xff1a; 2. 导入MoviePy库和所需的模块&#xff1a; 3. 提取音频&#xff1a; 可能遇到的问题 1. 编解码器支持&#xff1a; 2. 依赖项安装&#xff1a; 3. 文件路径问题&#xff1a; 4. 内存消耗&#xff1a; 5. 输出文件大小&a…

Linux CentOS安装抓包解包工具Wireshark图形化界面

1.Wireshark介绍 Wireshark 是一个开源的网络协议分析工具&#xff0c;它能够捕获和分析网络数据包&#xff0c;提供深入的网络故障排除、网络性能优化和安全审计等功能。它支持跨多个操作系统&#xff0c;包括 Windows、macOS 和 Linux。 2.Wireshark主要使用方法 捕获数据…

计算机视觉入门 5)自定义卷积网络

系列文章目录 计算机视觉入门 1&#xff09;卷积分类器计算机视觉入门 2&#xff09;卷积和ReLU计算机视觉入门 3&#xff09;最大池化计算机视觉入门 4&#xff09;滑动窗口计算机视觉入门 5&#xff09;自定义卷积网络计算机视觉入门 6&#xff09; 数据集增强&#xff08;D…

数据结构之单链表java实现

基本概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中指针链接次序实现的。和数组相比较&#xff0c;链表不需要指定大小&#xff0c;也不需要连续的地址。 单链表的基本设计思维是&#xff0c;利用结构体的设置&#xff0c…

24 | 紧跟时代步伐:微服务模式下API测试要怎么做?

微服务架构&#xff08;Microservice Architecture&#xff09; 微服务是一种架构风格。在微服务架构下&#xff0c;一个大型复杂软件系统不再由一个单体组成&#xff0c;而是由一系列相互独立的微服务组成。其中&#xff0c;各个微服务运行在自己的进程中&#xff0c;开发和部…

C# char曲线控件

一、char曲线显示随机数数据 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using Syst…

Windows 转 mac 记录

初次从Windows转mac可能会不适应&#xff0c;建议先看看 【6分钟搞定MacBook】不懂时无所适从&#xff0c;学会后越用越爽&#xff01;_哔哩哔哩_bilibili 我主要是做一些补充记录 1、Windows的右键等于mac的双击触控板、control单击触控板 2、运行中的应用下方会有一个点&…

安卓webview,网页端生成安卓项目(极速生成)教程

安卓webview&#xff0c;网页端生成安卓项目&#xff08;极速生成&#xff09;教程 一&#xff0c;前言 当自己做了一个PC端的页面&#xff0c;也就是前端的页面&#xff0c;或者已经上服的页面&#xff0c;但也想生成一个安卓端供用户使用&#xff0c;本教程详细讲解如何把前…

Spark整合hive的时候出错

Spark整合hive的时候 连接Hdfs不从我hive所在的机器上找&#xff0c;而是去连接我的集群里的另外两台机器 但是我的集群没有开 所以下面就一直在retry 猜测&#xff1a; 出现这个错误的原因可能与core-site.xml和hdfs-site.xml有关&#xff0c;因为这里面配置了集群的nameno…

高等职业学校物联网实训室建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…

无涯教程-分类算法 - Python实现函数

为了在Python中实现SVM&#xff0c;无涯教程将从标准库导入开始&#xff0c;如下所示- import numpy as np import matplotlib.pyplot as plt from scipy import stats import seaborn as sns; sns.set() 接下来&#xff0c;从sklearn.dataset.sample_generator创建具有线性可…