Selenium常用API详解,从入门到进阶(全套)

news2024/11/16 15:55:35

目录

1、打开页面

2、查找页面元素

3、输入文本

4、点击操作

5、提交操作

6、清除文本

7、获取文本、属性

8、获取页面的标题和URL

9、窗口

9.1、设置窗口大小

9.2、窗口切换

9.2.1、为什么需要窗口切换?

9.2.2、获取句柄的方式

9.2.3、切换句柄

10、屏幕截图

10.1、为什么需要屏幕截图

10.2、屏幕截图应用

11、等待

11.1、强制等待

11.2、隐式等待

11.3、显示等待

12、浏览器导航

12.1、前进、后退、刷新

13.弹窗

13.1、弹窗类型

13.2、处理弹窗的步骤

13.3、示例

14、选择框

14.1、处理步骤

14.2、示例

15、执行脚本

16、文件上传

16.1、使用方式

16.2、示例

17、浏览器参数设置

结语


1、打开页面


在Selenium中,通过在ChromeDriver类中的get方法里输入网址,即可打开一个页面,例如你要打开百度的网址,如下代码:

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

Ps:本文讲的所有API都是基于谷歌浏览器驱动,也就是ChromeDriver类下的API~

2、查找页面元素


在Selenium中,在打开页面的情况下,通过indElement方法,输入By类(通过什么方式来定位元素)参数,即可定位页面元素。

例如定位百度页面的“百度一下”按钮,如下代码:

driver.findElement(By.cssSelector("#su"));//#su就是"百度一下"的CSS选择器

上述栗子中使用的是CSS选择器定位,你也可以使用xpath来定位~

详细的,如下:

By类中最常用的两个定位方法:

1. cssSelector(),它可以通过css选择器来定位元素;(推荐使用)

2. className(),它可以通过xpath来定位元素;

xpath如何使用呢?

最常用的是用层级的方式来表示: /子级 //跳级;(@为属性)

例如:谷歌浏览器中的Google标志

这样你就可以拿到这个标签的xpath://*[@id="logo"] 这便是跳级(前面的路径都不显示,直接表示属性id=“logo”这个标签)

或者是xpath://*[@id="csdn-copyright-footer"]/ul[1]/li[2]/a 这便是一个跳级加子集的方式;

值得注意的是:我们不要一个一个去推这个子集表示的方式,可以直接按照上图的方式进行拷贝xpath路径,配合着className()方法使用即可,但是有时候赋值selector或者xpath元素不一定是唯一的,需要我们进行手动修改到唯一(检查的时候通过 ctrl + f 即可检查是否唯一),这就是为什么我们要对xpath的语法要有一定了解的原因;

3、输入文本


在Selenium中,使用sendKeys方法即可对你选中的元素进行输入文本,但是仅适用于文本文字和内容可以编辑的元素,例如在百度页面的搜索框内输入“你好”,如下代码:

//先使用findElement定位元素(返回一个WebElement类型的元素),再对定位的元素进行输入文本
driver.findElement(By.cssSelector("#kw")).sendKeys("你好");

Ps:即使反向操作,也就是对不可编辑的元素进行操作,也不会报错,但是不会产生任何实际效果。

4、点击操作


在Selenium中,对你定位到的元素使用click方法,即可进行鼠标点击操作,例如点击百度界面的“百度一下”按钮,代码如下:

//先使用findElement定位元素(返回一个WebElement类型的元素),再进行click
driver.findElement(By.cssSelector("#su")).click();

5、提交操作


提交操作是干什么的?实际上就和你按下Enter键的效果是一样的,通过submit方法即可实现,例如在百度页面通过submit方法实现自动按下回车键,如下代码:

//先使用findElement定位元素(返回一个WebElement类型的元素),再进行submit
driver.findElement(By.cssSelector("#su")).submit();

Ps:selenium官方不推荐使用submit,更推荐click,因为可以使用submit的地方click都能代替,并且click使用场景更广(submit仅适用于表单元素)。

