我正在尝试在页面上找到特定元素,但无法确定要使用的正确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中找到// 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中找到span的输入,其中包含一个带有'Last Name'的标签。
所以我需要知道如何将这两个XPath语句组合成一个复杂的语句(假设它们在同一个div中,并且标签和span是兄弟姐妹):
//div/label[text()='Last Name']
//div/span[@class='metadataField metadataFieldReadonly']/input
由于
答案 0 :(得分:6)
这很简单://div[label[text()='Last Name']]/span[@class='metadataField metadataFieldReadonly']/input
- 确切地说,“ input
中包含的span
metadataField
中包含的metadataFieldReadonly
和div
类label
包含//div[label[text()='Last Name']]/span[contains(concat(' ', @class,' '),' metadataField ') and contains(concat(' ',@class,' '),' metadataFieldReadonly ')]/input
,文字“姓氏”“。所以你正在使用标签找到div,然后从中构建你想要的输入。
为了更健壮,你不应该依赖于类名的排序 - 这不是规范所保证的。所以这样的事情会更强大:{{1}}。