【发布时间】:2016-08-04 01:40:05
【问题描述】:
我正在尝试使用 Java 和 Selenium WebDriver 自动化一些测试用例。我有以下情况:
- 有一个名为“产品”的页面。当我单击“查看详细信息”链接时 在“产品”页面中,会出现一个包含项目详细信息的弹出窗口(模式对话框)。
- 当我单击弹出窗口中的“关闭”按钮时,弹出窗口关闭并 页面自动刷新(页面刚刚重新加载,内容保持不变)。
关闭弹出窗口后,我需要单击 同一页。但是当 WebDriver 试图找到“添加项目”按钮时, 如果网速太快,WebDriver 可以找到并点击 元素。
但是如果网速很慢,WebDriver 会在 页面刷新,但只要 WebDriver 点击按钮,页面就会刷新并出现
StaleElementReferenceException。- 即使使用不同的等待,所有等待条件都变为真
(因为页面中的内容在重新加载之前和之后是相同的)
甚至在页面重新加载和
StaleElementReferenceException发生。
如果在单击“添加项目”按钮之前使用Thread.sleep(3000);,则测试用例可以正常工作。这个问题还有其他解决方法吗?
【问题讨论】:
-
我使用 Selenium 隐式等待,但并没有解决问题
-
这个问题可以很容易地通过使用 WebDriverWait 来解决,它等待条件返回真值或非空值,直到发生超时。条件是,单击 try-catch 中的元素。在 try 中,单击元素,如果完成则返回 true,在 catch 中,捕获 StaleElementReferenceException 并返回 null。因此,如果单击导致 StaleElementException,则再次执行条件,直到单击成功或发生超时。这将有效地等待重新加载完成。
-
在上面的注释中补充一点:元素也应该在点击之前在 try 块中检索,因为一旦重绘元素,它的元素标识符就会改变。