自动化测试selenium(2)

目录

WebDriver介绍

WebDriver使用

使用WebDriver驱动操作浏览器(打开一个百度)

WebDriver 相关API

定位元素

操作元素


上一篇主要介绍了自动化测试的概念以及selenium的基本原理, 这里我们来讲一下如何利用selenium来写测试用的脚本.

WebDriver介绍

Selenium是一个用于自动化网页浏览操作的工具, 而WebDriver是一个Selenium的一个子项目,它提供了一个用于控制各种浏览器的编程接口(也就是我们之前提到的浏览器驱动). 简单地说, WebDriver是Selenium的一个实现, 它提供了与浏览器交互的功能.

具体来说, WebDriver提供了一组API, 允许开发人员以编程的方式模拟用户在浏览器中进行的各种操作, 例如点击链接, 填写表单, 提交表单, 模拟键盘输入等等. 通过使用WebDriver, 开发人员可以编写自动化测试脚本, 来对网页进行功能测试, 界面测试等.

总之, Selenium和WebDriver是紧密相关的, WebDriver是Selenium的一部分, 提供了对浏览器的控制能力, 而Selenium是一个更广泛的项目, 包含了WebDriver在内的多个组件, 用于支持网页自动化测试等应用场景.

WebDriver使用

这里就不教大家如何搭建环境了, 建议跳转到其它地方自行搭建(主要作者比较懒). 然后后面的环境均为Chrome浏览器, 使用的语言是Java.

使用WebDriver驱动操作浏览器(打开一个百度)

直接给出代码:

    public static void test01() {ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");WebDriver webDriver = new ChromeDriver(options);webDriver.get("https://www.baidu.com/");}

 这段代码时使用WebDriver控制Chrome浏览器的一个典型案例, 下面解析一下代码:

1.ChromeOptions options = new ChromeOptions();

这是创建了一个ChromeOptions对象, 用于配置Chrome浏览器的选项.

2.options.addArguments("--remote-allow-origins=*")

这里使用这个参数即允许所有请求之意

3.WebDriver webDriver = new ChromeDriver(options);

使用ChromeOptions创建一个ChromeDriver对象, 这个对象将用于控制Chrome浏览器.

4.使用webDriver的get方法访问指定的URL.

WebDriver 相关API

定位元素

对象的定位应该是自动化测试的核心, 要想操作一个对象, 首先应该识别这个对象. 一个对象就是一个人一样, 他会有各种的特征(属性), 如我们可以通过一个人的身份证号,姓名, 或者他住哪个街道, 楼层, 门牌号找到这个人.

那么我们在百度中如何确定一个元素的位置呢, 这里就用到了定位元素的方法. 下面主要介绍两种.

(1)CSS选择器定位元素

就是用到了CSS里的语法

类选择器: .class值(.s_ipt)

id选择器: #id值 (#kw)

标签选择器: 标签名.

(2)xPath定位元素(xpath是一个语法)

绝对路径(通过 / 开头): /html/body/div/div/div(不常用).

相对路径(通过 // 开头):

1.相对路径 + 索引: //form/span[1]/input

2.相对路径 + 属性值: //input[@class="s_ipt"]

3.相对路径 + 通配符: //*[@*="s_ipt"]

4.相对路径 + 文本匹配: //span[text()="我是文本"]

如何选择:>

 

举例: 通过两种方式定位"百度搜索框"元素. 

​
//1.使用CSS选择器定位
//".s_ipt"表示通过这个类名来定位元素, 然后使用webDriver.findElement()方法来查找这个元素
WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
//2.使用XPath定位
//引号内是XPath表达式, 表示通过id属性为'kw'来定位元素, 然后使用webDriver.findElement()方法查找元素
WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));​

CSS选择器和XPath选择器的区别:

1. 语法: CSS选择器使用类似于CSS的语法, 选择器简单明了, 易于理解和书写.  XPath选择器语法比较复杂, 但更灵活

