自动化测试 selenium

news2025/1/20 5:54:58

目录

一、了解自动化测试和selenium

1. 什么是自动化测试?为什么要使用自动化测试?

2. 为什么使用selenium?

3. 环境部署

4. 什么是驱动?驱动的工作原理

5. selenium 的依赖代码

二、selenium 的基础语法

1. 元素的定位

(1)css选择器的定位

(2)xpath 路径

2. 元素的操作

(1)点击:click() ;提交:submit()

(2)模拟按键输入:sendKeys()

(3)清除文本内容 clear()

(4)获取文本 getText()

 3. 等待

(1)强制等待

(2)隐式等待

(3)显式等待

4. 信息的打印

5. 窗口

(1)窗口的切换

(2)窗口的大小

(3)页面的上下滚动

6. 导航

(1)前进

(2)后退

7. 警告框(弹窗)

8. 鼠标和键盘的操作

(1)鼠标

(2)键盘

9. 选择框

10. 文件上传

11. 屏幕截图


一、了解自动化测试和selenium

1. 什么是自动化测试?为什么要使用自动化测试?

        自动化测试能够代替一小部分的手工测试,提高测试的效率。比如在回归测试时,当软件的版本不断跟新,而以前的每一个旧的版本仍然需要进行测试,如果是手工测试的话,效率会大大降低,所以我们需要借助自动化测试来进行回归测试。 

2. 为什么使用selenium?

(1)开源免费

(2)支持多浏览器。(Chrome、Firefox、IE、edge、Safari(Mac默认浏览器)....)

(3)支持多系统。(Linux、Windows、MacOS....)

(4)支持多语言。(Java、Python...)

(5)selenium 底层实现了很多可供我们使用的API。

3. 环境部署

  • selenium 工具包
  • Chrome浏览器
  • Chromedriver谷歌驱动
  • java版本最低要求8

4. 什么是驱动?驱动的工作原理

        类似汽车的驱动一样,汽车有两轮驱动、四轮驱动,可以让那个汽车跑起来。这里的驱动是指打开浏览器。

        因为要使用自动化测试,人工测试要打开浏览器,自动化测试里就使用驱动来打开浏览器。我们可以通过代码来让驱动打开浏览器。

selenium 和 驱动 和 浏览器 之间的关系:

根据图中,代码要发送请求,驱动要接收请求、解析请求。因此这里是驱动就是一个服务器。其IP:127.0.0.1,端口号:9515 。(可以打开驱动的文件看到)

5. selenium 的依赖代码

        在Maven项目中的 pom.xml 中导入 selenium 的依赖。(也可以在Maven Repository: Search/Browse/Explore  搜索selenium 找到依赖代码) 

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.0.0</version>
        </dependency>
    </dependencies>

二、selenium 的基础语法

1. 元素的定位

driver.findElement() : 定位页面的元素

参数:抽象类By里的方法,如cssSelector、xpath、id、name、classname。

(下面的代码只是使用方法代码,进行自动化测试还要加上 获取drive对象,传入百度的URL。最后还要关闭驱动)

(1)css选择器的定位

css选择器:

  • 基础选择器:id选择器、类选择器、标签选择器...
  • 符合选择器:子类选择器、父类选择器...
    public void dingwei_Test1(){
        //1. css选择器的定位
        String xwtext = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).getText();
        //将结果在控制端进行显示,方便看操作
        System.out.println("xwtext : " + xwtext);
    }

(2)xpath 路径

        定位元素必须要唯一。

语法:

  • 层级:/ 次级;// 跳级
  • 属性:@
  • 函数:contains() .....
    public void dingwei_Test2() throws InterruptedException {
        //2. xpath选择器
        driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("selenium");
        driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
        Thread.sleep(2000);
        driver.findElement(By.xpath("//*[@id=\"2\"]/div/div/h3/a")).click();
        Thread.sleep(2000);
    }

2. 元素的操作

(1)点击:click() ;提交:submit()

        click 和 submit (回车)都可以操作按钮,但是可以click 不一定可以 submit。只要是页面元素都可以 click。

    public void control_Test1() throws InterruptedException {
        //1. click点击行为
        //点击百度一下
        driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
        Thread.sleep(2000);
        //点击百度热搜里的一个链接
        driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(4) > a > span.title-content-title")).click();
        Thread.sleep(2000);
    }

    public void control_Test2() throws InterruptedException {
        //2. submit提交行为
        driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
        Thread.sleep(2000);
        driver.findElement(By.cssSelector("#su")).submit();
        Thread.sleep(2000);
    }

