当前位置: 首页 > news >正文

Java测试——selenium具体操作

selenium的前置准备工作可以参考我之前的博客:Java测试——selenium的安装与使用教程

这篇博客讲解一下selenium的常见操作

先创建driver

ChromeDriver driver = new ChromeDriver();

输入网址

driver.get("https://www.baidu.com");

常见操作

查找元素

我们可以通过下面这个方法查找页面的一个元素

driver.findElement(By.cssSelector(""))

该方法返回一个WebElement元素

例如,我们查找百度的搜索框

WebElement element = driver.findElement(By.cssSelector("#kw"));

也可以通过下面这个方法查找页面中多个元素

findElements()

输入文本

通过对WebElement元素调用下面这个方法来输入文本

sendKeys();

例如,我们在搜索框中输入蔡徐坤

driver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");

点击click

我们可以通过对WebElement元素调用下面这个方法来实现在网站中点击该元素

click();

例如我们点击百度中的百度一下按钮

driver.findElement(By.cssSelector("#su")).click();

提交submit

我们可以通过对WebElement元素调用下面这个方法来实现提交该表单元素

submit();

例如我们提交百度一下的表单

driver.findElement(By.cssSelector("#su")).submit();

清除clear

我们可以通过对WebElement元素调用该方法,来实现清除之前的输入

clear();

例如,我们可以清除之前在输入框中的输入

driver.findElement(By.cssSelector("#kw")).clear();

获取文本

我们可以对WebElement元素调用该方法,获取元素中的文本,最终返回一个字符串

getText();

例如获取下面这个热搜中的文本,将其打印在控制台上
在这里插入图片描述

System.out.println(driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(2) > a > span.title-content-title")).getText());

获取属性

而如果我们尝试获取百度一下按钮中的文字,会发现无法获取到文字,这是因为百度一下是value这个键对应的值,我们可以通过调用下面这个方法,实现获取WebElement元素相应的键对应的值,其结果为字符串

getAttribute();

例如,我们可以获取输入框的相关键对应的值

System.out.println(driver.findElement(By.cssSelector("#su")).getAttribute("value"));
System.out.println(driver.findElement(By.cssSelector("#su")).getAttribute("id"));
System.out.println(driver.findElement(By.cssSelector("#su")).getAttribute("class"));
System.out.println(driver.findElement(By.cssSelector("#su")).getAttribute("type"))

获取页面标题

这里的“百度一下,你就知道”,就是我们当前页面的标题
在这里插入图片描述

我们可以通过下面这个方法来获取当前页面的标题,其结果返回一个字符串

getTitle();

例如我们将该页面标题打印到控制台上

System.out.println(driver.getTitle())

获取页面url

这里的内容,就是当前页面的url
在这里插入图片描述
我们通过下面这个方法来获取当前页面的url,其结果返回一个字符串

System.out.println(driver.getCurrentUrl())

窗口

调整窗口大小

将窗口最大化

driver.manage().window().maximize();

将窗口最小化

driver.manage().window().minimize();

将窗口全屏显示

driver.manage().window().fullscreen();

手动设置窗口大小(第一个元素是宽度,第二个元素是高度)

driver.manage().window().setSize(new Dimension(1024,2048));

窗口的切换

如果我们使用自动化程序,点击“图片”超链接,进入到百度图片的页面,然后获取百度一下按钮,就会发现结果报错了
在这里插入图片描述

在这里插入图片描述
具体实现代码如下:

driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)")).click();
driver.findElement(By.cssSelector("#homeSearchForm > span.s_btn_wr > input"));
driver.quit();

最终程序报错,没有找到“百度一下”按钮
在这里插入图片描述

通过回顾刚才的图片可以看到,我们这时开了两个窗口,而自动化程序现在操作的还是第一个窗口,因此访问不到百度图片的“百度一下”

事实上,每打开一个标签页,浏览器就会自动给标签页一个标识:句柄

我们可以通过下面这个方法获取所有界面的句柄,其结果为Set< String >

getWindowHandles();

也可以只获取当前页面的句柄打印出来

System.out.println(driver.getWindowHandle());

我们可以通过下面这个操作来获取所有页面的句柄,将他们打印出来

Set<String> handles = driver.getWindowHandles();
for (String handle:handles) {System.out.println(handle);
}

可以使用下面这个方法,传输一个句柄,来切换页面

driver.switchTo().window(handle);

屏幕截图

如果我们自动化实现在百度中搜索蔡徐坤,并且点击下图中这个名字
在这里插入图片描述
具体代码如下

driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");
driver.findElement(By.cssSelector("#su")).click();
driver.findElement(By.cssSelector("#\\31  > div > div > div > div > div.cos-row.row-text_Johh7.row_5y9Az > div > a > div > p > span > span"));
driver.quit();

最终会发现代码报错,没有找到该元素
在这里插入图片描述
我们可以使用屏幕截图,看一下当前页面是什么样子

使用下面的方法,可以将当前界面截屏为java中的file对象

getScreenshotAs(OutputType.FILE);

我们可以将file对象拷贝为已有的文件,实现将屏幕截图放到指定路径下的操作

首先导入依赖

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>

使用下面这个代码,可以实现拷贝文件操作

FileUtils.copyFile(源文件, 目标文件);

完整代码如下:

driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");
driver.findElement(By.cssSelector("#su")).click();File srcFile = driver.getScreenshotAs(OutputType.FILE);
//将屏幕截图放到指定路径下
String filename = "my.png";
FileUtils.copyFile(srcFile, new File(filename));driver.findElement(By.cssSelector("#\\31  > div > div > div > div > div.cos-row.row-text_Johh7.row_5y9Az > div > a > div > p > span > span"));
driver.quit();

加上上述代码,我们看一下浏览器当前的样子
在这里插入图片描述
可以发现,浏览器还没有渲染完毕,我们的代码就开始执行查找元素了,因此会发生找不到的情况

因此,我们只需要加上休眠时间,让浏览器有时间渲染即可

让浏览器休眠3秒

Thread.sleep(3000);

可以看到,这时渲染的画面是正常的
在这里插入图片描述

相关文章:

Java测试——selenium具体操作

selenium的前置准备工作可以参考我之前的博客&#xff1a;Java测试——selenium的安装与使用教程 这篇博客讲解一下selenium的常见操作 先创建driver ChromeDriver driver new ChromeDriver();输入网址 driver.get("https://www.baidu.com");常见操作 查找元素…...

电子器件系列32:逻辑与门芯片74LS11

一、编码规则 先看看这个代码的意思&#xff1a;74LS11 74是一个系列&#xff08;74 表示为工作温度范围&#xff0c;74: 0 ~ 70度。&#xff09; ls的意思就是工艺类型&#xff08;Bipolar(双极)工艺&#xff09; 11是代码 什么是74系列逻辑芯片&#xff1f; - 知乎 什么是…...

LeetCode-101. 对称二叉树

目录题目分析递归法题目来源 101. 对称二叉树 题目分析 首先想清楚&#xff0c;判断对称二叉树要比较的是哪两个节点&#xff0c;要比较的可不是左右节点&#xff01; 对于二叉树是否对称&#xff0c;要比较的是根节点的左子树与右子树是不是相互翻转的&#xff0c;理解这一…...

使用intlinprog求解指派问题MATLAB代码分享

% 输入指派矩阵C [3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10];f C(:); %生成一个列向量&#xff0c;作为目标函数系数&#xff0c;matlab默认以列排序[m,n] size(C);Aeq zeros(2*n,n*n); %2*n个等式约束&#xff0c;n*n个变量for i 1:n %这里先生成的是后5个…...

Spark On YARN时指定Python版本

坑很多&#xff0c;直接上兼容性最佳的命令&#xff0c;将python包上传到hdfs或者file:/home/xx/(此处无多余的/) # client 模式 $SPARK_HOME/spark-submit \ --master yarn \ --deploy-mode client \ --num-executors 2 \ --conf "spark.yarn.dist.archives<Python包…...

[数据库]库的增删改查

●&#x1f9d1;个人主页:你帅你先说. ●&#x1f4c3;欢迎点赞&#x1f44d;关注&#x1f4a1;收藏&#x1f496; ●&#x1f4d6;既选择了远方&#xff0c;便只顾风雨兼程。 ●&#x1f91f;欢迎大家有问题随时私信我&#xff01; ●&#x1f9d0;版权&#xff1a;本文由[你帅…...

Wine零知识学习1 —— 介绍

一、什么是Wine Wine是“Wine Is Not an Emulator” 的首字母缩写&#xff0c;是一个能够在多种POSIX-compliant操作系统&#xff08;诸如Linux、macOS及BSD等&#xff09;上运行 Windows 应用的兼容层。Wine不像虚拟机或者模拟器那样模仿内部的Windows逻辑&#xff0c;而是將…...

设计模式--建造者模式 builder

