《手把手教你》系列技巧篇(十六)-java+ selenium自动化测试-元素定位大法之By xpath下卷(详细教程)

简介: 【4月更文挑战第8天】本文介绍了WebDriver中的一种元素定位方法:By xpath。XPath是一种在XML文档中查找信息的语言,由于HTML文档是XML的子集,所以可以使用XPath来定位网页上的元素。XPath定位方法非常强大,几乎可以定位到页面上的任何元素。然而,由于它需要扫描整个页面来找到匹配的元素,所以定位速度相对较慢。

1.简介

按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath。xpath 的定位方法, 非常强大。  使用这种方法几乎可以定位到页面上的任意元素。

2.什么是xpath?

xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素。

XPath 是XML 和Path的缩写,主要用于xml文档中选择文档中节点。基于XML树状文档结构,XPath语言可以用在整棵树中寻找指定的节点。XPath 定位和CSS定位相比有更大的灵活性。XPath 在文档树中某个节点既可以向前搜索,也可以向后搜索,CSS定位只能在文档树中向前搜索,但XPath的定位速度比CSS 慢一些。

3.xpath定位的缺点

xpath 这种定位方式, webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素, 这是个非常费时的操作, 如果脚本中大量使用xpath做元素定位的话, 脚本的执行速度可能会稍慢。

4.常用定位方法(8种)

(1)id

(2)name

(3)class name

(4)tag name

(5)link text

(6)partial link text

(7)xpath(今天讲解)

(8)css selector

5.自动测试实战

以百度首页为例,将xpath的各种定位方法一一讲解和分享一下。

5.1大致步骤

1.访问度娘首页。

2.通过xpath定位到元素,点击一下。

5.2模糊定位starts-with关键字

有一种特殊的情况:页面元素的属性值会被动态地生成,即每次看到的页面元素属性值是不一样的,这种页面元素会加大定位的难度,使用模糊属性值定位方法可以部分解决问题。

XPath常用的函数如下:

Starts-with()

定位表达式的实例://img[starts-with(@alt,'div1')]

这个实例表示查找图片alt属性开始位置包含‘div1’关键字的页面元素。

start-with定位,以‘//’开头,具体格式为

xxx.By.xpath("//标签[starts-with(@属性,'内容')]")

具体例子:

//input[starts-with(@name,'name1')]     查找name属性中开始位置包含'name1'关键字的页面元素

具体步骤:

在被测试百度网页中, 按照宏哥在上卷中5.2中的方法 (1)查找输入框并输入“北京宏哥”,(2)查找“百度一下”按钮,(3)点击“百度一下”按钮。

XPath表达式:

(1)//input[starts-with(@name,'wd')]

(2)//input[starts-with(@value,'百度一下')]

java定位语句:

(1)WebElement searchBox = driver.findElement(By.xpath( "//input[starts-with(@name,'wd')]" ));


(2)WebElement SearchButton = driver.findElement(By.xpath("//input[starts-with(@value,'百度一下')]"));

5.2.1代码设计

5.2.2参考代码

package lessons;


import org.openqa.selenium.By;

import org.openqa.selenium.JavascriptExecutor;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;


/**

* @author 北京-宏哥

*

* 《手把手教你》系列技巧篇(十四)-java+ selenium自动化测试-元素定位大法之By xpath下篇(详细教程)

*

* 2021年8月5日

*/

public class ByXpath {

   

   public  static  void  main(String [] args) throws InterruptedException {

       

       System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驱动路径

 

       WebDriver driver = new ChromeDriver ();

       //最大化窗口  

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

       driver.get("http://wwww.baidu.com");

       

       //By xpath 定位

       WebElement SearchBox  = driver.findElement(By.xpath( "//input[starts-with(@name,'wd')]" ));

       

       SearchBox.sendKeys("北京宏哥");

       

       WebElement SearchButton  = driver.findElement(By.xpath("//input[starts-with(@value,'百度一下')]"));

       

       SearchButton .click();

       

       //定位到文本,将文本高亮显示

       //创建一个JavascriptExecutor对象

       JavascriptExecutor js =(JavascriptExecutor)driver;

 

       //新闻文本高亮显示颜色

       js.executeScript ( "arguments[0].setAttribute('style', arguments[1]);",SearchBox,"background: orange; border: 2px solid red;");

 

       Thread.sleep (5000);

 

       driver.quit();

   }


}

5.2.3运行代码