(2)模拟按键输入:sendKeys()

driver.findElement(By.cssSelector("#kw")).sendKeys("#@$@^@$");

(3)清除文本内容 clear()

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

(4)获取文本 getText()

        要分清是文本内容,还是属性值。

获取文本内容:getText()

获取属性值:getAttribute()

获取文本内容:

    public void control_Test5() {
        //5.获取文本内容
        String str = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();
        System.out.println("预期输出:端牢中国饭碗 综合实施保夏收; 实际输出:" + str);
    }

 获取属性值:

    public void control_Test6() {
        //6. 获取属性值
        String str = driver.findElement(By.cssSelector("#su")).getAttribute("value");
        System.out.println("预期获取的属性值:百度一下  实际输出:" + str);
    }

 3. 等待

        代码的执行速度比较快,当我们跳转到新的页面的时候,前端的代码还需要一定的时间锦绣柠渲染。因此我们不能在前端页面渲染的时候就执行下一条语句。因此要使用等待。

(1)强制等待

        让程序暂停一会,等待指定的时间之后再让程序正常运行。(这个时间要人为的自己规定,不能太短也不能太长)

Threat.sleep(2000)

    public void WaitTest1() {
        //1. 强制等待:使用Thread.sleep
        driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
        //强制等待2秒
        Thread.sleep(2000);
        //点击百度热搜里的一个链接
        driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(4) > a > span.title-content-title")).click();
        //再强制等待2秒
        Thread.sleep(2000);
    }

优点:语法简单,适合调试的时候使用。

缺点:每次都等待固定的时间,造成时间的大量消耗。减小了自动化测试的效率。

(2)隐式等待

        在规定的时间范围内,一轮询的方式执行。当要执行的元素可以定位,就结束等待,如果没有在规定的时间内定位到,就轮询的方式一直判断。

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));

优点:节省了大量的等待时间。

缺点:要等到所有元素全部显示才会执行,仍有不必要的时间浪费。

(3)显式等待

        针对某一个元素的显示来进行等待。

WebDriverWait foo = new WebDriverWait(driver,Duration.ofSeconds(3));
foo.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("")));

第一个参数:webdriver对象

第二个参数:Duration 类方法,用于设置强制等待时间。 

until 方法:等待到括号里的条件满足为止。

优点:针对某一个元素进行等待,大大缩短了等待时间。

缺点:写法更为复杂。

4. 信息的打印

打印标题:gettitle()

String str = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();

打印属性:getAttribute()

String str = driver.findElement(By.cssSelector("#su")).getAttribute("value");

5. 窗口

(1)窗口的切换

        selenium 不知道要切换哪一个页面,所以就直接操作打开的第一个页面。当我们想操作新打开的新页面的时候,就要手动切换句柄。否则不能找到新页面的元素。(选择器选择不到,会报错)

获取当前的页面的句柄:driver.getWindowHandle()    返回值:String

String str = driver.getWindowHandle();

获取所有页面的句柄:driver.getWindowHandles()   返回值:Set

Set<String> set = driver.getWindowHandles();

切换到指定的句柄:driver.switch.window(句柄)

        Set<String> set = driver.getWindowHandles();
        for(String str : set) {
            if (!str.equals(driver.getWindowHandle())) {
                driver.switchTo().window(str);
            }
        }

(2)窗口的大小

        描述窗口 driver.manage.window()

窗口的最大化:driver.manage.window.maxmize()

窗口的最小化:driver.manage.winsow.minmize()

    @Test
    public void testWindowSize(){
        WebDriver.Window window = driver.manage().window();
        window.maximize();
        window.minimize();
    }

指定窗口大小:driver.manage.window.setSize(new Dimension(宽度,高度))

(3)页面的上下滚动

driver.executeScripe(" "); 里面传的是JS代码。

6. 导航

driver.navigate()

(1)前进

driver.navigate().forward();

        //前进
        driver.navigate().forward();

(2)后退

driver.navigate().back();

        //后退
        driver.navigate().back();

7. 警告框(弹窗)

        使用接口Alert。

切换到警告框:Alert alert = driver.switchTo().alert();

点击确认按钮:alert.accept();

点击取消按钮:alert.dismiss();

输入信息:sendKeys(" ");

8. 鼠标和键盘的操作

        使用接口Actions。需要实例化一个Actions。

Actions actions = new Actions(driver);

(1)鼠标

移动到指定元素并保持:actions.clickAndHold(Webelement ele).perform();

    @Test
    public void testClick(){
        WebElement element = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title"));
        Actions actions = new Actions(driver);
        actions.clickAndHold(element).perform();
    }