设计模式--建造者模式 builder&#xff09;建造者模式简介建造者模式--小例子&#xff08;电脑购买&#xff09;1.产品类2.抽象构建者3.实体构建类4.指导者类5.客户端测试类小结建造者模式简介 建造者模式有四个角色,概念划分如下&#xff1a; Product &#xff1a; 产品类&a…...

终于周末啦,继续来总结一下Python的一些知识点啦

目录 Python概念梳理 常见概念梳理 Python经典判断题 判断题 选择题 Python概念梳理 常见概念梳理 Python中&#xff0c;不仅仅变量的值是可以变化的&#xff0c;类型也是可以随时变化的 1、Python的变量必须初始化否则提示 is not defined 2、if、while中定义的变量在…...

CUDA By Example(八)——流

文章目录页锁定主机内存可分页内存函数页锁定内存函数CUDA流使用单个CUDA流使用多个CUDA流GPU的工作调度机制高效地使用多个CUDA流遇到的问题(未解决)页锁定主机内存 在之前的各个示例中&#xff0c;都是通过 cudaMalloc() 在GPU上分配内存&#xff0c;以及通过标准的C库函数 …...

02- pandas 数据库 (数据库)

pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …...

less常用语法总结

CSS预处理器 CSS 预处理器是什么?一般来说,它们基于 CSS 扩展了一套属于自己的 DSL,来解决我们书写 CSS 时难以解决的问题: 语法不够强大,比如无法嵌套书写导致模块化开发中需要书写很多重复的选择器;没有变量和合理的样式复用机制,使得逻辑上相关的属性值必须以字面量…...

DHCP Relay中继实验

DHCP Relay实验拓扑图设备配置结果验证拓扑图 要求PC1按照地址池自动分配&#xff0c;而PC要求分配固定的地址&#xff0c;网段信息已经在图中进行标明。 设备配置 AR1&#xff1a; AR1作为DHCP Server基本配置跟DHCP Server没区别&#xff0c;不过要加一条静态路由&#xff…...

“1+1>2”!《我要投资》与天际汽车再度“双向奔赴”!

文|螳螂观察 作者| 图霖 胡海泉老师重磅回归、创始人现场真情告白……新一季的《我要投资》&#xff0c;不仅维持了往季在专业度上的高水准&#xff0c;也贡献了不少高话题度的“出圈”时刻。 在竞争激烈的的综艺节目竞技场&#xff0c;能举办数季的节目&#xff0c;往往都是…...

【分享】订阅金蝶KIS集简云连接器同步OA付款审批数据至金蝶KIS

方案简介 集简云基于钉钉连接平台完成与钉钉的深度融合&#xff0c;实现钉钉OA审批与数百款办公应用软件&#xff08;如金蝶KIS、用友等&#xff09;的数据互通&#xff0c;让钉钉的OA审批流程与企业内部应用软件的采购、付款、报销、收款、人事管理、售后工单、立项申请等环节…...

dubbo服务消费

dubbo在服务消费时调用的方法栈比较深&#xff0c;所以得一边看一边记&#xff0c;还是比较费力的。在dubbo服务发现中&#xff0c;我们看到通过ReferenceConfig#get()返回的是要调用接口的代理对象&#xff0c;因此通过接口的代理对象调用方法时是调用InvocationHandler(Invok…...

Python调用API接口,实现人脸识别

人生苦短&#xff0c;我用Python 在开始之前&#xff0c;先问问大家&#xff1a; 什么是百度Aip模块&#xff1f; 百度AI平台提供了很多的API接口供开发者快速的调用运用在项目中 本文写的是使用百度AI的**在线接口SDK模块&#xff08;baidu-aip&#xff09;**进行实现人脸识…...

2月10日刷题总结

编辑距离题目描述设 AA 和 BB 是两个字符串。我们要用最少的字符操作次数&#xff0c;将字符串 AA 转换为字符串 BB。这里所说的字符操作共有三种&#xff1a;删除一个字符&#xff1b;插入一个字符&#xff1b;将一个字符改为另一个字符。A, BA,B 均只包含小写字母。输入格式第…...

C++学习/温习:新型源码学编程(三)