6、清除文本


在Selenium中,可以使用clear将你定位的元素的文本内容进行清除,例如清除百度输入框中的文本,如下代码:

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

Ps:用来频繁的测试是否可以重复输入(适用sendKeys输入后,在用clear清除、再输入然后清除......)。

7、获取文本、属性


在Selenium中,通过getText可以获取你定位的元素的文本,例如获取百度页面热搜中的文本,如下代码:

//获取到的文本返回值是一个String类型
String text = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();
System.out.println(text);

但如果你要获取“百度一下”这个按钮的文本就无法获取(但程序不会报错,只是返回一个空字符串),因为这个元素它不含文本,只有一些属性(id、class、type、value......),如下F12检查可以看到:

所以我们只能获取它的属性,那么属性该如何获取呢?通过getAttribute方法即可获取到,方式和获取文本一样,先定位元素,再获取;例如你要获取class属性,那么就是getAttribute("class);

8、获取页面的标题和URL


在Selenium中,这个没什么特别要注意的点,基础操作,直接上代码:

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

9、窗口


9.1、设置窗口大小

在Selenium中,可以设置窗口的大小:最大化、最小化、全屏窗口、手动设置窗口大小;如下代码:

        //窗口最大化
        driver.manage().window().maximize();
        //窗口最小化
        driver.manage().window().minimize();
        //全屏
        driver.manage().window().fullscreen();
        //手动设置大小(按顺序分别是宽和高)
        driver.manage().window().setSize(new Dimension(1024, 500));

9.2、窗口切换

9.2.1、为什么需要窗口切换?

想象这样一个场景,我们使用Selenium打开一个网页,在从这个网页通过click点击超链接打开另一个网页,那么我们继续使用Selenium操作网页时,是对刚刚这两个网页中的哪一个网页进行操作?实际上还是第一个网页,如果你一意孤行还认为是对第二个网页进行操作,就有可能引发如下异常:(找不到该元素)

实际上,当浏览器每次打开一个标签页的时候,都会自动给每个标签页进行标识,也叫做“句柄”。

9.2.2、获取句柄的方式

在Selenium中,我们有如下两种方式获得句柄:

        //获取所有标签页的句柄
        Set<String> handles = driver.getWindowHandles();
        //获取当前页面的句柄
        String curHandle = driver.getWindowHandle();

并且哪个页面对应哪个句柄,我们是不可知的,例如我打开了两个页面,获取句柄并打印,如下:

9.2.3、切换句柄

        //获取当前页面的句柄
        String curHandle = driver.getWindowHandle();
        //切换到curHandle句柄
        driver.switchTo().window(curHandle);

Ps:自动化基本没有需要切换窗口的场景,因为要进行测试,就直接拿到这个网页的地址即可,没必要这样切换!

10、屏幕截图


10.1、为什么需要屏幕截图

        想象一下,程序执行的速度 和 页面渲染的速度 谁快?必然是程序执行快,那么当代码执行到查找结果页的元素时,页面还没有加载完全,程序就会报错,如下代码:

    public void test2() {
        ChromeDriver driver = new ChromeDriver();
        //打开百度页面
        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 > h3 > a")).click();
        driver.close();
    }

报错,如下图(找不到该元素)

解决办法:在点击“百度一下”这个按钮以后,休眠几秒即可(等待页面加载出来)。

但是自动化程序执行的速度非常快,我们怎么能知道这个地方出了什么问题呢?接着往下看~

10.2、屏幕截图应用

首先需要在pom.xml中导入依赖,如下:

        <!--   保存屏幕截图文件需要用到的包     -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

接着如下代码:

    public void test2() throws IOException {
        ChromeDriver driver = new ChromeDriver();
        //打开百度页面
        driver.get("https://www.baidu.com");
        //在输入框中输入"你好"
        driver.findElement(By.cssSelector("#kw")).sendKeys("你好");
        //点击“百度一下”按钮
        driver.findElement(By.cssSelector("#su")).click();

        //屏幕截图(保存现场)
        File srcfile = driver.getScreenshotAs(OutputType.FILE);//FILE表示以文件的形式保存
        //把截图保存到指定路径下
        String filename = "my.png";//没输入路径,就是当前项目下
        FileUtils.copyFile(srcfile, new File(filename));

        //点击一个搜索结果
        driver.findElement(By.cssSelector("#\\31  > div > div > h3 > a")).click();
        driver.close();
    }

接着就可以观察到截图如下:

这样我们就可以发现原因,是由于页面没有加载出来的原因~

Ps:保存截图的时候,文件名时固定的格式(已经存在重名文件),程序多次生成的截图都会被同名覆盖,为了避免这个情况,我们可以将文件名设置为动态的,也就是加入时间戳

11、等待


我们知道,程序执行的速度要比浏览器渲染的速度要快很多,那么就有可能出现这样一种情况,例如当使用自动化打开一个页面后需要选中这个页面中的一个元素,但是由于由于执行的太快,在页面还没有渲染出来的情况下(被选中的元素还没有出现),就选中这个元素,程序就会报错,为了解决这种情况,有四种等待方式来解决,下面我来讲解一下:

11.1、强制等待

强制等待就是通过线程阻塞来进行,也就是我们熟知的 Thread.sleep() ,这种方式在自动化中会用到,但是用的不是很多,为什么呢?每一个自动化方法就是一个测试用例,假设一个用例你设置2s的等待时间,那么100个测试用例就是100s,效率十分低下,而且很大概率,在我们设置的等待时间之内,页面就已经渲染出来了。

11.2、隐式等待

隐式等待作用于driver的整个生命周期,会在你设置的一个时间内,反复判断元素是否存在,直到元素被找到才停止等待(类似于自旋锁的自旋操作),若超出时间,就执行下一步;

例如,通过自动化 打开百度网址->输入"你好"->点击百度一下按钮->点击"你好——百度百科",整个过程隐式等待,如下代码:

    private ChromeDriver driver = new ChromeDriver();
    public void test1() {
        //隐式等待——作用driver的整个生命周期,直到quit(设置时间为3秒)
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        
        //打开百度网页
        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 > h3 > a")).click();
        //退出
        driver.quit();
    }

Ps:Duration这个类中的等待单位有很多种,可以是毫秒、秒、小时...如下:

 

11.3、显示等待

当等待的条件满足后(一般用来判断需要等待的元素是否加载出来),就继续下一步操作。等不到就一直等,如果在规定的时间之内都没找到,那么就跳出Exception,和隐式等待不同的是,显示等待一般作用某一条代码。

例如,通过自动化 打开百度网址 -> 输入"你好" -> 点击百度一下按钮 -> 显示等待"你好——百度百科"元素出现 -> 点击"你好——百度百科",如下代码:

    private ChromeDriver driver = new ChromeDriver();
    public void test2() {
        //打开百度网页
        driver.get("https://www.baidu.com");
        //在搜索框输入"你好"
        driver.findElement(By.cssSelector("#kw")).sendKeys("你好");
        //点击百度一下
        driver.findElement(By.cssSelector("#su")).click();

        //显示等待 “你好——百度百科”元素出现
        new WebDriverWait(driver, Duration.ofSeconds(3)).until(
                driver->driver.findElement(By.cssSelector("#\\31  > div > div > h3 > a"))
        );

        //退出
        driver.quit();
    }

Ps:until就表示等待的元素,也就是一直等待到xxx元素出现

12、浏览器导航


12.1、前进、后退、刷新

就是通过自动化控制如下三个按钮:

例如,打开百度 -> 输入"你好" -> 点击百度一下按钮 -> 后退到百度主页 -> 前进到"你好" -> 刷新当前网页 ,如下代码:

    private ChromeDriver driver = new ChromeDriver();
    public void test3() {
        //打开百度
        driver.get("https://www.baidu.com/");
        //输入框输入"你好"
        driver.findElement(By.cssSelector("#kw")).sendKeys("你好");
        //点击“百度一下”按钮
        driver.findElement(By.cssSelector("#su")).click();

        //回退
        driver.navigate().back();
        //前进
        driver.navigate().forward();
        //刷新
        driver.navigate().refresh();

        driver.quit();
    }

13.弹窗


13.1、弹窗类型

共有以下三种弹窗

13.2、处理弹窗的步骤

a)将driver对象作用到弹窗上(切换到弹窗)

