1.xpath介绍
1.1xpath概念
xpath 是XML Path的简称,HTML文档(也就是网页)本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素。
1.2 优缺点
- 优点:XPath 定位和CSS定位相比有更大的灵活性。XPath 在文档树中某个节点既可以向前搜索,也可以向后搜索
- 缺点:XPath 定位相比于CSS定位速度,前者会比较慢
2.xpath 定位方式
2.1 绝对路径定位
2.1.1概念
将 Xpath 表达式从 html 的最外层节点,逐层填写,最后定位到操作元素
2.1.2 格式
格式:xxx.By.xpath("绝对路径")
例子:xxx.By.xpath("/html/body/div[x]/form/input") x 代表第x个 div标签,注意,索引从1开始而不是0
2.1.3 使用
以百度为例,定位搜索框和百度按钮
WebElement searchInput = chrome.findElement(By.xpath("/html/body/div/div/div/div/div/form/span/input"));
WebElement searchBtn = chrome.findElement(By.xpath("/html/body/div/div/div/div/div/form/span[2]/input[@value='百度一下']"));
代码设计:
package com.selenium;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
/**
* @author admin
* @ClassName FindElement_ByXPath
* @description: TODO
* @date 2023年10月27日
* @version: 1.0
*/
public class FindElement_ByXPath {
public static void main(String[] args) {
// 加载驱动
System.setProperty("webdriver.chrome.driver", ".\\tool\\chromedriver_win32\\chromedriver.exe");
//定义Chrome对象
WebDriver chrome = new ChromeDriver();
chrome.manage().window().maximize();
chrome.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
//打开百度连接
chrome.get("https://www.baidu.com");
/*XML表达式
* 绝对路径
* xxx.By.xpath("绝对路径")
* xxx.By.xpath("/html/body/div[x]/form/input") x 代表第x个 div标签,注意,索引从1开始而不是0
* */
WebElement searchInput = chrome.findElement(By.xpath("/html/body/div/div/div/div/div/form/span/input"));
searchInput.sendKeys("北京大学");
WebElement searchBtn = chrome.findElement(By.xpath("/html/body/div/div/div/div/div/form/span[2]/input[@value='百度一下']"));
searchBtn.click();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
chrome.quit();
}
}
缺点:页面元素位置发生改变,都需要修改,因此,不推荐使用绝对路径的写法。
2.2 相对路径定位
2.2.1 概念
相对路径,以‘//‘开头
格式:xxx.By.xpath("//标签")
例子:
(1):xxx.By.xpath("//input[x]") 定位第x个input标签,[x]可以省略,默认为第一个
(2):xxx.By.xpath("//div[x]/form[x]/input[x]"), [x]依然是可以省略的
2.2.2 使用
以百度为例,定位搜索框和百度按钮
XPath 表达式:
百度搜索框://form/span[1]/input
百度搜索按钮://form/span[2]/input
2.2.3 代码设计
package com.selenium;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
/**
* @author admin
* @ClassName FindElement_ByXPath
* @description: TODO
* @date 2023年10月27日
* @version: 1.0
*/
public class FindElement_ByXPath {
public static void main(String[] args) {
// 加载驱动
System.setProperty("webdriver.chrome.driver", ".\\tool\\chromedriver_win32\\chromedriver.exe");
//定义Chrome对象
WebDriver chrome = new ChromeDriver();
chrome.manage().window().maximize();
chrome.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
//打开百度连接
chrome.get("https://www.baidu.com");
/*相对路径
* xxx.By.xpath("//标签")
* xxx.By.xpath("//input[x]") 定位第x个input标签,[x]可以省略,默认为第一个
* xxx.By.xpath("//div[x]/form[x]/input[x]"), [x]依然是可以省略的*/
WebElement searchInput = chrome.findElement(By.xpath("//form/span[1]/input"));
searchInput.sendKeys("北京大学");
WebElement searchBtn = chrome.findElement(By.xpath("//form/span[2]/input"));
searchBtn.click();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
chrome.quit();
}
}
2.3 总结
绝对路径和相对路径的区别:
- 绝对路径 以 “/” 开头, 让xpath 从文档的根节点开始解析
- 相对路径 以"//" 开头, 让xpath从文档的任何元素节点开始解析
说明:可以通过浏览器的开发工具来获取元素的XPath表达式