Selenium - Как дождаться полной загрузки страницы
Я пытаюсь автоматизировать некоторые тестовые случаи, используя Java и Selenium WebDriver. У меня есть следующий сценарий:
- Есть страница под названием "Продукты". Когда я щелкаю ссылку "Просмотр сведений" на странице "Продукт", появляется всплывающее окно (модальное диалоговое окно), содержащее сведения об элементе.
- Когда я нажимаю на кнопку "Закрыть" во всплывающем окне, всплывающее окно закрывается, и страница автоматически обновляется (страница просто перезагружается, содержимое остается неизменным).
-
После закрытия всплывающего окна мне нужно нажать кнопку "Добавить элемент" на той же странице. Но когда WebDriver пытается найти кнопку "Добавить элемент", если скорость интернета слишком высока, WebDriver может найти и щелкнуть элемент.
-
Но если интернет работает медленно, WebDriver находит кнопку до обновления страницы, но как только WebDriver нажимает на кнопку, страница обновляется и возникает StaleElementReferenceException
.
- Даже если используются разные ожидания, все условия ожидания становятся истинными (поскольку содержимое на странице одинаково до и после перезагрузки) даже до перезагрузки страницы и
StaleElementReferenceException
.
Тестовый пример работает нормально, если Thread.sleep(3000);
используется перед нажатием на кнопку "Добавить элемент". Есть ли другой способ обойти эту проблему?
Ответы
Ответ 1
3 ответа, которые вы можете комбинировать:
1.) Установите неявное ожидание сразу после создания экземпляра веб-драйвера: driver.manage().timeouts().implicitlyWait()
. Это попытается подождать, пока страница будет полностью загружена при каждой странице навигации или перезагрузки страницы.
2.) После навигации по странице вызовите JavaScript return document.readyState
, пока не будет возвращен "complete"
. Экземпляр веб-драйвера может служить исполнителем JavaScript. образец кода:
С#
new WebDriverWait(driver, MyDefaultTimeout).Until(
d => ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState").Equals("complete"));
Java
new WebDriverWait(firefoxDriver, pageLoadTimeout).until(
webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
3.) После 2.) проверьте, соответствует ли URL шаблону, который вы ожидаете.
Ответ 2
Кажется, вам нужно дождаться перезагрузки страницы, прежде чем нажимать кнопку "Добавить".
В этом случае вы можете дождаться, когда элемент "Добавить элемент" станет устаревшим, прежде чем нажимать на перезагруженный элемент:
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();
Ответ 3
Вы можете сделать это разными способами, прежде чем нажимать на добавление элементов:
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, которые можно использовать для ожидания, и их документацию.
https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html
Ответ 4
yes Ошибка просроченного элемента возникает, когда (принимая ваш сценарий) вы определили стратегию локатора, чтобы сначала нажать "Добавить элемент" , а затем, когда вы закрываете всплывающее окно, страница обновляется, поэтому ссылка, определенная для "Добавить элемент" , потерянный в памяти, поэтому, чтобы преодолеть это, вам нужно еще раз переопределить стратегию локатора для "Добавить элемент" .
понять его с помощью фиктивного кода
// 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
Ответ 5
Существует два разных способа использования задержки в селене, который наиболее часто используется. Попробуйте следующее:
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
второй, который вы можете использовать, это просто метод try catch, используя этот метод
вы можете получить свое желание result.if вы хотите, чтобы код примера не стеснялся связаться со мной вызывающе, я предоставлю связанный код