Подтвердить что ты не робот

Selenium - Как дождаться полной загрузки страницы

Я пытаюсь автоматизировать некоторые тестовые случаи, используя Java и Selenium WebDriver. У меня есть следующий сценарий:

  • Есть страница под названием "Продукты". Когда я щелкаю ссылку "Просмотр сведений" на странице "Продукт", появляется всплывающее окно (модальное диалоговое окно), содержащее сведения об элементе.
  • Когда я нажимаю на кнопку "Закрыть" во всплывающем окне, всплывающее окно закрывается, и страница автоматически обновляется (страница просто перезагружается, содержимое остается неизменным).
  • После закрытия всплывающего окна мне нужно нажать кнопку "Добавить элемент" на той же странице. Но когда WebDriver пытается найти кнопку "Добавить элемент", если скорость интернета слишком высока, WebDriver может найти и щелкнуть элемент.

  • Но если интернет работает медленно, WebDriver находит кнопку до обновления страницы, но как только WebDriver нажимает на кнопку, страница обновляется и возникает StaleElementReferenceException.

  • Даже если используются разные ожидания, все условия ожидания становятся истинными (поскольку содержимое на странице одинаково до и после перезагрузки) даже до перезагрузки страницы и StaleElementReferenceException.

Тестовый пример работает нормально, если Thread.sleep(3000); используется перед нажатием на кнопку "Добавить элемент". Есть ли другой способ обойти эту проблему?

4b9b3361

Ответ 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 вы хотите, чтобы код примера не стеснялся связаться со мной вызывающе, я предоставлю связанный код