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, которые можно использовать для ожидания, и их документацию.

https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html

Да Ошибка устаревшего элемента возникает, когда (принимая ваш сценарий) вы определили стратегию локатора, чтобы сначала нажать "Добавить элемент", а затем при закрытии всплывающего окна страница обновляется, следовательно, ссылка, определенная для "Добавить элемент", теряется в памяти, чтобы преодолеть это, вы должны переопределить стратегию локатора для "Добавить элемент" снова

понять это с помощью фиктивного кода

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

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