Селену нужно поспать, прежде чем перейти на следующую страницу
В настоящее время я изучаю 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 для элементов на странице, где вы выполняете действия.