2.性能: 一般情况下, CSS选择器性能比XPath选择器更好. 因为浏览器在解析CSS选择器时, 可以直接使用底层的浏览器引擎优化, 而XPath则需要额外的解析和计算成本.

3.灵活性: XPath选择器要比CSS选择器更加灵活, 可以实现更复杂的定位逻辑.

4.可读性: CSS选择器通常更直观, 已于理解和维护, 特别是对简单的选择器. XPath选择器语法相对复杂, 可能不太容易理解, 特别是对于不熟悉XPath的开发者.

操作元素

前面降到了不少知识都是关于定位元素, 定位只是第一步, 定位之后需要对这个元素进行操作. 是鼠标点击还是键盘输入, 或者清除元素内容, 或者提交表单等. 这个取决于定位元素需要进行的下一步操作.

click 点击对象

sendKeys 在对象上模拟按键输入

clear 清除对象输入的文本内容

submit 提交

text 用于获取元素的文本信息

下面来举个栗子:

//找到百度搜索框
WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
//输入软件测试
element.sendKeys("软件测试");
//点击百度一下并点击
webDriver.findElement(By.cssSelector("#su")).click();
//清空输入框
element.clear();       

这样就可以轻松完成输入->点击->清空输入框这一系列操作. 

 通过getText()获取到页面的内容:

        //点击百度一下并点击webDriver.findElement(By.cssSelector("#su")).click();Thread.sleep(3000);//校验//找到搜索结果List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));for(int i = 0; i < elements.size(); i++) {System.out.println(elements.get(i).getText());}

运行结果:

通过这个写一个简单的测试脚本: 

//校验//找到搜索结果List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));int flag = 0;for(int i = 0; i < elements.size(); i++) {if(elements.get(i).getText().equals("软件测试")) {flag = 1;System.out.println("测试通过");break;}}if(flag == 0) {System.out.println("测试不通过");}

 而submit()方法顾名思义是用于提交表单, 让我们举个使用的栗子:

        //定位到百度搜索框WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));//输入要搜索的内容element.sendKeys("软件测试");//找到百度一下按钮WebElement button = webDriver.findElement(By.cssSelector("#su"));button.submit();

运行结果:

  

也是成功地跳转了, 而我们发现, 这个操作似乎与click()方法作用一致, 但是实际上仍是有一定去别的. 就是submit操作的元素需要放在from表单内, 而click则没有这个限制(所以更加推荐使用click()方法).

观察一下:

我们再使用一个没有form表单的来对比一下.

其中页面中"新闻"并没有在form表单内. 下面来写一个测试脚本.

    public static void test03() {ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");WebDriver webDriver = new ChromeDriver(options);webDriver.get("https://www.baidu.com/");webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();}

 运行结果:

很显然, 报错了, 因此我们不能对非form表单中的元素使用submit()方法.

添加等待

之前我们也学到过使用Thread.sleep(time_out)来进行强制等待, 在这里我们不再过多赘述.

这里我们学习一下只能等待.

 "智能等待"指的是在某些情况下, 没有其它更好的解决方案, 只能通过等待来解决问题. 在软件开发或自动化测试中, 经常会遇到需要等待某些条件满足的情况, 例如等待页面加载完成, 等待元素, 等待异步操作完成等.(突出体现在设定一定的时间, 不一定等待时间到了才操作, 当资源准备好之后, 在时间范围内即可操作).

在Web自动化测试中, 等待是一种常见技术, 用于处理页面加载速度,  网络延迟或异步操作等因素带来的不确定性. 通过等待, 可以确保在进行后续, 页面已经加载完成或者目标元素已经出现, 从而避免因为页面未完全加载或元素未出现而导致的测试失败或错误.

在Selenium WebDriver中, 提供了不同类型的等待方式,  例如隐式等待, 显式等待和硬性等待等, 可以选择根据具体的情况选择合适的等待方式来确保测试的稳定性和可靠性.

 隐式等待

通过添加implicitlyWait()方法就可以方便地实现智能等待;

//使用: 数目, 单位
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);

