问题描述
如果 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 使用 xpath 优化如下:
new WebDriverWait(driver,10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("xpIframe")));
参考
您可以在以下位置找到一些相关讨论:
- Ways to deal with #document under iframe
- Is it possible to switch to an element in a frame without using driver.switchTo().frame(“frameName”) in Selenium Webdriver Java?
第 3 行
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath(xpIframe)));
您已经切换到 iframe。所以不需要第 4 行——它只是尝试切换到同一帧。尽量去掉(第2行也是多余的)