我的 java/selenium 项目突然出错,但元素仍然存在于 Web 应用程序中。

我的 java/selenium 项目突然出错,但元素仍然存在于 Web 应用程序中。所以我突然收到一些奇怪的东西。直到今天早上一切都运转良好。我之前已经执行了大约 1000 次这些测试,同时前端没有发生任何改变。

错误示例:

org.openqa.selenium.WebDriverException:未知错误:未处理的检查器错误:{“code”:-32000,“message”:“找不到具有指定id的上下文”}

或者

org.openqa.selenium.TimeoutException:预期条件失败:等待存在位于以下位置的元素:By.linkText:Betalingsregeling(尝试 10 秒,间隔 500 毫秒)

或者

org.openqa.selenium.StaleElementReferenceException:过时的元素引用:元素未附加到页面文档(会话信息:chrome=77.0.3865.90)

或者

org.openqa.selenium.NoSuchElementException:没有这样的元素:无法定位元素:{“method”:“css选择器”,“selector”:“input [id * ='searchCriteria [0]'] [class * ='col -sm-8']"}(会话信息:chrome=77.0.3865.90)


喵喵时光机
浏览 95回答 3
3回答

幕布斯7119047

切换到 iframe 后,我已经修复了一些 Thread.sleep 的问题。不知道为什么切换到 iframe 后和查找元素之前的显式等待失败,我将超时设置为 15 秒,并在每个元素之前构建显式等待。显然框架内的元素突然没有足够的时间来完全加载...... public static void switchToIFramesOfSearchPage() {    wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector(GENERAL_IFRAME_CSS_LOCATOR_VALUE)));    driver.switchTo().frame(SEARCH_PAGE_IFRAME1_ID_LOCATOR_VALUE);    driver.switchTo().frame(SEARCH_PAGE_IFRAME2_ID_LOCATOR_VALUE);    try {        Thread.sleep(500);    } catch (InterruptedException e) {        e.printStackTrace();    }}public static void switchToIFrameOfToolbar() {    wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector(GENERAL_IFRAME_CSS_LOCATOR_VALUE)));    driver.switchTo().frame(TOOLBAR_IFRAME_ID_LOCATOR_VALUE);    try {        Thread.sleep(500);    } catch (InterruptedException e) {        e.printStackTrace();    }}public static void switchToIframeOfActivitiesPane(){    wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector(GENERAL_IFRAME_CSS_LOCATOR_VALUE)));    driver.switchTo().frame(ACTIVITIES_PANE_IFRAME_ID_LOCATOR_VALUE);    try {        Thread.sleep(750);    } catch (InterruptedException e) {        e.printStackTrace();    }}public static void switchToIFrameOfHistoryPane() {    wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector(GENERAL_IFRAME_CSS_LOCATOR_VALUE)));    driver.switchTo().frame(HISTORY_PANE_IFRAME_ID_LOCATOR_VALUE);    try {        Thread.sleep(1000);    } catch (InterruptedException e) {        e.printStackTrace();    }}public static void switchToIFrameOfImportantView(){    wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector(GENERAL_IFRAME_CSS_LOCATOR_VALUE)));    driver.switchTo().frame(IMPORTANT_VIEW_IFRAME_ID_LOCATOR_VALUE);    try {        Thread.sleep(1000);    } catch (InterruptedException e) {        e.printStackTrace();    }}public static void switchToIFrameOfAccountView(){    wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector(GENERAL_IFRAME_CSS_LOCATOR_VALUE)));    driver.switchTo().frame(ACCOUNT_VIEW_IFRAME_ID_LOCATOR_VALUE);    try {        Thread.sleep(1000);    } catch (InterruptedException e) {        e.printStackTrace();    }}

POPMUISE

您只需要使用显式或隐式等待。元素在页面上可用,但无法通过 Selenium 访问,因此您必须等到它可供访问。

千万里不及你

听起来您的网站已更改。在您通常测试的网站上用 Chrome 中的 F12 检查 ID,并确保它们仍然相同。或者; 您可能会遇到典型的“我的应用程序整个周末都在运行,但现在周一早上速度很慢”延迟。根据大约一半的错误,我唯一的另一个猜测是您不小心引用了较旧的 WebDriver,而不是使用您认为正在使用的 WebDriver。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java