隐式等待并非一个固定的等待时间, 当脚本执行到某个元素定位时, 如果元素可以定位, 则继续执行; 如果元素定位不到, 则以轮询的方式不断判断元素是否被定位到. 直至超出设置的时长. 

 

 

 

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

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

相关文章

JetBrains PhpStorm 2024.1 发布 - 高效智能的 PHP IDE

JetBrains PhpStorm 2024.1 发布 - 高效智能的 PHP IDE 请访问原文链接&#xff1a;JetBrains PhpStorm 2024.1 (macOS, Linux, Windows) - 高效智能的 PHP IDE&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org JetBrains PhpSt…

算法—分治

分而治之:指的是当主问题可以被分解为一个相同次级问题加相同基本问题时&#xff0c;采用这种思想&#xff0c;基本问题指问题规模最小时的情况&#xff0c;次级问题是指主问题的n级降低n-1级的问题。 具体实现&#xff1a;多数采用递归操作分解&#xff0c;然后递归操作&#…

Harmony鸿蒙南向外设驱动开发-Audio

Audio驱动概述 多媒体系统是物联网设备开发中不可缺少的一部分&#xff0c;Audio作为其中重要的一个模块&#xff0c;Audio驱动模型的构建显得尤为重要。 本文主要介绍基于HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架开发的Audio驱动&#xff0c;包括Aud…

【数据结构(五)】栈

❣博主主页: 33的博客❣ ▶️文章专栏分类:数据结构◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.概念3.栈的使用4.栈的应用场景4.1有效的括号4.2逆波兰表达式4.3栈的压入弹…

分布式系统接口限流方案

Git地址&#xff1a;https://gitee.com/deepjava/test-api-limit.git 方案一、 Guava工具包 实现单机版限流 具体代码见git 方案二、Redis lua脚本 实现分布式系统的接口限流 具体代码见git

AI虽强,搜索引擎仍不可或缺

AI 领域正以前所未有的速度发展&#xff0c;大模型的发布变得愈发频繁&#xff0c;模型的规模也在持续扩大。如今&#xff0c;大模型的起点已经攀升至数十亿参数&#xff08;数十 B&#xff0c;B 是 Billion 的简写&#xff0c;10 亿&#xff09;&#xff0c;其功能之广泛&…

OSCP靶场--Banzai

OSCP靶场–Banzai 考点(ftp爆破 webshell上传web1访问403web2可以访问webshell反弹mysql udf提权) 1.nmap扫描 ## nmap扫描一定要使用 -p- 否则容易扫不全端口 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.158.56 -Pn -p- --min-rate 2500Starting Nmap 7.…

循序渐进丨MogDB 数据库带级联从库的集群切换后如何保持原有架构?

生产数据库运行过程中可能会涉及到升级或者打补丁&#xff0c;导致各节点的角色有计划的发生改变。如果集群内角色发生改变&#xff0c;是否还能保持原有架构继续对外提供服务呢&#xff1f;我们来做一下测试。 采用22模式模拟同城两机房部署4节点 MogDB 数据库集群&#xff0c…

【计算机毕业设计】人事管理系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

设计模式(22):解释器模式

解释器 是一种不常用的设计模式用于描述如何构成一个简单的语言解释器&#xff0c;主要用于使用面向对象语言开发的解释器和解释器设计当我们需要开发一种新的语言时&#xff0c;可以考虑使用解释器模式尽量不要使用解释器模式&#xff0c;后期维护会有很大麻烦。在项目中&…

基于java+springboot+vue实现的居家养老健康管理系统(文末源码+Lw)23-313

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装智慧社区居家养老健康管理系统软件来发挥其高效地信息处理…

c++编程(3)——类和对象(1)、类

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 类对象类的访问权限类的作用域 类 c最初对c语言的扩展就是增加了类的概念&#xff0c;使得c语言在原有的基础之上可以做到信息隐藏和封装。 那么我们先来讲讲“带类的c”与C语言相比有什么改进。 先讲讲类…