如何解决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 使用 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行也是多余的)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。