0

如果 Selenium 抛出 StaleElementReferenceException 它通常是(?),因为网页(DOM)Selenium“拥有”的状态由于外部干扰而发生了变化,但是当我在声明frameToBeAvailableAndSwitchToIt之前添加时我开始得到它。switch我的代码:

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吗?

4

2 回答 2

1

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

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

参考

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

于 2020-12-22T12:19:30.650 回答
0

与第 3 行

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

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

于 2020-12-22T12:05:18.627 回答