driver.switchTo.alert()

b)得到弹窗对象后,选择 确认/取消/输入文本(提示弹窗)

确认:accept();

取消:dismiss();

输入(提示弹窗):sendKeys();

注意:

1.提示弹窗输入文本,在页面上是看不到输入文本的执行效果。

2.虽然警告弹窗只有确认按钮,但是accept和dismiss都能处理。

3.虽然警告弹窗和确认弹窗都没有输入文本的地方,凡是如果要执行alert.sendKeys代码,也不会报错。

13.3、示例

a)出现提示弹窗,进行输入文本,并点击确认,如下代码:

        //将driver作用对象切换到弹窗上
        Alert alert = driver.switchTo().alert();
        //输入文本
        alert.sendKeys("hello");
        //点击确认
        alert.accept();

b)出现确认弹窗,点击取消,如下代码:

        //将driver作用对象切换到弹窗上
        Alert alert = driver.switchTo().alert();
        //点击取消
        alert.dismiss();

14、选择框


14.1、处理步骤

在Selenium执行自动化的过程中,我们知道,没法通过F12检查对选择框中的选项进行选择,实际上,可以通过以下三种方式进行选择:

  1. 根据文本来选择;
  2. 根据属性值来选择;
  3. 根据序号来选择(序号是从0开始的);

