0

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

错误示例:

org.openqa.selenium.WebDriverException: 未知错误: 未处理的检查器错误: {"code":-32000,"message":"Cannot find context with specified 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","selector":"input[id*='searchCriteria[0]'][class*='col -sm-8']"}(会话信息:chrome=77.0.3865.90)

4

3 回答 3

0

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

于 2019-09-30T14:27:24.633 回答
0

听起来您的网站已更改。在您通常测试的网站上检查带有 F12 的 chrome 中的 ID,并确保它们仍然相同。

或者; 您可能会遇到典型的“我的应用程序整个周末都在运行,现在周一早上速度很慢”的延迟。如果是这种情况,@Pratik 的答案是正确的,但请尝试增加超时而不是添加硬编码的睡眠。

基于大约一半的错误,我唯一的另一个猜测是,您不小心引用了较旧的 WebDriver,而不是使用您认为正在使用的那个。

于 2019-09-30T14:29:18.613 回答
0

切换到 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();
    }
}
于 2019-10-07T11:07:11.547 回答