Селену нужно поспать, прежде чем перейти на следующую страницу

В настоящее время я изучаю Selenium, и я многому научился. Одна вещь, которую сказала община; в том, что вам нужно избегать thread.sle как можно больше. Selenium использует неявные и явные ожидания замены. Да, я понимаю эту концепцию.

Недавно я столкнулся с проблемой. Это без определенного действия; переход со страницы входа на другую страницу без использования Thread.sleep(1000). Селен кажется слишком большим: он не может найти определенный элемент. Я нахожу это поведение странным. Поэтому я подумал, что этот конфликт возникает из-за страницы входа, которая сначала хочет перенаправить на главную страницу сайта и без Thread.sleep(1000); он хочет перейти на вторую страницу, но страница входа отказывается, потому что хочет сначала перейти на главную страницу. С учетом вышесказанного, почему Selenium дает сбой или вы, ребята, видите и странное использование кода в приведенном ниже примере?

// Currently on a webpage   
     WebElement ui_login_button = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("account-login-button")));
            ui_login_button.click();
//After the click it logs in and redirects to a webpage

Thread.sleep(1000); // why sleep here? (without this Selenium crashes)

   // Go to second page and perform actions

waitForLoad(driver);
driver.navigate().to(URL + "/mymp/verkopen/index.html");

/* -------------------------------------------------------------------

public void waitForLoad(WebDriver driver) {
        ExpectedCondition<Boolean> pageLoadCondition = new
                ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver driver) {
                return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
            }
        };

        //WebDriverWait wait = new WebDriverWait(driver, 30);
        wait.until(pageLoadCondition);
    }

Извините за объяснение, я старался изо всех сил, чтобы быть ясным. Английский не мой родной язык. Спасибо за вашу помощь.

Добрые пожелания.

2 ответа

Вот ответ на ваш вопрос:

Согласно вашим обновленным комментариям It raises an exception that it can't find the element on the webpage очень возможно. Кроме того, когда вы упоминаете putting a sleep in between is not an elegant solution to fix Правильно как побуждение Thread.sleep(1000); ухудшает общее Test Execution Performance,

Теперь, что я заметил в вашем блоке с комментариями кода для сравнения document.readyState в complete был более мудрый шаг. Но иногда может случиться так, что, хотя веб-браузер отправит document.readyState как complete в селен, из-за наличия JavaScript а также AJAX Calls элементы, с которыми мы хотим взаимодействовать, могут не быть Visible, Clickable или же Interactable который в свою очередь может поднять связанный Exception,

Итак, решение ExplicitWait т.е. WebDriverWait, Мы будем побуждать ExplicitWait для элемента, с которым мы хотим взаимодействовать, с надлежащим ExpectedConditions задавать. Вы можете найти документацию о ExplicitWait здесь

Пример:

Если вы хотите дождаться нажатия кнопки, ожидаемый блок кода может быть в следующем формате вместе с импортом:

    import org.openqa.selenium.By;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;        

    // Go to second page and wait for the element    
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.elementToBeClickable(By.id("id_of_the_element")));        //perform actions
    driver.navigate().to(URL + "/mymp/verkopen/index.html");

Дайте мне знать, если это отвечает на ваш вопрос.

Я предполагаю, что исключение возникает после того, как вы перешли на URL + "/mymp/verkopen/index.html" и начали предпринимать какие-то действия.

Я предполагаю, что основная проблема заключается в том, что ваш метод waitForLoad() не ожидает завершения какого-либо Javascript или другого фонового задания на странице, к которой сначала идет Login. Поэтому, когда вы переходите на следующую страницу, что-то еще не завершено, и ваша аутентификация пользователя в плохом состоянии. Возможно, вам нужно дождаться завершения работы AJAX после входа в систему, прежде чем продолжить дальнейшую навигацию? Или было бы лучше щелкнуть ссылку на этой странице, чтобы вызвать переход к целевой странице (как реальный пользователь), а не напрямую вводить URL-адрес? Возможно, вам будет полезно обсудить реальное поведение веб-приложения с разработчиками.

Как указал DebanjanB, когда вы попадаете на целевую страницу, вы можете использовать WebDriverWait для элементов на странице, где вы выполняете действия.

Другие вопросы по тегам