写在前面(祝各位新春大吉&#xff01;兔年如意&#xff01;) 【本文持续更新中】面向初学者撰写专栏&#xff0c;个人原创的学习C/C笔记&#xff08;干货&#xff09;所作源代码输出内容为中文&#xff0c;便于理解如有错误之处请各位读者指正请读者评论回复、参与投票&#xf…...

阿里云ecs服务器搭建CTFd(ubuntu20)

1.更新apt包索引 sudo apt-get update更新源 1、使用快捷键【ctrlaltt】打开终端。 2、输入以下命令备份原有软件源文件。 cp /etc/apt/sources.list /etc/apt/sources.list.bak_yyyymmdd 3、再输入以下命令打开sources.list文件并添加新的软件源地址。 vim /etc/apt/sources.…...

如何突破Cursor试用限制?3种创新方案全解析

如何突破Cursor试用限制&#xff1f;3种创新方案全解析 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro. We have this …...

深度解析:Markdown Viewer v5.3如何通过自定义主题功能彻底改变文档阅读体验

深度解析&#xff1a;Markdown Viewer v5.3如何通过自定义主题功能彻底改变文档阅读体验 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer Markdown Viewer作为一款备受开发者喜爱的…...

告别繁琐配置:用快马一键生成wsl2环境初始化脚本

告别繁琐配置&#xff1a;用快马一键生成wsl2环境初始化脚本 最近在帮团队新成员配置开发环境时&#xff0c;发现每次手动搭建wsl2都要重复查找各种命令和配置步骤&#xff0c;效率实在太低。于是尝试用InsCode(快马)平台生成了一套自动化脚本&#xff0c;效果出乎意料地好。 …...

如何在日常渗透中实现通杀漏洞挖掘

如何在日常渗透中实现通杀漏洞挖掘 你是不是天天遇到了edu刷屏&#xff1f;看到了某些漏洞平台&#xff0c;某些人交了一千个公益漏洞&#xff1f;是不是觉得很牛逼&#xff1f;其实不然&#xff0c;都不难&#xff0c;其实如果我要是想刷这玩意&#xff0c;可以交不完的漏洞&a…...

在曹妃甸哪里可以吃到当天现捕上来的野生海鲜?

在曹妃甸&#xff0c;想要吃到当天现捕上来的野生海鲜&#xff0c;高尚堡老刘海鲜绝对是个绝佳的选择。2006 年&#xff0c;一群世代靠海吃海的渔民&#xff0c;在渤海湾码头开起了这家“老刘海鲜饭店”。起初他们只是想把自家渔船捕捞的野生海鲜&#xff0c;用最朴素的做法端给…...

C++ 静态成员的生命周期管理

C静态成员的生命周期管理是面向对象编程中一个既基础又关键的话题。静态成员作为类的特殊成员&#xff0c;其生命周期与普通成员变量截然不同&#xff0c;理解它们的初始化、销毁时机以及线程安全等问题&#xff0c;对于编写健壮高效的C代码至关重要。本文将深入探讨静态成员的…...

Unity游戏开发:如何用UniTask实现可撤销的异步流程(附完整代码)

Unity游戏开发&#xff1a;UniTask实现可撤销异步流程的工程实践 在游戏开发中&#xff0c;异步操作的管理一直是让开发者头疼的问题。想象这样一个场景&#xff1a;玩家在教学关卡中反复尝试某个操作&#xff0c;需要随时回退到上一步&#xff1b;或者在剧情分支选择时&#…...

Qt安卓开发实战:从红米K60调试到多机型适配指南

1. Qt安卓开发环境准备 搞Qt安卓开发&#xff0c;首先得把环境搭好。这里假设你已经按照官方文档或者教程配置好了Qt Creator和Android SDK/NDK。如果还没搞定&#xff0c;建议先去Qt官网把Android开发套件下载齐全&#xff0c;包括&#xff1a; Qt for Android&#xff08;建议…...

告别串口!STM32F105RCT6的ITM调试秘籍:从零配置到华为/高通项目级日志封装

STM32F105RCT6 ITM调试实战&#xff1a;企业级日志系统设计与性能优化 在嵌入式开发领域&#xff0c;调试效率直接影响项目进度和质量。传统串口调试方式虽然简单易用&#xff0c;但在处理复杂企业级项目时往往显得力不从心。本文将深入探讨基于STM32F105RCT6的ITM调试技术&…...

Vue-Vben-Admin主题定制实战指南:从原理到实现的深度探索

Vue-Vben-Admin主题定制实战指南&#xff1a;从原理到实现的深度探索 【免费下载链接】vue-vben-admin vbenjs/vue-vben-admin: 是一个基于 Vue.js 和 Element UI 的后台管理系统&#xff0c;支持多种数据源和插件扩展。该项目提供了一个完整的后台管理系统&#xff0c;可以方便…...