Мой проект Java / Selen неожиданно дает ошибки, но элементы все еще есть в веб-приложении. Кто-нибудь знает, как это решить? - PullRequest
0 голосов
/ 30 сентября 2019

Мой проект java / selenium неожиданно выдавал ошибки, но элементы все еще присутствуют в веб-приложении. Так что я неожиданно получаю какие-то странные вещи. До утра все работало нормально. Я выполнил эти тесты, как 1000 раз, и за это время ничего не изменилось для внешнего интерфейса.

Примеры ошибок:

org.openqa.selenium.WebDriverException: неизвестная ошибка: необработанная ошибка инспектора: {"code": - 32000, "message": "Невозможно найти контекст с указанным идентификатором"}

или

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'] "} (Сессия info: хром = 77.0.3865.90) ​​

Ответы [ 3 ]

0 голосов
/ 30 сентября 2019

Похоже, ваш сайт изменился. Проверьте идентификаторы с помощью F12 в chrome на веб-сайте, который вы обычно тестируете, и убедитесь, что они все те же.

В качестве альтернативы;Возможно, вы испытываете типичную задержку «мое приложение работало все выходные, а теперь оно медленно в понедельник утром». Если дело обстоит именно так, ответ @ Pratik верен, но попробуйте увеличить время ожидания вместо добавления жестко запрограммированных снов.

Мое единственное другое предположение, основанное на примерно половине этих ошибок, заключается в том, что вы случайноссылаясь на более старый WebDriver и не используя тот, который, по вашему мнению, вы используете.

0 голосов
/ 07 октября 2019

Я исправил проблему с некоторым Thread.sleep после перехода на iframes. Не знаю, почему явное ожидание после переключения на iframes и перед тем, как найти элемент не удается, у меня установлено время ожидания 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();
    }
}
0 голосов
/ 30 сентября 2019

Вам просто нужно использовать явное или неявное ожидание. Элемент доступен на странице, но недоступен для Selenium, поэтому вам нужно подождать, пока он не станет доступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...