1.运行代码,右键Run AS->java Application,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

5.3模糊定位contains关键字

Contains()

定位表达式的实例://img[contains(@alt,'g1')]

这个实例表示查找图片alt属性包含‘g1’关键字的页面元素。Contains()函数属于XPath函数的高级用法,使用的场景比较多,页面元素的属性值只要具有固定不变的几个关键字,就可以在元素属性经常发生一定程度的变化的时候,依然可以使用Contains函数进行定位。

索引号定位,以‘//’开头,具体格式为:

xxx.By.xpath("//标签[contains(@属性,'内容')]")

具体例子:

//input[contains(@name,'na')]         查找name属性中包含na关键字的页面元素

具体步骤:

在被测试百度网页中, 按照宏哥在上卷中5.2中的方法 (1)查找输入框并输入“北京宏哥”,(2)查找“百度一下”按钮,(3)点击“百度一下”按钮。

XPath表达式:

(1)//input[contains(@name,'wd')]

(2)//input[contains(@value,'百度一下')]

java定位语句:

(1)WebElement searchBox = driver.findElement(By.xpath( "//input[contains(@name,'wd')]" ));


(2)WebElement SearchButton = driver.findElement(By.xpath("//input[contains(@value,'百度一下')]"));

5.3.1代码设计

5.3.2参考代码

package lessons;


import org.openqa.selenium.By;

import org.openqa.selenium.JavascriptExecutor;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;


/**

* @author 北京-宏哥

*

* 《手把手教你》系列技巧篇(十四)-java+ selenium自动化测试-元素定位大法之By xpath下篇(详细教程)

*

* 2021年8月5日

*/

public class ByXpath {

   

   public  static  void  main(String [] args) throws InterruptedException {

       

       System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驱动路径

 

       WebDriver driver = new ChromeDriver ();

       //最大化窗口  

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

       driver.get("http://wwww.baidu.com");

       

       //By xpath 定位

       WebElement SearchBox  = driver.findElement(By.xpath( "//input[contains(@name,'wd')]" ));

       

       SearchBox.sendKeys("北京宏哥");

       

       WebElement SearchButton  = driver.findElement(By.xpath("//input[contains(@value,'百度一下')]"));

       

       SearchButton .click();

       

       //定位到文本,将文本高亮显示

       //创建一个JavascriptExecutor对象

       JavascriptExecutor js =(JavascriptExecutor)driver;

 

       //新闻文本高亮显示颜色

       js.executeScript ( "arguments[0].setAttribute('style', arguments[1]);",SearchBox,"background: orange; border: 2px solid red;");

 

       Thread.sleep (5000);

 

       driver.quit();

   }


}

5.3.3运行代码

1.运行代码,右键Run AS->java Application,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

5.4text() 函数 文本定位

使用text()函数可以定位到包含某些关键字的页面元素。

文本内容的定位是利用 html 的 text 字段进行定位的方法,可以看做是属性值定位的衍生

//button[text()='下一步']

由于 “下一步” 这几个字是浏览器界面就可以看到的,我们称为 “所见即所得”,这种特征改的可能性非常小,所以非常未定,优先推荐使用。

与属性值类似,文本内容也支持 starts-with 和 contains 模糊匹配。

text()函数文本定位,以‘//’开头,具体格式为:

xxx.By.xpath("//标签[text()='文本']")

或者

xxx.By.xpath("//标签[contains(text(),'文本')]")

具体例子:

查找所有文本为"百度搜索" 的元素

driver.findElement(By.xpath("//*[text()='百度搜索']"));

查找所有文本为“搜索” 的超链接

driver.findElement(By.xpath("//a[contains(text(),'搜索')]"));

具体步骤:

在被测试百度网页中, 按照宏哥在上卷中5.2中的方法 (1)查找“百度热搜”,(2)点击“百度热搜”按钮。

XPath表达式:

(1)//a/div[text()='百度热搜']

  //或者

(2)//a/div[contains(text(),'百度热搜')]

java定位语句:

(1)WebElement searchBox = driver.findElement(By.xpath( "//a/div[text()='百度热搜']" ));

 //或者

(2)WebElement SearchButton = driver.findElement(By.xpath("//a/div[contains(text(),'百度热搜')]"));

第一个表达式是查找包含“百度搜索”的链接页面元素,要精确匹配。第二个表达式则是搜索包含“百度”两个字的链接页面元素,实现了根据关键字内容匹配。

