一尘不染

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

selenium

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

我正在使用XPath来标识测试页面上的元素。使用id将无效,因为这些id值是由GWT自动生成的,并且可以更改。当我意识到我可以按其标签找到按钮时,事情进展顺利,如下所示:

//button[.='OK']

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

Firebug检查HTML ,看来GWT <div>通过添加元素display: nonestyle属性来隐藏元素。这意味着我可以找到所有隐藏的“确定”按钮,如下所示:

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

这将找到所有隐藏的“确定”按钮,即具有祖先的按钮,该祖先<div>通过在display: none中被隐藏style

我的问题是:如何使用XPath仅查找可见的OK按钮?如何找到它们没有什么祖先的按钮<div>与元素display: nonestyle


阅读 898

收藏
2020-06-26

共1个答案

一尘不染

这应该工作:

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

2020-06-26