Selenium 4 新定位器 relative locators
FreeGuideOnline
最新
2026-07-13
邮箱
```
密码
格式不正确
提交1. 获取某个元素上方的元素 (above)
场景:已知“密码”输入框的参考元素为“邮箱”输入框的下方。反过来,我们可以通过“密码”输入框定位到它上方的“邮箱”输入框。
WebElement passwordInput = driver.findElement(By.id("password"));
WebElement emailInput = driver.findElement(withTagName("input")
.above(passwordInput));
2. 获取某个元素下方的元素 (below)
场景:定位“提交”按钮下方的错误提示(假设错误提示在按钮之后渲染且位于视觉下方)。
WebElement submitButton = driver.findElement(By.tagName("button"));
WebElement errorMsg = driver.findElement(withTagName("p")
.below(submitButton));
3. 获取某个元素左侧的元素 (toLeftOf)
场景:在密码输入框左侧是其对应的标签 <label>密码</label>。
WebElement passwordInput = driver.findElement(By.id("password"));
WebElement passwordLabel = driver.findElement(withTagName("label")
.toLeftOf(passwordInput));
4. 获取某个元素右侧的元素 (toRightOf)
场景:标签“邮箱”右侧紧挨着输入框。
WebElement emailLabel = driver.findElement(By.xpath("//label[text()='邮箱']"));
WebElement emailInput = driver.findElement(withTagName("input")
.toRightOf(emailLabel));
5. 获取某个元素附近的元素 (near)
场景:找到一个靠近“提交”按钮的加载图标。它会自动寻找最接近参考元素的匹配标签。
WebElement submit = driver.findElement(By.tagName("button"));
WebElement loader = driver.findElement(withTagName("div")
.near(submit));
// 可自定义最大距离(单位像素),例如 100px
WebElement loader2 = driver.findElement(withTagName("div")
.near(submit, 100));
链式组合使用
相对定位器支持链式调用,进一步缩小筛选范围。例如:定位“密码”标签下方且位于提交按钮左侧的输入框。
WebElement submitBtn = driver.findElement(By.tagName("button"));
WebElement passwordLabel = driver.findElement(By.xpath("//label[text()='密码']"));
WebElement input = driver.findElement(withTagName("input")
.below(passwordLabel)
.toLeftOf(submitBtn));
链式调用中的多个条件以 AND 方式组合,目标元素必须同时满足所有位置关系。
Python 实现示例
Python 语法同样简洁。需先从 selenium.webdriver.support.relative_locator 导入 with_tag_name 或使用 RelativeBy。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import with_tag_name
driver = webdriver.Chrome()
driver.get("https://example.com")
email_label = driver.find_element(By.XPATH, "//label[text()='邮箱']")
email_input = driver.find_element(with_tag_name("input").to_right_of(email_label))
password_input = driver.find_element(By.ID, "password")
email_input_above = driver.find_element(with_tag_name("input").above(password_input))
# near 使用
btn = driver.find_element(By.TAG_NAME, "button")
tooltip = driver.find_element(with_tag_name("div").near(btn, 50))