java selenium操作定位元素
1、元素选择策略
WebDriver 中有 8 种不同的内置元素定位策略:
定位器Locator | 描述 |
---|---|
class name | 定位class属性与搜索值匹配的元素(不允许使用复合类名) |
css selector | 定位 CSS 选择器匹配的元素 |
id | 定位 id 属性与搜索值匹配的元素 |
name | 定位 name 属性与搜索值匹配的元素 |
link tex t | 定位link text可视文本与搜索值完全匹配的锚元素 |
partial link text | 定位link text可视文本部分与搜索值部分匹配的锚点元素。如果匹配多个元素,则只选择第一个元素。 |
tag name | 定位标签名称与搜索值匹配的元素 |
xpath | 定位与 XPath 表达式匹配的元素 |
1.1、使用选择器的提示
一般来说,如果 HTML 的 id 是可用的、唯一的且是可预测的,那么它就是在页面上定位元素的首选方法。它们的工作速度非常快,
可以避免复 杂的 DOM 遍历带来的大量处理。如果没有唯一的 id,那么最好使用写得好的 CSS 选择器来查找元素。
XPath 和 CSS 选择器一样好用,但是它语法很复杂,并且经常很难调试。尽管 XPath 选择器非常灵活,
但是他们通常未经过浏览器厂商的性能测试,并且运行速度很慢。
基于链接文本和部分链接文本的选择策略有其缺点,即只能对链接元素起作用。此外,它们在 WebDriver 内部调用 XPath 选择器。
标签名可能是一种危险的定位元素的方法。页面上经常出现同一标签的多个元素。这在调用 findElements(By) 方法返回元素集合的时候非常有用。
建议您尽可能保持定位器的紧凑性和可读性。使用 WebDriver 遍历 DOM 结构是一项性能花销很大的操作,搜索范围越小越好。
2、定位元素
使用 WebDriver 时要学习的最基本的技术之一是如何查找页面上的元素。 WebDriver 提供了许多内置的选择器类型,其中包括根据 id 属性查找元素:
WebElement cheese = driver.findElement(By.id("cheese"));
如示例所示,在 WebDriver 中定位元素是在 WebDriver 实例对象上完成的。 findElement(By) 方法返回另一个基本对象类型 WebElement。
1. WebDriver 代表浏览器
2. WebElement 表示特定的 DOM 节点(控件,例如链接或输入栏等)
一旦你已经找到一个元素的引用,你可以通过对该对象实例使用相同的调用来缩小搜索范围:
WebElement cheese = driver.findElement(By.id("cheese"));
WebElement cheddar = cheese.findElement(By.id("cheddar"));
你可以这样做是因为, WebDriver 和 WebElement 类型都实现了 搜索上下文 接口。在 WebDriver 中,这称为 基于角色的接口。
基于角色的接口允许你确定特定的驱动程序实现是否支持给定的功能。这些接口定义得很清楚,并且尽量只承担单一的功能。
你可以阅读更多关于 WebDriver 的设计,以及在 WebDriver 中有哪些角色被支持,在其他被命名的部分。
因此,上面使用的 By 接口也支持许多附加的定位器策略。嵌套查找可能不是最有效的定位 cheese 的策略,因为它需要向浏览器发出两个单独的命令:
首先在 DOM 中搜索 id 为“cheese”的元素,然后在较小范围的上下文中搜索“cheddar”。
3、定位多个元素
代码示例:
<ol id=cheese>
<li id=cheddar>…
<li id=brie>…
<li id=rochefort>…
<li id=camembert>…
</ul>
findElements(By) 。此方法返回 web 元素的集合。如果只找到一个元素,它仍然返回(一个元素的)集合。
如果没有元素被定位器匹配到,它将返回一个空列表。
List<WebElement> muchoCheese = driver.findElements(By.cssSelector("#cheese li"));
4、相对定位
在Selenium 4中带来了相对定位这个新功能,在以前的版本中被称之为"好友定位 (Friendly Locators)"。
它可以帮助你通过某些元素作为参考来定位其附近的元素。 现在可用的相对定位有:
- above() 返回WebElement,它显示在指定元素的上方
- below() 返回WebElement,它显示在指定元素的下方
- toLeftOf() 返回WebElement,它显示在指定元素的左侧
- toRightOf() 返回WebElement,它显示在指定元素的右侧
- near() 返回WebElement,该WebElement最多50px与指定的元素分离。
findElement 方法现在支持witTagName()新方法其可返回RelativeLocator相对定位对象。
Selenium是通过使用JavaScript函数 getBoundingClientRect() 来查找相对元素的。这个函数能够返回对应元素的各种属性例如:右,左,下,上。
4.1、above()
只示例 above():
返回当前指定元素位置上方的WebElement对象
通过下面的例子我们来理解一下关于相对定位的使用
//import static org.openqa.selenium.support.locators.RelativeLocator.withTagName;
WebElement passwordField= driver.findElement(By.id("password"));
WebElement emailAddressField = driver.findElement(withTagName("input").above(passwordField));
【参考】:selenium document