java - Selenium Java Xpath复杂元素确定一个 sibling 的 child

标签 java xpath selenium selenium-webdriver

我试图在页面上定位特定元素,但无法确定要使用的正确 Xpath。

这是 HTML(注意每个 div 的位置可能不同):

    <div>
     <label>First Name</label>
     <span class="metadataField metadataFieldReadonly">
      <input type="text" name="some-random-value" value="John">
     </span>
    </div>
    <div>
     <label>Last Name</label>
     <span class="metadataField metadataFieldReadonly">
      <input type="text" name="some-random-value" value="Smith">
     </span>
    </div>

所以我试图在具有//div/label[text()='姓']

我可以用这个(使用 JAVA)成功找到标签:

    driver.findElement(By.xpath("//div/label[text()='Last Name']")).click();

我可以成功地找到第一个元素下的第一个输入(但我可能并不总是想要第一个元素):

    driver.findElement(By.xpath("//div/span[@class='metadataField metadataFieldReadonly']/input")).click();

所以问题在于 (i) 名称标签和 INPUT 的值总是不同的,因此它们不能用于选择元素,以及 (ii) 带有姓氏标签的 div 可能并不总是第二个,并且 (iii) 标签和跨度是同一级别( sibling ),所以我无法弄清楚如何正确创建 Xpath 语句。

所以换句话说,我需要在同一个 div 中找到跨度的输入,该 div 中有一个带有“姓氏”的标签。

所以我需要知道如何将这两个 XPath 语句组合成一个复杂的语句(假设它们在同一个 div 中并且 label 和 span 是兄弟):

    //div/label[text()='Last Name']
    //div/span[@class='metadataField metadataFieldReadonly']/input

谢谢

最佳答案

这非常简单://div[label[text()='Last Name']]/span[@class='metadataField metadataFieldReadonly']/input - 从字面上看,“input 中包含的 spanmetadataField 中包含的 metadataFieldReadonly 类包含带有文本‘姓氏’的 div ”。因此,您正在使用标签定位 div,然后从它构建到您想要的输入。

为了更健壮,您不应该指望类名的顺序——规范不能保证这一点。所以像这样的东西会更强:label .

关于java - Selenium Java Xpath复杂元素确定一个 sibling 的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19472649/

相关文章:

java - System.currentTimeMillis 与 System.nanoTime

java - JSON 解析后小部件未更新

xml - 将秒转换为持续时间XPATH

unix - 可以从命令行运行以自动执行浏览器操作的类似 iMacros 的程序?

java - Selenium 进口无法解决

适合初学者处理在数组中存储数据的 Java 程序

java - 内存级别的克隆方法行为 - java

xml - 选择包含 "foo"的属性的正确 XPath 是什么?

java - JOOX 命名空间支持

java - Selenium Chrome webdriver SessionNotCreatedException