记录 Selenium 常用功能和API

目录

    • WebDriver 类 常用 API
    • WebElement 类 常用 API
    • 元素等待机制
      • sleep()方法
      • 隐式等待
      • 显式等待
        • 重写 apply() 方法
        • ExpectedConditions类中常用方法
        • 页面加载超时设置
    • 浏览器操作
      • 控制浏览器操作
        • Window 类
        • Navigation 类
      • 浏览器窗口的切换
      • 滚动条操作
      • 弹出框处理(alert、confirm)
    • 网页控件和元素操作
      • iframe 切换
      • 文件上传
      • 带 readonly 属性的元素操作
      • select 下拉框处理
      • 日期控件操作
        • 不要求手动输入
        • 要求手动输入
    • 模拟鼠标和键盘操作
      • 模拟鼠标
      • 模拟键盘
    • 截图

WebDriver 类 常用 API

WebDriver 提供了一系列的 API 来和浏览器进行交互

WebDriver 类常用方法:

方法描述
get(String url)访问目标 url 地址,打开网页
getCurrentUrl()获取当前页面 url 地址
getTitle()获取页面标题
getPageSource()获取页面源代码
close()关闭浏览器当前打开的窗口(指焦点窗口),不清空缓存
quit()关闭浏览器所有的窗口,并清空缓存
findElement(by)查找单个元素
findElements(by)查到元素集合,返回一个List
getWindowHandle()获取当前窗口的操控柄
getWindowHandles()获取所有窗口的操控柄

WebElement 类 常用 API

通过 WebElement 实现与网站页面上元素的交互,这些元素包含文本框、文本域、按钮、单选框、div等。

WebElement 类常用方法:

方法描述
click()对元素进行点击
clear()清空内容(如文本框内容)
sendKeys(…)写入内容与模拟按键操作
isDisplayed()元素是否可见
isEnabled()元素是否启用
isSelected()元素是否已被选择
getTagName()获取元素标签名
getAttribute(attributeName)获取元素对应的属性值
getText()获取元素文本值(元素可见状态下才能获取到)
submit()表单提交

元素等待机制

sleep()方法

线程类 Thread 中的 sleep 方法,强制等待。该方法会让线程进行休眠
Thread.sleep(longmillis);

隐式等待

调用方法:
driver.manage.timeouts.implicitlyWait(long time, TimeUtil unit);

隐式等待是指,当脚本执行到某个元素定位语句时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长

隐式等待的特点:

  • 隐式等待只能作用于元素的等待
  • 智能等待,网页在指定时间内加载完成,且元素在指定的时间内找到,则不会继续等待,否则在指定时间内未找到元素则抛出NoSuchElementException
  • 作用域是全局的,生命周期与driver保持一致。设置隐式等待后,页面所有的元素都会被绑定这种等待机制,全局有效,直到driver实例被关闭。
  • 如果多次设置隐式等待,那么最后一次的设置会覆盖之前的设置。
  • 隐式等待适用于页面元素加载时间不确定的情况,因为它可以在元素加载完成之前,使脚本暂停执行。

显式等待

调用方法:
WebDriverWait wait = new WebDriverWait(WebDriver driver, long timeOutInSeconds);
wait.until(ExpectedConditions....);

显式等待与隐式等待区别不大。

  • 主要区别在于显式等待不止可以作用于元素定位,还可以等待某些条件(如查找元素是否可点击)。
  • 不同于隐式等待的全局设置,显式等待非全局设置,即每次使用都需要给出具体的等待条件(如定位某一个元素)。
  • 智能等待,指定条件在指定时间内达成,则不会继续等待,否则抛出TimeOutException
重写 apply() 方法

apply() 方法是 ExpectedCondition 接口的父接口 Function<F, T> 接口下的方法,主要用于轮询元素工作
重写该方法可以在轮询逻辑中加入自定义逻辑(如指定查找区域)。

