如果Selenium抛出StaleElementReferenceException,通常是(?(,因为网页(DOM(Selenium的状态;拥有";由于外部干扰而发生了变化,但当我在switch
语句之前添加frameToBeAvailableAndSwitchToIt
时,我开始得到它。我的代码:
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
的方式吗?
您可以使用最佳的xpath将切换到所需的<iframe>
诱导WebDriverWait,而不是那些较小的冗余步骤,如下所示:
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("xpIframe")));
参考
你可以在中找到一些相关的讨论
- 如何处理iframe下的#文档
- 在SeleniumWebdriverJava中,是否可以在不使用driver.switchTo((.frame("frameName"(的情况下切换到框架中的元素
带第3行
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath(xpIframe)));
您已经切换到iframe。所以不需要第4行——它只是试图切换到同一帧。尝试删除它(第2行也是多余的(