文本、属性值、序号又是什么呢?如下图:

注意:序号是从上往下,从0开始数。

14.2、示例

对一个选择框分别进行文本、属性、序号的选择,如下代码:

        //得到选择框对象
        WebElement ele = driver.findElement(By.cssSelector("#ShippingMethod"));
        //创建选择框对象
        Select select = new Select(ele);
        //根据文本来进行选择
        select.selectByVisibleText("UPS Next Day Air ==> $12.51");
        //根据属性来进行选择
        select.selectByValue("12.51");
        //根据序号来进行选择
        select.selectByIndex(0);

15、执行脚本


实际上就是执行js代码

使用方法如下代码:

driver.executeScript();//参数是js代码

16、文件上传


16.1、使用方式

使用方式很简单,如下代码:

sendKeys("文件的绝对路径");

16.2、示例

如下场景:

 例如我要上传D盘下的test.txt文件,代码如下:

        //选择“上传文件按钮”
        WebElement ele = driver.findElement(By.cssSelector("body > div > div > input[type=file]"));
        //上传文件
        ele.sendKeys("D:\\test.txt");

执行效果如下:

Ps:注意上图中的test.txt文件,并不是直接上传到服务器了,而是把要上传的文件的绝对路径放在了这里;

17、浏览器参数设置


实际的工作中,测试人员将自动化部署在机器上自动执行,测试人员不会每次都一直盯着自动化执行的过程,而是直接查看自动化执行的结果。

ChromeDriver类提供了一个构造参数,可以实现以上场景,也叫做“无头模式”。

如下代码:

        ChromeOptions options = new ChromeOptions();
        options.addArguments("-headless");
        ChromeDriver driver = new ChromeDriver(options);

Ps:浏览器的参数设置需要在创建浏览器对象之前。

结语


如果文章对你有帮助,

 

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

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

相关文章

秒杀项目之商品展示及商品秒杀