使用文字匹配模式进行定位,为定位复杂的页面元素提供过一种强大的定位模式,遇到定位问题的时候,可以优先考虑使用这个方法。

5.4.1代码设计

5.4.2参考代码

package lessons;


import org.openqa.selenium.By;

import org.openqa.selenium.JavascriptExecutor;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;


/**

* @author 北京-宏哥

*

* 《手把手教你》系列技巧篇(十四)-java+ selenium自动化测试-元素定位大法之By xpath下篇(详细教程)

*

* 2021年8月5日

*/

public class ByXpath {

   

   public  static  void  main(String [] args) throws InterruptedException {

       

       System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驱动路径

 

       WebDriver driver = new ChromeDriver ();

       //最大化窗口  

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

       driver.get("http://wwww.baidu.com");

       

       //By xpath 定位

       WebElement HotButton  = driver.findElement(By.xpath("//a/div[text()='百度热搜']"));

       

       HotButton.click();

       

       //定位到文本,将文本高亮显示

       //创建一个JavascriptExecutor对象

       JavascriptExecutor js =(JavascriptExecutor)driver;

 

       //新闻文本高亮显示颜色

       js.executeScript ( "arguments[0].setAttribute('style', arguments[1]);",HotButton,"background: orange; border: 2px solid red;");

 

       Thread.sleep (5000);

 

       driver.quit();

   }


}

5.4.3运行代码

1.运行代码,右键Run AS->java Application,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

6.小结

Xpath的功能非常强大,不仅能够完成界面定位的任务,而且能保证稳定性,实际自动化测试中,能够识别界面元素是重要的,更重要的是要保证版本间的稳定性,减少脚本的维护工作。

如下规则请参考:

(1)特征越少越好

(2)特征越是界面可见的越好

(3)不能使用绝对路径

(4)避免使用索引号

(5)擅用 console 调试(后边宏哥会简单讲解一下)

(6)相对路径,属性值,文本内容,Axis 可以任意组合,当然属性值和文本内容的模糊匹配也支持和上述方式任意组合,Axis 可以嵌套使用。

通过 Xpath 的各种方式组合,能够解决 selenium 自动化测试中界面定位的全部问题,可以说:有了 Xpath,再也不用担心元素定位了。

好了,今天到这里关于xpath定位的常见方法基本上都介绍和分享讲解过了。下一篇宏哥讲解最后一种元素定位方法。

7.拓展

7.1. 函数

1.count:统计

'count(//li[@data])' #节点统计

2.concat:字符串连接

'concat(//li[@data="one"]/text(),//li[@data="three"]/text())'

3.local-name:解析节点名称

'local-name(//*[@id="testid"])' #local-name解析节点名称,标签名称

4.contains(string1,string2):如果 string1 包含 string2,则返回 true,否则返回 false

'//h3[contains(text(),"H3")]/a/text()')[0] #使用字符内容来辅助定位

5.not:布尔值(否)

'count(//li[not(@data)])' #不包含data属性的li标签统计

6.string-length:返回指定字符串的长度

#string-length函数+local-name函数定位节点名长度小于2的元素

'//*[string-length(local-name())<2]/text()')[0]

7.组合拳2

#contains函数+local-name函数定位节点名包含di的元素

'//div[@id="testid"]/following::div[contains(local-name(),"di")]'

8.or:多条件匹配

'//li[@data="one" or @code="84"]/text()' #or匹配多个条件


#也可使用|

'//li[@data="one"]/text() | //li[@code="84"]/text()' #|匹配多个条件

9.组合拳3:floor + div除法 + ceiling

#position定位+last+div除法,选取中间两个

'//div[@id="go"]/ul/li[position()=floor(last() div 2+0.5) or position()=ceiling(last() div 2+0.5)]/text()'

10.组合拳4隔行定位:position+mod取余

#position+取余运算隔行定位

'//div[@id="go"]/ul/li[position()=((position() mod 2)=0)]/text()')

7. 2数值比较

1.<:小于 、 >:大于

#所有li的code属性小于200的节点

'//li[@code<200]/text()'

2.div:对某两个节点的属性值做除法

'//div[@id="testid"]/ul/li[3]/@code div //div[@id="testid"]/ul/li[1]/@code'

3.组合拳4:根据节点下的某一节点数量定位

#选取所有ul下li节点数大于5的ul节点

'//ul[count(li)>5]/li/text()'

每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问):

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

