我有一个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
的按钮?
答案 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