public WebElement getElement(long timeOutInSecond, By by) {WebDriverWait wait = new WebDriverWait(driver, timeOutInSecond);WebElement element = wait.until(new ExpectedCondition<WebElement>() {@NullableDecl@Overridepublic WebElement apply(@NullableDecl WebDriver webDriver) {return webDriver.findElement(by);}});return element;
}
ExpectedConditions类中常用方法
方法描述
presenceOfElementLocated(By locator)判断某个元素是否被加到了dom树里,并不代表该元素一定可见;
visibilityOfElementLocated(By locator)判断某个元素是否可见(代表元素非隐藏,元素的宽和高都不等于0);
elementToBeClickable(By locator)判断某个元素中是否可见并且是enable的且可点击;
elementToBeSelected(By locator)判断某个元素是否被选中了,一般用在下拉列表;
alertIsPresent()判断页面上是否存在alert;
titleIs(String title)判断当前页面的title是否精确等于预期;
titleContains(String title)判断当前页面的title是否包含预期字符串;
textToBePresentInElement(By locator, String text)判断某个元素中的text是否包含了预期的字符串;
textToBePresentInElementValue(By locator, String text)判断某个元素中的value属性是否包含了预期的字符串;
invisibilityOfElementLocated(By locator)判断某个元素中是否不存在于dom树或不可见;
frameToBeAvailableAndSwitchToIt(By locator)判断iframe可用,并且切换到iframe中
页面加载超时设置

通过TimeOuts 对象进行全局页面加载超时的设置,该设置必须放置get 方法之前
driver.manage().timeouts().pageLoadTimeout(long var1, TimeUnit var3);


浏览器操作

控制浏览器操作

Window 类

WebDriver 提供了一个 Window 对象,专门用于对窗口的设置

获取对象:
Window window = driver.manage().window();

Window 类常用方法:

方法描述
maximize()将浏览器窗口最大化。
getPosition()获取窗口的位置,返回 Point 对象,包含浏览器左上角的坐标位置。通过point.x 和point.y 来获取到。
setPosition(Point)指定浏览器窗口左上角的坐标位置,创建一个Point 对象,设置对象的 x 和 y 坐标即可。
getSize()获取窗口尺寸(宽和高),返回一个 Dimension 对象,通过该对象调用 getHeight() 和 getWidth() 来获取 高度和宽度。
setSize(Dimension)设置窗口大小,创建一个 Dimension 对象,设置对象的高度和宽度。
Navigation 类

WebDriver 提供了 Navigation 对象来对浏览器进行导航操作,如:前进、后退、刷新等。

获取对象:
Navigation navigate = driver.navigate();

Navigation 类常用方法:

方法描述
to(url)跳转到指定url,和 webdriver 使用 get 方法是一样的。
refresh()刷新当前页面。
back()浏览器回退操作。
forward()浏览器前进操作。

浏览器窗口的切换

浏览器窗口有“句柄”的概念,在这里将“句柄”理解为“操作杆”即可。
每个窗口都有一个操作杆,当需要操作某个窗口时,首先要“握住”这个窗口的“操作杆”

WebDriver 类中获取窗口“操作杆”的方法:

// 获取当前窗口的句柄
String handle = driver.getWindowHandle();
// 获取所有窗口的句柄,返回一个集合
Set<String> handles = driver.getWindowHandles();

WebDriver 类中切换窗口的方法:

// 切换到窗口
driver.switchTo.windwo(String handle);

多窗口查找,通常可以通过匹配title属性来判断是否为所需窗口。

滚动条操作

浏览器的滚动条操作,需要借助 JavaScript 来控制

在 JavaScript 中,函数 window.scrollTo(0,0) 用于调整滚动条。
函数的两个参数分别是水平坐标和垂直坐标

WebDriver 类中用于执行 JavaScript 代码的方法:

//根据坐标滚动滚动条;
((JavascriptExecutor)driver).executeScript("window.scrollTo(0,0)");//根据元素定位滚动滚动条;(使用JavaScript方法获取元素)
((JavascriptExecutor)driver).executeScript("document.getElementById('s_btn_wr').scrollIntoView(0);");//根据元素定位滚动滚动条;(使用Java方法获取元素)
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(0)",driver.findElement(By.className("cname")));

弹出框处理(alert、confirm)

操作alert、confirm弹出框,可以通过Alert 对象来进行操作,Alert类包含了确认、取消、输入和获取弹出窗内容。

Alert 类中用于进行弹框处理的方法:

方法描述
getText()获取弹出框内容。
accept()接受弹窗的提示,相当于点击确认按钮。
dismiss()取消提示窗。
sendKeys()给弹窗输入内容。

如果弹出框不是 js 原生的 alert 弹窗,则仍旧使用 findElement() 定位元素的相关方法。


