【问题标题】:Selenium Java Xpath complex element determination of child of one siblingSelenium Java Xpath复杂元素确定一个兄弟的孩子
【发布时间】:2013-10-20 00:35:07
【问题描述】:

我正在尝试定位页面上的特定元素,但无法确定要使用的正确 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()=' 的同一 div 中找到 INPUT 元素,即 //div/span[@class='metadataField metadataFieldReadonly']/input姓氏']

我可以通过这个(使用 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) 标签和跨度是同一级别(兄弟姐妹),所以我无法弄清楚如何正确创建 Xpath 语句。

因此,换句话说,我需要在同一个 div 中找到跨度的输入,其中包含带有“姓氏”的标签。

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

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

谢谢

【问题讨论】:

    标签: java xpath selenium selenium-webdriver


    【解决方案1】:

    这非常简单://div[label[text()='Last Name']]/span[@class='metadataField metadataFieldReadonly']/input - 从字面上看,“input 包含在 span 中,metadataFieldmetadataFieldReadonly 包含在 div 中,其中包含 label 和文本“姓氏””。所以你使用标签来定位 div,然后从它构建到你想要的输入。

    为了更健壮,你不应该指望类名的顺序——规范不能保证这一点。所以像这样的东西会更强大://div[label[text()='Last Name']]/span[contains(concat(' ', @class,' '),' metadataField ') and contains(concat(' ',@class,' '),' metadataFieldReadonly ')]/input

    【讨论】:

    • 现在我知道如何做到这一点非常简单,哈哈!我现在可以看到您如何使用标签周围的方括号来选择特定的 div ......这是我无法弄清楚的!接受为正确答案。谢谢
    • 以及 +1 以获取有关类名排序的其他信息 :)
    • 标签周围的方括号以选择特定的 div”之所以有效,是因为大多数人认为检查属性值的地方实际上是一个非常强大的条件表达式模型。前进并征服:-)
    猜你喜欢
    • 2023-03-13
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多