Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gwt 如何使用XPath仅选择可见元素?_Gwt_Xpath_Selenium - Fatal编程技术网

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

Gwt 如何使用XPath仅选择可见元素?,gwt,xpath,selenium,Gwt,Xpath,Selenium,我有一个应用程序,我正试图使用它编写一些测试 我正在使用XPath识别页面上的元素以进行测试。使用id不起作用,因为id值由GWT自动生成,可以更改。当我意识到我可以通过标签找到按钮时,事情开始进展顺利,如下所示: //button[.='OK'] //div[contains(@style,'display: none')]//button[.='OK'] 然而,当我开始运行多个测试时,我开始遇到问题。我意识到问题在于,Javascript生成的GWT应用程序的所有不同“页面”都保留在HT

我有一个应用程序,我正试图使用它编写一些测试

我正在使用XPath识别页面上的元素以进行测试。使用
id
不起作用,因为
id
值由GWT自动生成,可以更改。当我意识到我可以通过标签找到按钮时,事情开始进展顺利,如下所示:

//button[.='OK']
//div[contains(@style,'display: none')]//button[.='OK']
然而,当我开始运行多个测试时,我开始遇到问题。我意识到问题在于,Javascript生成的GWT应用程序的所有不同“页面”都保留在HTML中隐藏的
元素中。这意味着我的Selenium测试有时会单击隐藏按钮,而不是当前视图中可见的按钮

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

//button[.='OK']
//div[contains(@style,'display: none')]//button[.='OK']
这将找到所有隐藏的OK按钮,即具有祖先
的按钮,该祖先通过
样式中的
display:none
隐藏

我的问题是:如何使用XPath只查找可见的OK按钮?如何找到在
样式中没有祖先
元素且显示为
的按钮:none

这应该起作用:

.//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。

Selenium 2 Webdriver为我们提供了处理此问题的isDisplayed()方法选项。硒贡献者做得很好

//div[contains(@style,'display: block')]
此代码将找到可见元素xpath

//div[(包含(@style,'display:block'))]//按钮[@id='buttonid']

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

这对我来说很有效:

//div[[not(@hidden)]

如果dom树中有另一个未隐藏的div,那么最后一个就不起作用了:注意上面的div与前面的div不匹配(空格使其不同)。请注意:尽管这是一个很好的解决方案(也是最好的XPath可能做到的),但它并不适用于所有情况,因为给定元素可能有一个CSS类,其中
显示:none,从而使元素不可见,但仍与此XPath表达式匹配。与其设置该元素,还不如在检查属性之前从属性中删除该空间。translate(规范化空格(@style),“”,“”,“”)将处理任意数量的空格。为什么重复和不重复(祖先::div[contains(@style,'display:none'))?如果显示隐藏属性位于父元素而不是元素本身,则该操作是否有效?是的,但必须针对特定元素检查此操作,无法匹配整个集合。请小心,因为在检索(
find by*
)和使用
isDisplayed()
检查其可见性之间更改元素时,这可能会引发
StaleElementReferenceException
异常。您知道还有其他类型的可能显示值,对吗?像
inline
inline block
flex
,…不工作,也匹配隐藏元素。