网页控件和元素操作

iframe 切换

iframe 指网页嵌套,可以嵌套多层,焦点在外层时,无法查找内层的元素。因此查找不同层元素时,需要切换 iframe

TargetLocator 接口中用于切换 iframe 的三个重载方法:

// 方法一:通过 iframe 的索引值
driver.switchTo().frame(index);
// 方法二:通过 iframe 的 name 或者 id
driver.switchTo().frame(nameOrId);
// 方法三:通过 iframe 对应的 webElement(常用)
driver.switchTo().frame(frameElement);

文件上传

上传功能通过 input 标签实现,可以将其看作是一个输入框,即通过sendKeys()指定本地文件路径的方式实现文件上传

定位上传按钮, 添加本地文件
driver.findElement(By).sendKeys("绝对路径");
sendKeys 参数为文件的绝对路径,并且上传的文件一点要存在,否则会抛异常

带 readonly 属性的元素操作

标签元素如果带有 readonly 属性,表示只读不能进行编辑
操作该类元素,需要先把 readonly 属性移除,再进行操作
webdriver 没有用于删除标签属性的 API,需要使用 JavaScript 脚本进行删除操作

//定位元素(可以使用 JavaScript 也可以使用 Java,以下使用 JavaScript)
//通过 JavaScript 移除 readonly 属性,并使用 executeScript() 方法执行 JavaScript 语句:
((JavascriptExecutor)driver).executeScript("document.getElementById('元素id').removeAttribute('readonly')");

select 下拉框处理

当页面元素为下拉框(select)时,selenium 使用专门的 Select 类对下拉框框进行操作
其中包含了单选和多选下拉框的各种操作,如获得所有的选项、选择某一项、取消选中某一项、是否是多选下拉框等。

Select 类常用方法:

