Selenium Java Xpath复杂元素确定一个兄弟的孩子

jsh*_*erk 1 java selenium xpath 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>
Run Code Online (Sandbox Code Playgroud)

所以我试图在具有// div/label [text()='Last Name'的同一div中找到// div/span [@ class ='metadataField metadataFieldReadonly'] /输入的INPUT元素]

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

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

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

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

所以问题是(i)INPUT的名称标签和值总是不同,所以它们不能用来挑选元素,而(ii)带有姓氏标签的div可能并不总是第二个,而且( iii)标签和跨度是相同级别(兄弟姐妹)所以我无法弄清楚如何正确创建Xpath语句.

所以在单词中,我需要在同一个div中找到span的输入,其中包含一个带有"Last Name"的标签.

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

    //div/label[text()='Last Name']
    //div/span[@class='metadataField metadataFieldReadonly']/input
Run Code Online (Sandbox Code Playgroud)

谢谢

Ros*_*son 6

这是彻头彻尾的简单://div[label[text()='Last Name']]/span[@class='metadataField metadataFieldReadonly']/input-从字面上看," input包含在spanmetadataFieldmetadataFieldReadonly包含在类中div包含label有文本'姓’ ".所以你正在使用标签找到div,然后从它构建到你想要的输入.

为了更加健壮,您不应该依赖类名的排序 - 这不是规范所保证的.所以这样的事情会更强烈://div[label[text()='Last Name']]/span[contains(concat(' ', @class,' '),' metadataField ') and contains(concat(' ',@class,' '),' metadataFieldReadonly ')]/input.