如何使用XPath仅选择可见元素?

时间:2009-03-16 19:19:49

标签: gwt xpath selenium

我有一个GWT应用程序,我正在尝试使用Selenium编写一些测试。

我正在使用XPath来识别测试页面上的元素。使用id将无法正常工作,因为GWT会自动生成id值并且可以更改。当我意识到我可以通过他们的标签找到按钮时,情况开始顺利:

//button[.='OK']

然而,当我开始运行多个测试时,我开始遇到问题。我意识到问题是一旦由Javascript生成的GWT应用程序的所有不同“页面”保留在隐藏<div>元素的HTML中。这意味着我的Selenium测试有时会点击隐藏按钮而不是当前视图中可见的按钮。

使用Firebug检查HTML,似乎GWT通过将<div>添加到display: none属性来隐藏style元素。这意味着我可以找到所有隐藏的OK按钮,如下所示:

//div[contains(@style,'display: none')]//button[.='OK']

这将找到所有隐藏的OK按钮,即具有祖先<div>的按钮,display: none中有style隐藏了该按钮。

我的问题是:如何使用XPath只查找可见的OK按钮?如何找到<div>中没有祖先display: none元素和style的按钮?

5 个答案:

答案 0 :(得分:53)

这应该有效:

.//button[.='OK' and not(ancestor::div[contains(@style,'display:none')])
and not(ancestor::div[contains(@style,'display: none')])]

编辑:

下面更简单,更有效的表达方式:

//div[not(contains(@style,'display:none'))]//button[.='OK']

无法正常工作,因为每个按钮至少有一个在其祖先中可见的div。

答案 1 :(得分:12)

Selenium 2 Webdriver为我们提供了isDisplayed()方法的选项,可以解决这个问题。硒贡献者的出色工作。

答案 2 :(得分:0)

//div[(contains(@style,'display: block'))]//button[@id='buttonid']

这对我有用。像'display: none'代表隐藏的块一样,'display: block'代表当前显示的块,我们可以指定要识别的任何内部标签

答案 3 :(得分:0)

这对我有用:

//div[[not(@hidden)]

答案 4 :(得分:-5)

//div[contains(@style,'display: block')]

此代码将找到可见元素xpath