57

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

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

//button[.='OK']

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

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

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

这将找到所有隐藏的 OK 按钮,即具有祖先的按钮,该祖先<div>被隐藏display: nonestyle.

我的问题是:如何使用 XPath 仅查找可见的 OK 按钮?如何在 中找到没有祖先<div>元素display: none的按钮style

4

7 回答 7

70

这应该有效:

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

于 2009-03-16T19:24:41.800 回答
14

Selenium 2 Webdriver 为我们提供了处理此问题的 isDisplayed() 方法选项。硒贡献者的出色工作。

于 2012-06-01T09:49:28.747 回答
2

这对我有用:

//div[[not(@hidden)]
于 2020-08-25T21:27:43.120 回答
0

//div[(contains(@style,'display: block'))]//button[@id='buttonid']

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

于 2019-03-12T12:06:45.360 回答
0

我将此代码添加到名称映射编辑器中,但它一旦出现就没有找到 Keep 按钮。系统会在编辑器中看到它,但它不想在创建包含此项目的新测试时单击该按钮。

现在另一件事是动态按钮单击,所以我将选择一个打开下拉列表的按钮,我将这些项目放置在这些下拉列表中。现在它适用于第一个项目,但下次在另一个屏幕中使用它时无法识别相同的映射项目。两个区域的按钮保持是相同的。

于 2021-10-20T23:42:48.253 回答
0

对我来说,这有助于消除隐藏元素:

//div[@open]//*
于 2021-11-18T16:28:06.213 回答
-4
//div[contains(@style,'display: block')]

此代码将找到可见元素 xpath

于 2017-10-26T11:01:38.287 回答