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 方法所打开页面的 URL
        String 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 方法中填入 想要上传文件的 绝对路径

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何选择合适的自动化测试工具?

自动化测试是高质量软件交付领域中最重要的实践之一。在今天的敏捷开发方法中&#xff0c;几乎任一软件开发过程都需要在开发阶段的某个时候进行自动化测试&#xff0c;以加速回归测试的工作。自动化测试工具可以帮助测试人员以及整个团队专注于自动化工具无法处理的各自任务&a…

与面试官互动:建立积极的技术讨论氛围

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

引领未来商业:循环购模式的创新突破-微三云门门

尊敬的创业者们&#xff0c;我是微三云门门。今天&#xff0c;我将与您深入探讨一种崭新的商业模式——循环购模式。该模式在私域流量领域取得了巨大成功&#xff0c;仅用6个月时间就创造了超过400万的用户数量&#xff01; 循环购商业模式的核心概念涵盖三个关键要素&#xf…

【NX】分割曲线出现“输入行的长度为0”

在nx使用分割曲线的功能或者函数的时候&#xff0c;偶尔会提示如下&#xff1a; “输入行的长度为0”。实际上这是翻译的过&#xff0c;应该是the length of input is 0 之类的直译。 针对这种情况&#xff0c;一般要考虑是输入的曲线有问题或者点有问题&#xff0c;这时候我们…

stm32基于HAL库驱动外部SPI flash制作虚拟U盘

stm32基于HAL库驱动外部SPI flash制作虚拟U盘 &#x1f4cc;参考文章&#xff1a;https://xiaozhuanlan.com/topic/6058234791&#x1f39e;实现效果演示&#xff1a; &#x1f516;上图中的读到的FLASH_ID所指的是针对不同容量&#xff0c;所对应的ID。 //W25X/Q不同容量对应…

spring小记

Spring是轻量级的开源的javaEE框架目的&#xff1a;解决企业应用开发的复杂性 Spring有两个核心部分&#xff1a;IOC和AOP <1>IOC&#xff1a;控制反转&#xff0c;把创建的对象过程交给Spring进行管理 <2>AOP&#xff1a;面向切面&#xff0c;不修改源代码进行…

软件测试及数据分析处理实训室建设方案

一 、系统概述 软件测试及数据分析处理是软件开发过程中的一项重要测试活动&#xff0c;旨在验证不同软件模块或组件之间的集成与交互是否正常。综合测试确保各个模块按照设计要求正确地协同工作&#xff0c;以实现整个软件系统的功能和性能。以下是软件测试及数据分析处理的一…

无涯教程-Android - 系统架构

Android操作系统是一堆软件组件&#xff0c;大致分为五个部分和四个主要层&#xff0c;如体系结构图中所示。 Linux内核 底层是Linux-Linux 3.6&#xff0c;带有大约115个补丁&#xff0c;这在设备硬件之间提供了一定程度的抽象&#xff0c;并且包含所有必需的硬件驱动程序&am…

Linux重置ROOT密码(CentOS)

解释说明 在CentOS中重置root密码通常需要进入单用户模式&#xff0c;这是一个没有密码限制的特殊模式&#xff0c;允许您以root权限登录系统并更改密码。 重启系统 如果您无法登录到系统&#xff0c;可以通过重启系统来开始这个过程。您可以使用虚拟机控制台、物理服务器控制台…

Viobot基本功能使用及介绍

设备拿到手当然是要先试一下效果的&#xff0c;这部分可以参考本专栏的第一篇 Viobot开机指南。 接下来我们就从UI开始熟悉这个产品吧&#xff01; 1.状态 设备上电会自动运行它的程序&#xff0c;开启了一个服务器&#xff0c;上位机通过连接这个服务器连接到设备&#xff0c…

【java】LinkedList 和 ArrayList的简介与对比

Java LinkedList和 ArrayList 在使用上&#xff0c;几乎是一样的。由于LinkedList是基于双向链表的&#xff0c;会多出list.getFirst();获取头部元素等方法 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按…

Mysql--技术文档--MVCC(Multi-Version Concurrency Control | 多版本并发控制)

MVCC到底是什么 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是一种并发控制机制&#xff0c;用于解决并发访问数据库时的数据一致性和隔离性问题。MVCC允许多个事务同时读取数据库的同一数据&#xff0c;而不会相互干扰或导致冲突。 在传统的并发控制机制中…

【深度解析】朗逸与宝来汽车:哪款更适合你?

在汽车市场中&#xff0c;朗逸和宝来都是非常受欢迎的车型。它们各自都有独特的优点和缺点&#xff0c;那么&#xff0c;究竟哪款车更适合你呢&#xff1f;让我们一起来深度解析一下。 朗逸&#xff0c;作为大众的入门级车型&#xff0c;以其稳定的性能和较高的性价比赢得了消费…

爬虫逆向实战(二十四)--某鸟记录中心

一、数据接口分析 主页地址&#xff1a;某鸟记录中心 1、抓包 通过抓包可以发现数据接口是front/record/search/page 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现&#xff0c;请求参数是加密的 请求头是否加密&#xff1f; 通过查…

Android Studio开发之路 (五)导入OpenCV以及报错解决

一、步骤 官网下载opencv包&#xff08;我下的是4.7.0&#xff09;并解压&#xff0c;openvc官网 先创建一个空项目&#xff0c;简单跑一下能正常输出helloworld 点击file->new->Import Module选择解压之后的opencv-android-sdk文件夹中的SDk文件夹&#xff0c; modu…

docker搭建owncloud,Harbor,构建镜像

1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 拉取镜像 docker pull owncloud docker pull mysql:5.6 2、安装搭建私有仓库 Harbor 1.下载docker-compose 2.安装harbor 3.编辑 harbor.yml文件 使用./intall.sh安装 4.登录 3、编写Dockerfile制作Web应用系…

Java 程序打印 OpenCV 的版本

我们可以使用 Java 程序来使用 OpenCV。 OpenCV 的使用需要动态库的加载才可以。 加载动态库 到 OpenCV 的官方网站上下载最新的发布版本。 Windows 下载的是一个可执行文件&#xff0c;没关系&#xff0c;这个可执行文件是一个自解压程序。 当你运行以后会提示你进行解压。…

解决抖音semi-ui的Input无法获取到onChange事件

最近在使用semi-ui框架的Input实现一个上传文件功能时遇到了坑&#xff0c;就是无法获取到onChange事件&#xff0c;通过console查看只是拿到了一个文件名。但若是把<Input>换成原生的<input>&#xff0c;就可以正常获取到事件。仔细看了下官方文档&#xff0c;发现…

Windows 转 mac 记录

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

时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比

时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比。 1.Matlab实现PSO-BiLSTM和BiLSTM…