移动到指定元素并点击:actions.click().perform();

    @Test
    public void testClick2(){
        WebElement element = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title"));
        Actions actions = new Actions(driver);
        actions.click(element).perform();
    }

(2)键盘

sendKeys(" ");

9. 选择框

        使用类 Select。先实例化一个对象。

Select select = new Select(Webelement ele);

选择方法有三种:

通过索引来选择: selece.selectByIndex(); 参数:索引值,从0开始。

通过value属性来选择:select.selectByValue("value");

通过可见的文本来选择:select.selectByvisibleText(" ");

10. 文件上传

        selenium 不能操作系统的窗口。

巧方法:使用sendKeys,传入文件的路径 + 文件名。

driver.finElement(By.).sendkeys(" 文件的路径 + 文件名 ");

11. 屏幕截图

进行截图:File srcfile = driver.getScreenshotAs(OutputType.File);  以文件形式保存

截图保存到指定路径下:

File filename = new File("路径 + 指定的截图名");

FileUtils.copyFile(srcfile, filename);

        一般将屏幕截图的方法写在Common类中,在要用的方法的里面直接调用。

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

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

相关文章

二叉树的序列化(serialization)与反序列化(de-serialization)

目录 1. 概要 2. 用一维数组表示二叉树 3. python实现 3.1 二叉树节点的表示 3.2 串行化的python实现 3.3 反串行化的python实现 3.4 测试 1. 概要 本文简要介绍二叉树的序列化处理和反序列化处理及对应的python实现。 二叉树通常为了方便而以一维数组&#xff08;比如…

mysql 库的操作

文章目录 mysql 库的操作1. 创建数据库创建数据库案例 2. 字符集和校验规则查看系统默认的字符集合校验规则查看数据库支持的字符集查看数据库支持的字符集较验规则校验规则对数据库的影响 3. 操作数据库查看数据库显示创建语句修改数据库删除数据库查看数据库连接情况 mysql 库…

强化学习:值迭代和策略迭代

值迭代 通过上一章的学习&#xff0c;我们知道了贝尔曼最优方程的求解实际上分两部分&#xff0c;一是给定一个初始值 v k v_k vk​ 找到最优策略 π k 1 π_{k1} πk1​ &#xff0c;二是更新 v k 1 v_{k1} vk1​   下面&#xff0c;我们将详细剖析这个算法&#xff0…

Java字节流battle字符流

目录 Java字节流&#xff08;Byte Stream&#xff09; FileInputStream和FileOutputStream Java字符流&#xff08;Character Stream&#xff09; FileReader和FileWriter 如何在使用是区分什么时候用输出什么时候用输入 Write方法 close方法 Java中的close方法本身抛出…

基本定时器工作模式

计数和定时 BasicTimer支持8位或16位向上计数模式。当计数值大于等于比较寄存器&#xff08;CMPH、CMPL&#xff09;&#xff0c;会产生计数中断标志&#xff0c;并从自动重载寄存器&#xff08;LOADH、LOADL&#xff09;加载新的比较值。这样可以实时调整每个计数周期的计数长…

python自动化测试-最常用的自动化测试框架

在开始学习python自动化测试之前&#xff0c;先了解目前市场上的自动化测试框架有哪些&#xff1f; 随着技术的不断迭代更新&#xff0c;优胜劣汰也同样发展下来。从一开始工具型自动化&#xff0c;到现在的框架型&#xff1b;从一开始的能用&#xff0c;到现在的不仅能用&…

Qt6.5 grpc组件使用 + golang grpc server示例

1. 资料 1) Protobuf 开发文档 https://protobuf.dev/ 2) protobuf安装指南 https://grpc.io/docs/protoc-installation/ 3) protoc 下载 https://github.com/protocolbuffers/protobuf/releases/tag/v23.1 2. Qt grpc 组件 & 工具 1) Qt6.5 安装目录下 xx\Qt\6.5.…

实验7 多用户界面、菜单以及对话框程序设计

实验内容 1.设计一个具有两个页面的程序&#xff0c;第一个页面显示一张封面的图片&#xff0c;第二个页面显示“欢迎进入本系统”,这两个页面之间能相互切换。    2.设计一个具有3个选项的菜单程序&#xff0c;当单击每个选项时&#xff0c;分别跳转到3个不同的页面。 3.设…

快速搭建一个 Kubernetes+Crane 环境,以及如何基于 Crane 优化你的集群和应用初体验

