Java Selenium学习笔记(二)WebDriver元素定位之XPath定位

被刻印的时光 ゝ 提交于 2020-01-10 02:58:13

上一篇博客总结了WebDriver元素定位的前6种方式,本篇来总结如何使用XPath定位页面元素?

1.什么是XPath?

XPath是XML Path的简称,它是一种用来确定XML文档中某部分位置的语言。由于HTML文档本身就是一个标准的XML页面,所以可以使用xpath在web应用中定位元素。

使用xpath定位页面元素时, WebDriver会将整个页面的所有元素进行扫描以定位我们所需要的元素,如果脚本中大量使用xpath做元素定位的话, 脚本的执行速度可能会慢一些。

xpath定位页面元素的方法如下:

driver.findElement(By.xpath("xpath表达式"));

2.XPath定位页面元素的方式

2.1.利用路径(绝对路径、相对路径)定位

绝对路径 :以 "/"  开头;

相对路径 :以"//" 开头。

案例需求:

  • 打开注册A.html,使用绝对路径实现,密码A:123456;
  • 使用相对路径实现,手机号码A:18611111111。

Java代码示例如下:

// xpath定位之绝对定位
driver.findElement(By.xpath("/html/body/form/div/fieldset/p[2]/input")).sendKeys("123456");
		
// xpath定位之相对定位
driver.findElement(By.xpath("//input[@id='telA']")).sendKeys("18611111111");

2.2.利用元素属性定位

利用元素的唯一性,来快速定位元素;

例如://*[@id='telA']

2.3.利用层级与属性相结合定位

如果要找的元素没有属性,但它的父级元素有,此时可以使用层级与属性相结合来定位元素;

例如://*[@id='p1']/input

部分Java代码示例如下:(这个例子不是太好,因为input有id,name等属性,此时我们假如input元素没有属性)

// xpath定位之层级与属性相结合
driver.findElement(By.xpath("//*[@id='p1']/input")).sendKeys("admin");

2.4.利用属性与逻辑相结合定位

解决各个元素之间相同属性的重名问题;

例如://*[@class='login-test' and @name='user']

案例需求:

  • 打开xpath.html,自动填写test1:admin;
  • 填写完毕后,3秒种后关闭浏览器窗口。

xpath.html的代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Xpath</title>
</head>
<body>
    <p id="p1">
        <p id="login_user">
            <label for="">test1:</label>
            <input type="text"  name="user" class="login"/>
        </p>
    </p>
    <p id="p2">
        <p id="login_user">
            <label for="">test2:</label>
            <input type="text" name="user" class="login-test"/>
        </p>
    </p>
    <p id="p3">
        <p id="login_user">
            <label for="">test3:</label>
            <input type="text"  name="user-test" class="login-test"/>
        </p>
    </p>
    <p id="p4">
        <p id="login_user">
            <label for="">test4:</label>
            <input type="text"  name="user-test" class="login"/>
        </p>
    </p>
</body>
</html>

页面如下:

上图,可以看到test1和test4的class属性的值相同,均为"login",但二者的name属性的值并不相同,此时可以利用属性与逻辑相结合的方式来定位test1元素。

部分Java代码示例如下:

// 指定路径,实例化火狐浏览器
System.setProperty("webdriver.firefox.bin", "F:\\Program Files (x86)\\Mozilla Firefox35\\firefox.exe");
WebDriver driver = new FirefoxDriver();

// 打开xpath.html页面
String url = "D:\\develop\\软件测试\\web自动化练习\\day02\\xpath.html";
driver.get(url);
		
// 等待2秒,强制等待
Thread.sleep(2000);

// xpath定位之属性与逻辑相结合,test1:admin
driver.findElement(By.xpath("//input[@class='login' and @name='user']")).sendKeys("admin");

// 等待3秒,强制等待
Thread.sleep(3000);

// 关闭浏览器
driver.quit();

2.5.模糊定位(starts-with、contains)

需求1:查找id属性开始位置包含email的元素,并自动填入allan@qq.com

driver.findElement(By.xpath("//*[starts-with(@id,'email')]")).sendKeys("allan@qq.com");

需求2:查找id属性包含el的元素,并自动填入18611111111

driver.findElement(By.xpath("//*[contains(@id,'el')]")).sendKeys("18611111111");

2.6.文本定位(text()函数)

需求:查找文本内容是"电话号码A"的元素,并自动填入18611111111

driver.findElement(By.xpath("//*[text()='电话号码A']")).sendKeys("18611111111");

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!