目录 登录方式调整 生成秒杀订单 绑定秒杀商品 查看秒杀商品 订单秒杀 移除seata相关 生成秒杀订单 前端页面秒杀测试 登录方式调整 第1步&#xff1a;从zmall-common的pom.xml中移除spring-session-data-redis依赖 注意&#xff1a; 1&#xff09;本章节中不采用spri…

Python获取搜索引擎结果

前言 想快速获取各个高校的博士招生网站&#xff0c;于是通过python先获取出有可能包含高校博士招生网站的URL&#xff0c;然后通过人为筛选得到了想要的招生网站&#xff08;注意&#xff0c;并非直接爬取&#xff0c;是间接获取的&#xff09;。 整理了一份网站名单&#x…

ModSecurity网站防火墙安装教程加WEB防御规则设置

ModSecurity安装教程加核心防御规则 资源宝分享&#xff1a;www.httple.net ModSecurity简介 ModSecurity-官网: ​​http://www.modsecurity.cn​​ ModSecurity是目前世界上使用最多的开源WAF产品&#xff0c;可谓是WAF界的鼻祖&#xff0c;跨平台的Web应用防火墙&#xff08…

学习open62541 --- [75] 生成namespace文件的简便方法

在之前的文章中&#xff0c;生成namespace文件是使用open62541提供的nodeset_compiler.py&#xff0c;根据nodeset_compiler.rst&#xff08;位于open62541/doc/&#xff09;里的描述&#xff0c;有更好的方法&#xff1a;使用cmake命令ua_generate_nodeset_and_datatypes来生成…

ChatGPT可以写文章吗?来看看他对卷积神经网络的解释是否准确

文章目录提问chatGPT的回答第一次回答第二次回答结果提问 chatGPT的回答 在回答时候由于字数限制它不能一口气输出全部结果&#xff0c;此时可以采用两种方法让它继续输出&#xff1a; 复制它的上一步回答给它&#xff0c;它会接着回复直接发送继续&#xff0c;它也会接着回复…

体验100问 | 「体验管理」是一个正确的职业选择吗?

Guofu 第 84⭐️ 篇原创干货分享&#xff08;点击&#x1f446;&#x1f3fb;上方卡片关注我&#xff0c;加⭐️星标⭐️~&#xff09;Q003&#xff1a;体验管理是一个正确的职业选择吗&#xff1f;&#x1f914; 龙国富说: 1、职业选择应该去寻求“不变”的事情这件事其实在我…

DS期末复习卷(三)

