Gwt 如何使用XPath仅选择可见元素?
我有一个应用程序,我正试图使用它编写一些测试 我正在使用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
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设置了code>,从而使元素不可见,但仍与此XPath表达式匹配。与其设置该元素,还不如在检查属性之前从属性中删除该空间。translate(规范化空格(@style),“”,“”,“”)将处理任意数量的空格。为什么重复和不重复(祖先::div[contains(@style,'display:none'))?如果显示隐藏属性位于父元素而不是元素本身,则该操作是否有效?是的,但必须针对特定元素检查此操作,无法匹配整个集合。请小心,因为在检索(find by*
)和使用isDisplayed()
检查其可见性之间更改元素时,这可能会引发StaleElementReferenceException
异常。您知道还有其他类型的可能显示值,对吗?像inline
,inline block
,flex
,…不工作,也匹配隐藏元素。