用于访问JS生成的类实例的xpath

时间:2011-12-06 14:11:50

标签: xpath webdriver

我需要使用xpath作为Selenium Webdriver的定位器来点击按钮。它位于动态生成的对话框中。 Firebug / firepath为div引用提供了会改变的数字。我已经在这里阅读了很多很棒的技巧并且很接近但似乎无法获得确切的规格。我需要xpath来访问Close和Cancel:

<div class="ui-dialog-buttonpane ui-widget-content ui-helper-clearfix">
<button class="ui-button ui-widget ui-state-default ui-corner-all 
ui-button-text-only  ui-state-hover" type="button" role="button" aria-disabled="false">
<span class="ui-button-text">Close</span>
</button>
<button class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
type="button" role="button" aria-disabled="false">
<span class="ui-button-text">Create</span>

两者都没有成功:

    xpath="//*[@class='ui-button-text' and @value='Close'") 
    xpath="//span[contains(@class='ui-button-text' and @value='Close')]")

2 个答案:

答案 0 :(得分:1)

使用

//span[@class = 'ui-button-text' and . = 'Close']

这些元素选择XML文档中的所有span元素,字符串值为"Close",其class属性为"ui-button-text"的字符串值。

答案 1 :(得分:0)

使用@Dimitre的表达式:

//span[@class='ui-button-text' and .='Close']

我正在回答您解释原始表达方式出错的地方。

第一个表达

//*[@class='ui-button-text' and @value='Close'")]

这会选择文档(*)中任何位置(//)的所有元素(@),这些元素的属性(class)名为ui-button-text,其值为value以及名为Close的属性,其值为@。属性轴说明符是attribute::符号。这是//*[@class='ui-button-text' and @value='Close'")] //*[attribute::class='ui-button-text' and attribute::value='Close'")] 的缩写。以下表达式是等效的:

/descendant-or-self::node()/child::*[attribute::class='ui-button-text' and 
                                     attribute::value='Close'")] 

以上表达式可以完全扩展为:

//span[contains(@class='ui-button-text' and @value='Close')]

简而言之:在构造表达式时,尝试理解XPath的语法缩写

第二个表达

boolean contains(string, string)

XPath contains function具有以下签名:

{{1}}

...并在规范中描述如下:

  

如果第一个参数字符串,则contains函数返回true   包含第二个参数字符串,否则返回false。

您似乎试图将其视为一种更通用的魔术函数,用于检查元素是否“包含”某些属性,但它基本上是 string 函数。

我建议快速(或不那么快)阅读XPath 1.0建议书:

在此之前,你只是在猜测。