frameToBeAvailableAndSwitchToIt 之后的 Selenium StaleElementReferenceException

问题描述

如果 Selenium 抛出 StaleElementReferenceException,通常是 (?) 因为 Selenium “拥有”的网页状态 (DOM) 由于外部干扰而改变,但是当我在 frametoBeAvailableAndSwitchToIt 之前添加 switch 时我开始得到它{1}} 语句。我的代码

driver.findElement(By.xpath(xpDownArrow)).click();
WebElement iframeElement = driver.findElement(By.xpath(xpIframe));
wait.until(ExpectedConditions.frametoBeAvailableAndSwitchToIt(By.xpath(xpIframe)));
driver.switchTo().frame(iframeElement);

最初我的代码只包含第 1、2 和 4 行,大部分时间都有效,但有 10-20% 的执行失败,因此我添加了第 2 行,但现在我每次都得到 StaleElementReferenceException代码执行。我不明白。为什么第 3 行会更改 DOM?这不是执行 switch 的推荐方式吗?

解决方法

代替那些较小的冗余步骤,您可以切换到所需的 <iframe> 诱导 WebDriverWait 使用 优化如下:

new WebDriverWait(driver,10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("xpIframe")));

参考

您可以在以下位置找到一些相关讨论:

,

第 3 行

wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath(xpIframe)));

您已经切换到 iframe。所以不需要第 4 行——它只是尝试切换到同一帧。尽量去掉(第2行也是多余的)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...