方法描述
void deselectAll()取消所有选择项,仅对下拉框的多选模式有效,若下拉不支持多选模式,则会抛出异常 UnsupportedOperationException
void deselectByIndex(int index)取消指定index的选择,index从零开始,仅对多选模式有效,否则抛出异常 UnsupportedOperationException
void deselectByValue(String value)取消Select标签中value为指定值的选择,仅对多选模式有效,否则抛出异常 UnsupportedOperationException
void deselectByVisibleText(String Text)取消选项的文字为指定值的项,仅对多选模式有效,单选模式无效,但不会抛出异常
List getAllSelectedOptions()获得所有选中项,单选多选模式均有效,但没有一个被选中时,返回空列表,不会抛出异常
WebElement getFirstSelectedOption()获得第一个被选中的项,单选多选模式均有效,当多选模式下,没有一个被选中时,会抛出NoSuchElementException异常
List getOptions()获得下拉框的所有项,单选多选模式均有效,当下拉框没有任何项时,返回空列表,不会抛出异常
boolean isMultiple()判断下拉框是否多选模式
void selectByIndex(int inde()选中指定index的项,单选多选均有效,当index超出范围时,抛出NoSuchElementException异常
void selectByValue(String valu()选中所有Select标签中value为指定值的所有项,单选多选均有效,当没有适合的项时,抛出NoSuchElementException异常
void selectByVisibleText(String text)选中所有项的文字为指定值的项,与deselectByValue相反,但单选多选模式均有效,当没有适合的项时,抛出NoSuchElementException异常

日期控件操作

页面中出现时间控件选择时,一般分为两种:

  • 不要求手动输入
  • 要求手动输入

无论使用哪种方式进行时间的赋值,输入时间的格式都必须符合系统的要求

不要求手动输入

控件没有限制手动填写的,直接使用 sendKeys() 方法进行赋值即可
driver.findElement(By).sendKeys("符合系统的要求的时间格式");

要求手动输入

控件限制了手动输入,只能通过点击控件时间进行输入的,则使用 JavaScript 进行操作
(JavaScriptExecutor)driver.executeScript("document.getElementById('元素id').value='符合系统的要求的时间格式';")


模拟鼠标和键盘操作

模拟鼠标

在 WebDriver 中,鼠标的操作通过 Actions 类进行模拟,包括鼠标右击、双击、悬停、拖动等操作。

Actions 类常用方法:

方法描述
contextClick()鼠标右击
click()鼠标单击(左击)
clickAndHold(WebElement)点击并控制(模拟悬停)
doubleClick(WebElement)鼠标双击
dragAndDrop(webElement1,webElement2)鼠标拖动
moveToElement(WebElement)鼠标移动到某个元素上
release()释放鼠标
perform()执行所有Actions中存储的行为

所有的鼠标操作最终都需要调用 perform() 方法,即只有 perform() 方法被调用,Actions 中存储的鼠标行为才会被执行

模拟键盘

selenium 提供了 Key 类(枚举),用于模拟键盘上的各种按键

通过以下方法从键盘输入:

//输入文本
sendKeys("selenium");//输入单个按键
sendKeys(Keys.ENTER);
sendKeys("a");//输入组合按键(两种方式)
sendKeys(Keys.BACK_SPACE, "c");
sendKeys(Keys.chord(Keys.CONTROL,"v"));

截图

补充记录截图操作,截图功能不是 selenium 的功能之一,但是实际工作中会经常使用。

截图需要导入 apache.commons.io 包,依赖如下:

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

截图示例:

private void printscreen() {// 设置截图保存路径String filePath = "路径";// 截取当前屏幕,并保存为图片File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);// 将截图保存到指定路径try {FileUtils.copyFile(screenshot, new File(filePath));} catch (IOException e) {e.printStackTrace();}
}

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

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

相关文章

个人网站制作 Part 14 添加网站分析工具 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加网站分析工具&#x1f528;使用Google Analytics&#x1f527;步骤 1: 注册Google Analytics账户&#x1f527;步骤 2: 获取跟踪代码 &#x1f528;使用Vue.js&#…

[AIGC] Apache HTTP服务器:历史与使用

Apache HTTP服务器&#xff1a;历史与使用 Apache HTTP服务器&#xff0c;通常我们简称为Apache&#xff0c;是一款流行且强大的开源Web服务器软件。它伴随互联网的快速成长&#xff0c;并承载了许多网站服务的运行和访问。通过最新的科技和广阔的功能&#xff0c;Apache服务器…

实体框架EF(Entity Framework)简介

实体框架EF&#xff08;Entity Framework&#xff09;简介 文章目录 实体框架EF&#xff08;Entity Framework&#xff09;简介一、概述二、O/R Mapping是什么采用O/R Mapping带来哪些好处 三、Entity Framework架构3.1 下图展示了Entity Framework的整体架构3.2 Entity Framew…

MyBatis:XML操作

&#x1f451;专栏内容&#xff1a;MyBatis⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、MyBatis XML方式1、配置数据库2、指明XML路径3、写持久层代码 二、基础操作1、新增2、删除3、更新4、查找Ⅰ、开启驼峰命…

配置视图解析器

我们在指定视图的时候路径是有重复的&#xff0c;重复的操作可以用视图解析器&#xff0c;让框架帮我们&#xff1a; mv.setViewName("/WEB-INF/view/show.jsp");mv.setViewName("/WEB-INF/view/other.jsp"); 配置视图解析器&#xff1a; 注册视图解析器:帮…

202112青少年软件编程(Scratch图形化)等级考试试卷(三级)

第1题:【 单选题】 下列程序哪个可以实现: 按下空格键, 播放完音乐后说“你好! ” 2 秒? ( ) A: B: C: D: 【正确答案】: C 【试题解析】 : 第2题:【 单选题】 执行下列程序, 变量 N 的值不可能是? ( ) A:1 B:4 C:5 D:6 【正确答案】: D 【试题解析】…

制作一个RISC-V的操作系统六-bootstrap program(risv 引导程序)

文章目录 硬件基本概念qemu-virt地址映射系统引导CSR![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/86461c434e7f4b1b982afba7fad0256c.png)machine模式下的csr对应的csr指令csrrwcsrrs mhartid引导程序做的事情判断当前hart是不是第一个hart初始化栈跳转到c语言的…

ES集群部署:定时清除last_run_metadata_path数据

文章目录 引言I crontab 周期自动执行相应命令1.1 crontab语法1.2 crontab 文件示例1.3 系统范围内的 crontab 文件II logstash2.1 conf 参考2.2 statement_filepath2.3 执行引言 需求: 每天定时删除logstash的last_run_metadata_path文件,间接清除last_run_metadata_path数据…

分治法排序:原理与C语言实现

分治法排序&#xff1a;原理与C语言实现 一、分治法与归并排序概述二、归并排序的C语言实现三、归并排序的性能分析四、归并排序的优化 在计算机科学中&#xff0c;分治法是一种解决问题的策略&#xff0c;它将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问…

Expert Prompting-引导LLM成为杰出专家

ExpertPrompting: Instructing Large Language Models to be Distinguished Experts 如果适当设计提示&#xff0c;对齐的大型语言模型&#xff08;LLM&#xff09;的回答质量可以显著提高。在本文中&#xff0c;我们提出了ExpertPrompting&#xff0c;以激发LLM作为杰出专家回…

运动想象 (MI) 迁移学习系列 (14) : EEGNet-Fine tuning

运动想象迁移学习系列:EEGNet-Fine tuning 0. 引言1. 主要贡献2. 提出的方法2.1 EEGNet框架2.2 微调 3. 实验结果3.1 各模型整体分类结果3.2 算法复杂度比较3.3 不同微调方法比较 4. 总结欢迎来稿 论文地址&#xff1a;https://www.nature.com/articles/s41598-021-99114-1#cit…

【算法训练营】周测4

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 考题11-4 题目描述 输入格式 从标准输入读入数据。 输入第一行为两个正整…

将main打包成jar;idea打包main为jar包运行

将main打包成jar&#xff1b;idea打包main为jar包运行 适用场景&#xff1a;可以封装一些小工具。 配置jar Maven中添加 <packaging>jar</packaging>将其打包为jar。 设置运行入口main 编译jar 看到jar输出 运行效果&#xff1a; 其中&#xff0c;三方依赖也被…

【Unity】获取游戏对象或组件的常用方法

前言 在Unity开发过程中&#xff0c;我们经常需要获取组件&#xff0c;那么在Unity里如何获取组件呢&#xff1f; 一、获取游戏对象 1.GameObject.Find GameObject.Find 是通过物体的名称获取对象的 所以会遍历当前整个场景&#xff0c;效率较低 而且只能获取激活状态的物体…

pytorch多层感知机

目录 1. 多层感知机2. 多层感知机loss梯度推导3. pytorch示例 1. 多层感知机 有多个输入节点、多个中间节点和多个输出节点 2. 多层感知机loss梯度推导 3. pytorch示例

MySQL 字段定义时的属性设置

开发的时候第一步就是建表&#xff0c;在创建表的时候&#xff0c;我们需要定义表的字段&#xff0c;每个字段都有一些属性&#xff0c;比如说是否为空&#xff0c;是否允许有默认值&#xff0c;是不是逐渐等。 这些约束字段的属性&#xff0c;可以让字段的值更符合我们的预期&…

将多个 Node.js 服务打包成一个镜像,并在 Docker Compose 中使用这个镜像

要将多个 Node.js 服务打包成一个镜像&#xff0c;并在 Docker Compose 中使用这个镜像&#xff0c;创建一个统一的 Dockerfile 来构建所有的 Node.js 服务&#xff0c;并将这些服务打包到同一个镜像中。然后&#xff0c;在 Docker Compose 文件中&#xff0c;您只需引用这个统…

HCIP—BGP路由聚合

在大型网络中&#xff0c;路由条目通常多达成千上万条&#xff0c;甚至几十万条&#xff0c;这给路由设备带来的挑战是&#xff1a;如何存储并有效管理如此众多的路由信息&#xff1f; BGP是一种无类路由协议&#xff0c;支持CIDR、VLSM和路由聚合。路由聚合技术的使用…

[Linux开发工具]——gcc/g++的使用

Linux编译器——gcc/g的使用 一、快速认识gcc/g二、程序的翻译过程2.1 预处理&#xff08;.i文件&#xff09;2.2 编译&#xff08;.s文件&#xff09;2.3 汇编&#xff08;.o文件&#xff09;2.4 链接&#xff08;生成可执行文件或库文件&#xff09; 三、认识函数库3.1 静态库…

微调alpaca-lora遇到的一些问题

1、环境简介 环境&#xff1a; 系统&#xff1a;Ubuntu torch&#xff1a;2.2.1 python&#xff1a;3.10 gpu&#xff1a;V100 16g peft&#xff1a;0.9.0 使用PEFT中的lora方式微调llama-2-7b-hf&#xff0c;项目地址&#xff1a;alpaca-lora 2、混合精度训练Tensor相互计算会…