2013-10-20 53 views
1

我试图找到一个页面上的特定元素,但无法找出正确的Xpath使用。Selenium Java 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> 

所以我试图找到INPUT元素是// DIV/SPAN [@类=” metadataField metadataFieldReadonly '] /输入在具有// DIV /标签[文本同一div()=' 最后名称']

我可以成功地找到与此(使用JAVA)标签:

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

我可以成功y随此找到的第一个元素下的第一个输入(但我可能不会总是希望第一个元素):

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

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

所以换言之,我需要在同一个div中找到span中的输入,该div中包含'Last Name'标签。

所以我需要知道如何将这两个XPath语句组合成一个复杂的语句(假设他们是在同一div和标签和跨度是兄弟):

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

感谢

回答

5

这很简单://div[label[text()='Last Name']]/span[@class='metadataField metadataFieldReadonly']/input - 字面意思是,“input包含在spanmetadataFieldmetadataFieldReadonly类包含在div包含label文本'Last Nam e'“。所以你使用标签来定位div,然后从它建立到你想要的输入。

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

+0

现在很容易,现在我看到如何做到这一点大声笑!我现在可以看到你如何使用标签周围的方括号来选择特定的div ......这是我无法弄清的!接受为正确答案。谢谢 – jsherk

+0

和+1的额外信息类名称排序:) – jsherk

+0

“标签周围的_square括号选择一个特定的div_”的作品,因为大多数人认为作为一个地方来检查一个属性值实际上是一个非常强大的条件表达模型。走出去征服:-) –