Selenium - Как дождаться полной загрузки страницы
Я пытаюсь автоматизировать некоторые тестовые случаи с помощью веб-драйвера Java и Selenium. У меня есть следующий сценарий:
- Есть страница под названием "Продукты". Когда я щелкаю ссылку "Просмотр сведений" на странице "Продукт", появляется всплывающее окно (модальное диалоговое окно), содержащее сведения об элементе.
- Когда я нажимаю на кнопку "Закрыть" во всплывающем окне, всплывающее окно закрывается, и страница автоматически обновляется (страница просто перезагружается, содержимое остается неизменным).
После закрытия всплывающего окна мне нужно нажать кнопку "Добавить элемент" на той же странице. Но когда веб-драйвер пытается найти кнопку "Добавить элемент", если скорость Интернета слишком высокая, веб-драйвер может найти и щелкнуть элемент.
Но если Интернет работает медленно, веб-драйвер находит кнопку до обновления страницы, но как только веб-драйвер нажимает на кнопку, страница обновляется, и возникает исключение StaleElementReferenceException.
- Даже если используются разные ожидания, все условия ожидания становятся истинными (поскольку содержимое на странице одинаково до и после перезагрузки) даже до перезагрузки страницы и возникновения исключения StaleElementReferenceException.
Тестовый пример работает нормально, если Thread.sleep(3000);
используется перед нажатием на кнопку "Добавить элемент". Есть ли другой способ обойти эту проблему?
5 ответов
3 ответа, которые вы можете объединить:
1.) Установите неявное ожидание сразу после создания экземпляра веб-драйвера: driver.manage().timeouts().implicitlyWait()
, Это попытается дождаться полной загрузки страницы при каждой навигации по странице или перезагрузке страницы.
2.) После навигации по страницам вызовите JavaScript return document.readyState
до тех пор "complete"
возвращается Экземпляр веб-драйвера может служить исполнителем JavaScript. образец кода:
C#
new WebDriverWait(driver, MyDefaultTimeout).Until(
d => ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState").Equals("complete"));
Джава
new WebDriverWait(firefoxDriver, pageLoadTimeout).until(
webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
3.) После 2.), проверьте, соответствует ли URL шаблону, который вы ожидаете.
Похоже, вам нужно дождаться перезагрузки страницы, прежде чем нажимать кнопку "Добавить". В этом случае вы можете подождать, пока элемент "Добавить элемент" устареет, прежде чем щелкнуть по перезагруженному элементу:
WebDriverWait wait = new WebDriverWait(driver, 20);
By addItem = By.xpath("//input[.='Add Item']");
// get the "Add Item" element
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(addItem));
//trigger the reaload of the page
driver.findElement(By.id("...")).click();
// wait the element "Add Item" to become stale
wait.until(ExpectedConditions.stalenessOf(element));
// click on "Add Item" once the page is reloaded
wait.until(ExpectedConditions.presenceOfElementLocated(addItem)).click();
Вы можете сделать это разными способами, прежде чем нажимать на добавление элементов:
WebDriverWait wait = new WebDriverWait(driver, 40);
wait.until(ExpectedConditions.elementToBeClickable(By.id("urelementid")));// instead of id u can use cssSelector or xpath of ur element.
or
wait.until(ExpectedConditions.visibilityOfElementLocated("urelement"));
Вы также можете подождать, как это. Если вы хотите подождать, пока не исчезнет элемент предыдущей страницы:
wait.until(ExpectedConditions.invisibilityOfElementLocated("urelement"));
Вот ссылка, где вы можете найти все API-интерфейсы Selenn Webdriver, которые можно использовать для ожидания, и их документацию.
Да Ошибка устаревшего элемента возникает, когда (принимая ваш сценарий) вы определили стратегию локатора, чтобы сначала нажать "Добавить элемент", а затем при закрытии всплывающего окна страница обновляется, следовательно, ссылка, определенная для "Добавить элемент", теряется в памяти, чтобы преодолеть это, вы должны переопределить стратегию локатора для "Добавить элемент" снова
понять это с помощью фиктивного кода
// clicking on view details
driver.findElement(By.id("")).click();
// closing the pop up
driver.findElement(By.id("")).click();
// and when you try to click on Add Item
driver.findElement(By.id("")).click();
// you get stale element exception as reference to add item is lost
// so to overcome this you have to re identify the locator strategy for add item
// Please note : this is one of the way to overcome stale element exception
// Step 1 please add a universal wait in your script like below
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); // just after you have initiated browser
Существует два различных способа использовать задержку в селене, который наиболее часто используется. Пожалуйста, попробуйте это:
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
Второй, который вы можете использовать, это просто попробовать метод catch, используя этот метод, вы можете получить желаемый результат. Если вы хотите пример кода, не стесняйтесь связаться со мной вызывающе, я предоставлю соответствующий код