文章目录 一、活动介绍二、环境搭建三、安装本地的 Kind 集群和 Crane 组件四、界面截图五、主要功能六、整体架构七、Crane的优势八、总结参考文献 一、活动介绍 Crane 是由腾讯云主导开源的国内第一个基于云原生技术的成本优化项目&#xff0c;遵循 FinOps 标准&#xff0c;…

零基础如何入门网络安全?一般人还真不行

前景 很多零基础朋友开始将网络安全作为发展的大方向&#xff0c;的确&#xff0c;现如今网络安全已经成为了一个新的就业风口&#xff0c;不仅大学里开设相关学科&#xff0c;连市场上也开始大量招人。 那么网络安全到底前景如何&#xff1f;大致从市场规模、政策扶持、就业…

信息收集-目录信息

&#xff08;一&#xff09;目录结构 网页的目录结构跟整个网站的布局有关&#xff0c;收集到的信息可以包括目录名称、目录结构、目录所包含的文件、文件类型、文件大小等。收集到的信息有助于评估网站的安全性、了解网站的架构和目录结构&#xff0c;甚至可能有助于发现敏感…

3个月出国|材料科学老师自费赴韩国访学

K老师指定韩国为访学的目标国家&#xff0c;希望专业匹配&#xff0c;尽快出国。最终我们获得了韩国庆北大学的邀请函&#xff0c;其学校名气、专业匹配度及导师影响力都符合K老师的要求。本案例从开始委托我们申请到最终出国&#xff0c;仅仅用时3个月。 K老师背景&#xff1a…

基于pytest的接口测试框架详解,一定有你想知道的

目录 需求一&#xff1a;一套用例可以测试多套环境 需求二: 可以被jenkins调度执行 需求三 拥有测试报告 需求四&#xff1a;接口中某些字段值在每次请求中不重复 需求五&#xff1a; 可以多接口关联测试 需求六 构造的表数据可以和接口字段数据关联 需求七 pytest用例和…

java内部类和异常类1

文章目录 一、Java内部类二、Java匿名类总结 一、Java内部类 成员变量和方法&#xff0c;实际上&#xff0c;类还有一种成员&#xff1a;内部类。在一个类中定义另一个类&#xff0c;我们把这样的类称作内部类&#xff0c;包含内部类的类称作内部类的外嵌类。 内部类和外嵌类…

编辑距离00

题目链接 爬楼梯 题目描述 注意点 word1 和 word2 由小写英文字母组成返回将 word1 转换成 word2 所使用的最少操作数 解答思路 本题本质上的操作只有三种&#xff1a;在单词 A 中插入一个字符&#xff1b;在单词 B 中插入一个字符&#xff1b;修改单词 A 的一个字符&…

OpenGL之元素缓冲对象

文章目录 EBO(元素缓冲对象)创建元素缓冲对象创建两个相邻不同颜色的三角形 EBO(元素缓冲对象) 素缓冲对象(Element Buffer Object&#xff0c;EBO)&#xff0c;也叫索引缓冲对象(Index Buffer Object&#xff0c;IBO)。要解释元素缓冲对象的工作方式最好还是举个例子&#xf…

【Python redis】零基础也能轻松掌握的学习路线与参考资料

Python redis是一种非常流行的缓存数据库&#xff0c;对于Python Web应用程序开发非常有用&#xff0c;能快速地处理大量的数据请求。Python redis的学习路线需要对Python语言有深刻的理解&#xff0c;并了解使用redis的API。在掌握了Python redis的基本知识后&#xff0c;就可…

这个 希尔排序详解过程 我能吹一辈子!!!

文章目录 希尔排序概念希尔排序算法思路希尔排序实现 希尔排序概念 希尔排序&#xff08;Shellsort&#xff09;也是一种插入排序&#xff0c;它是简单插入排序经过改进之后的一个更高效的版本&#xff0c;也称为缩小增量排序。希尔&#xff08;Donald Shell&#xff09;于1959…

关系数据库设计理论

关系数据库设计理论 目录 关系数据库设计理论是什么函数依赖完全函数依赖(Full Functional Dependency)部分函数依赖(Partial Functional Dependency)传递函数依赖(Transitive Functional Dependency) 异常插入异常(Insertion Anomaly)更新异常(Update Anomaly)删除异常(Deleti…

Mit6.006-problemSession04

4-1 序列旋转 下面是一个序列AVL树T。执行操作T.delete_at(8)&#xff0c;该操作期间&#xff0c;每次旋转操作执行完后&#xff0c;画出该树。 4-2 Fick Nury Fick Nury领导n名超级英雄组成了精英团队——复仇者联盟。他听说&#xff1a;超人Sanos正在一个遥远星球上制造麻烦…