选择题 某数据结构的二元组形式表示为A(D&#xff0c;R)&#xff0c;D{01&#xff0c;02&#xff0c;03&#xff0c;04&#xff0c;05&#xff0c;06&#xff0c;07&#xff0c;08&#xff0c;09}&#xff0c;R{r}&#xff0c;r{<01&#xff0c;02>&#xff0c;<01&a…

淘宝API接口系列,获取购买到的商品订单列表,卖出的商品订单列表,订单详情,订单物流,买家信息,收货地址列表,买家token

custom自定义API操作buyer_order_list获取购买到的商品订单列表buyer_order_detail获取购买到的商品订单详情buyer_order_express获取购买到的商品订单物流buyer_address_list收货地址列表buyer_address_add添加收货地址buyer_info买家信息buyer_token买家tokenseller_order_li…

类的继承

类的继承&#xff1a;一个类继承另一个类&#xff0c;自动拥有这个类的属性和方法&#xff0c;类似于包含与被包含的关系。被继承的类称为父类--子类则是继承父类的类。一个父类可以有多个子类&#xff1b;一个子类可以有多个父类&#xff08;多继承&#xff09;问题创建子类时…

CUDA中的流序内存分配

文章目录CUDA中的流序内存分配1. Introduction2. Query for Support3. API Fundamentals (cudaMallocAsync and cudaFreeAsync)4. Memory Pools and the cudaMemPool_t注意&#xff1a;设备的内存池当前将是该设备的本地。因此&#xff0c;在不指定内存池的情况下进行分配将始终…

测试开发之Django实战示例 第七章 创建电商网站

第七章 创建电商网站在上一章里&#xff0c;创建了用户关注系统和行为流应用&#xff0c;还学习了使用Django的信号功能与使用Redis数据库存储图片浏览次数和排名。这一章将学习如何创建一个基础的电商网站。本章将学习创建商品品类目录&#xff0c;通过session实现购物车功能。…

java流浪动物救助系统(毕业设计)

项目类型&#xff1a;Java web项目/Java EE项目&#xff08;非开源&#xff09; 项目名称&#xff1a;基于JSPServlet的流浪动物救助网站[dwjz_web] 进行源码获取 用户类型&#xff1a;双角色&#xff08;爱心人士、管理员&#xff09; 项目架构&#xff1a;B/S架构 设计思…

全景拼接python旗舰版

前言在这个项目中&#xff0c;您将构建一个管道&#xff0c;将几幅图像拼接成一个全景图。您还将捕获一组您自己的图像来报告最终的结果。步骤1 特征检测与描述本项目的第一步是对序列中的每幅图像分别进行特征检测。回想一下我们在这个类中介绍过的一些特征探测器&#xff1a;…

KDS安装步骤

KDS kinetis design studio 软件 第一步官网(https://www.nxp.com/ 注册账号下载set成功下载软件。 随着AI&#xff0c;大数据这些技术的快速发展&#xff0c;与此有关的知识也普及开来。如何在众多网站中寻找最有价值的信息&#xff0c;如何在最短的时间内获得最新的技…

家政服务小程序实战教程09-图文卡片

小程序还有一类需求就是展示服务的列表&#xff0c;我们这里用图文卡片组件来实现&#xff0c;我们先要添加一个标题&#xff0c;使用网格布局来实现 第一列添加一个文本组件&#xff0c;第二列添加一个图标组件 修改文本组件的文本内容&#xff0c;设置外边距 设置第二列的样式…

PHP session反序列化漏洞

session请求过程&#xff1a; 当第一次访问网站时&#xff0c;Seesion_start()函数就会创建一个唯一的Session ID&#xff0c;并自动通过HTTP的响应头&#xff0c;将这个Session ID保存到客户端Cookie中。同时&#xff0c;也在服务器端创建一个以Session ID命名的文件&#xff…

Netty网络应用基础

文章目录前言一、基础概念狭义网络网络应用工程库二、总体框架三、应用分层总结前言 开始之前&#xff0c;咱们先澄清一些基础概念、总体框架和应用分层&#xff0c;避免在后续的讨论中给大家带来误解。 一、基础概念 狭义网络 常规Java后端开发中应用到的计算机网络&#x…

【ArcGIS Pro二次开发】(2):创建一个Add-in项目

Add-In即模块加载项&#xff0c;是一种能够快速扩展桌面应用程序功能的全新扩展方式。 一、创建新项目 1、打开VS2002&#xff0c;选择创建新项目。 2、在搜索框中输入“arcgis pro”&#xff0c;在搜索结果中选择【ArcGIS Pro 模块加载项】创建项目&#xff0c;注意选择语言应…

OpenSSL发布修复程序以解决多个安全漏洞!

OpenSSL 项目已发布修复程序以解决多个安全漏洞&#xff0c;包括开源加密工具包中的一个高严重性错误&#xff0c;该错误可能会使用户遭受恶意攻击。 国际知名白帽黑客、东方联盟创始人郭盛华表示&#xff0c;该问题被追踪为CVE-2023-0286&#xff0c;与类型混淆有关&#xff…

激光雷达相关技术

一、参考资料 17篇点云处理综述-点云语义分割、点云物体检测、自动驾驶中的点云处理…… #三维视觉 #点云 3D点云数据标准 自动驾驶之心 自动驾驶之心-专栏 二、重要信息 1. 黑车检测难题 从2018年至今&#xff0c;高线数机械式激光雷达的测距能力一直停留在200米10%反…