相关文章
|
2月前
|
Web App开发 数据采集 JavaScript
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
本文介绍了Selenium、Chrome DevTools及Chrome DevTools Protocol (CDP) 的基本功能与应用。Selenium是一款开源自动化测试工具,适用于网页端应用程序测试和数据采集,具备跨平台特性。Chrome DevTools内置浏览器中,提供调试、分析Web应用程序的功能,包括元素、控制台、源代码和网络选项卡等。CDP是一套用于与Chromium内核浏览器通信的API,支持自动化测试和性能分析。文中还展示了Selenium与CDP结合使用的示例,如捕获网络请求数据和打印网页内容,并推荐了相关书籍和资源以供深入学习。
365 39
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
|
2月前
|
Web App开发 IDE JavaScript
Selenium IDE:Web自动化测试的得力助手
Selenium IDE:Web自动化测试的利器。作为开源工具,Selenium IDE支持录制与回放用户操作,适用于Chrome、Firefox等多浏览器,简化了测试流程,提升了效率,降低了自动化测试的门槛。它还支持导出多种编程语言的脚本,便于测试集成与复用。
150 31
Selenium IDE:Web自动化测试的得力助手
|
2月前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
272 17
Selenium:强大的 Web 自动化测试工具
|
3月前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
4月前
|
JavaScript 前端开发 测试技术
精通Selenium:从基础到高级的网页自动化测试策略
【10月更文挑战第6天】随着Web应用变得越来越复杂,手动进行功能和兼容性测试变得既耗时又容易出错。自动化测试因此成为了现代软件开发不可或缺的一部分。Selenium是一个强大的工具集,它支持多种编程语言(包括Python),允许开发者编写脚本来模拟用户与Web页面的交互。本文将带领读者从Selenium的基础知识出发,逐步深入到高级的应用场景,通过丰富的代码示例来展示如何高效地进行网页自动化测试。
995 5
|
3月前
|
Web App开发 设计模式 JavaScript
自动化测试之美:如何利用Selenium实现Web应用的高效测试
【10月更文挑战第29天】在软件开发的世界中,测试是确保产品质量的关键步骤。本文将带你了解如何使用Selenium这一强大的自动化测试工具,提高Web应用测试的效率和准确性。通过实际案例,我们将探索Selenium的核心功能及其在现代软件开发中的应用,旨在帮助读者掌握自动化测试的精髓,从而提升软件测试工作的整体效能。
84 0
|
5月前
|
数据采集 Web App开发 测试技术
使用Selenium与WebDriver实现跨浏览器自动化数据抓取
在网络爬虫领域,Selenium与WebDriver是实现跨浏览器自动化数据抓取的利器。本文详细介绍了如何利用Selenium和WebDriver结合代理IP技术提升数据抓取的稳定性和效率。通过设置user-agent和cookie来模拟真实用户行为,避免被网站检测和阻止。文章提供了具体的代码示例,展示了如何配置代理IP、设置user-agent和cookie,并实现了跨浏览器的数据抓取。合理的参数配置能有效减少爬虫被封禁的风险,提高数据抓取效率。
660 6
使用Selenium与WebDriver实现跨浏览器自动化数据抓取
|
5月前
|
Web App开发 JavaScript Java
自动化测试的利剑:Selenium WebDriver入门与实践
【9月更文挑战第21天】在软件开发的海洋中,自动化测试犹如一艘船,帮助开发者们快速航行至质量保证的彼岸。本文将作为你的罗盘,指引你了解和掌握Selenium WebDriver这一强大的自动化测试工具。通过深入浅出的方式,我们将探索Selenium WebDriver的基本概念、安装过程以及编写简单测试脚本的方法。无论你是刚接触自动化测试的新手,还是希望提升测试技能的开发者,这篇文章都将为你提供有价值的指导。
|
4月前
|
Web App开发 Java 测试技术
一、自动化:web自动化。Selenium 入门指南:从安装到实践
一、自动化:web自动化。Selenium 入门指南:从安装到实践
84 0
|
5月前
|
Web App开发 Java 测试技术
自动化测试的利器:Selenium WebDriver入门与实践
【9月更文挑战第8天】在软件开发的海洋中,测试是确保我们不会溺水的那根救生索。Selenium WebDriver,作为自动化测试的明星工具,让这根救生索更加结实可靠。本文将带你快速上手Selenium WebDriver,从基础设置到实际操作,再到实战演练,让你的开发之旅更加平稳顺畅。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等