我有一个GWT应用程序,正在尝试使用Selenium编写一些测试。
我正在使用XPath来标识测试页面上的元素。使用id将无效,因为这些id值是由GWT自动生成的,并且可以更改。当我意识到我可以按其标签找到按钮时,事情进展顺利,如下所示:
id
//button[.='OK']
但是,当我开始运行多个测试时,我开始遇到问题。我意识到问题是,一旦Javascript生成的GWT应用程序的所有不同“页面”都保留在HTML中的隐藏<div>元素中。这意味着我的Selenium测试有时会单击隐藏的按钮,而不是在当前视图中可见的按钮。
<div>
用Firebug检查HTML ,看来GWT <div>通过添加元素display: none的style属性来隐藏元素。这意味着我可以找到所有隐藏的“确定”按钮,如下所示:
display: none
style
//div[contains(@style,'display: none')]//button[.='OK']
这将找到所有隐藏的“确定”按钮,即具有祖先的按钮,该祖先<div>通过在display: none中被隐藏style。
我的问题是:如何使用XPath仅查找可见的OK按钮?如何找到它们没有什么祖先的按钮<div>与元素display: none的style?
这应该工作:
.//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可见。