Обновление веб-страницы WebDriver при ожидании определенного условия
Я ищу более элегантный способ обновления веб-страницы во время тестов (я использую Selenium2). Я просто отправляю ключ F5, но мне интересно, есть ли у драйвера метод обновления всей веб-страницы Вот мой код
while(driver.findElements(By.xpath("//*[text() = 'READY']")).size() == 0 )
driver.findElement(By.xpath("//body")).sendKeys(Keys.F5);
//element appear after text READY is presented
driver.findElement(By.cssSelector("div.column a")).click();
возможно, это лучшее решение для поиска элемента на обновленной вручную странице
12 ответов
в Python есть метод для этого:driver.refresh()
. Это может быть не то же самое в Java.
альтернативно, вы могли бы driver.get("http://foo.bar");
, хотя я думаю, что метод refresh должен работать нормально.
в python
использование встроенного метода
driver.refresh()
или выполнение JavaScript
driver.execute_script("location.reload()")
найдены различные подходы для обновления приложения в selenium : -
1.driver.navigate().refresh();
2.driver.get(driver.getCurrentUrl());
3.driver.navigate().to(driver.getCurrentUrl());
4.driver.findElement(By.id("Contact-us")).sendKeys(Keys.F5);
5.driver.executeScript("history.go(0)");
для живого кода, пожалуйста, обратитесь по ссылке http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html
5 различных способов обновления веб-страницы с помощью Selenium Webdriver
нет специального дополнительного кодирования. Я просто использовал существующие функции по-разному, чтобы заставить его работать. Вот они :
-
используя sendkeys будет.Ключи!--7--> метод
driver.get("https://accounts.google.com/SignUp"); driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
-
используя перейти.refresh () метод
driver.get("https://accounts.google.com/SignUp"); driver.navigate().refresh();
-
С помощью перейти.на() метод
driver.get("https://accounts.google.com/SignUp"); driver.navigate().to(driver.getCurrentUrl());
-
используя get () метод
driver.get("https://accounts.google.com/SignUp"); driver.get(driver.getCurrentUrl());
-
используя sendKeys () метод
driver.get("https://accounts.google.com/SignUp"); driver.findElement(By.id("firstname-placeholder")).sendKeys("\uE035");
Альтернативный для Обновление Страницы (F5)
driver.navigate().refresh();
(или)
Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.F5).perform();
важно отметить, что драйвер.плавать.)(вызов refresh () иногда кажется асинхронным, то есть он не ждет завершения обновления, он просто "запускает обновление" и не блокирует дальнейшее выполнение во время перезагрузки страницы браузером.
хотя это происходит только в меньшинстве случаев, мы решили, что лучше убедиться, что это работает на 100%, добавив ручную проверку, действительно ли страница началась перегрузка.
вот код, который я написал для этого в нашем базовом классе объектов страницы:
public void reload() {
// remember reference to current html root element
final WebElement htmlRoot = getDriver().findElement(By.tagName("html"));
// the refresh seems to sometimes be asynchronous, so this sometimes just kicks off the refresh,
// but doesn't actually wait for the fresh to finish
getDriver().navigate().refresh();
// verify page started reloading by checking that the html root is not present anymore
final long startTime = System.currentTimeMillis();
final long maxLoadTime = TimeUnit.SECONDS.toMillis(getMaximumLoadTime());
boolean startedReloading = false;
do {
try {
startedReloading = !htmlRoot.isDisplayed();
} catch (ElementNotVisibleException | StaleElementReferenceException ex) {
startedReloading = true;
}
} while (!startedReloading && (System.currentTimeMillis() - startTime < maxLoadTime));
if (!startedReloading) {
throw new IllegalStateException("Page " + getName() + " did not start reloading in " + maxLoadTime + "ms");
}
// verify page finished reloading
verify();
}
некоторые замечания:
- поскольку вы перезагружаете страницу, вы не можете просто проверить наличие данного элемента, потому что элемент будет там до начала перезагрузки и после ее завершения. Поэтому иногда вы можете получить true, но страница еще даже не начала загружаться.
- при перезагрузке страницы проверьте WebElement.isDisplayed () бросит StaleElementReferenceException. Остальное - просто охватить все базы
- getName (): внутренний метод, который получает имя страницы
- getMaximumLoadTime (): внутренний метод, который возвращает, как долго страница должна быть разрешена для загрузки в секундах
- verify (): внутренний метод гарантирует, что страница действительно загружена
опять же, в подавляющем большинстве случаев цикл do/while выполняется один раз, потому что код за пределами navigate().refresh() не выполняйте, пока браузер не перезагрузит страницу полностью, но мы видели случаи, когда на самом деле требуется несколько секунд, чтобы пройти через этот цикл, потому что navigate().refresh () не блокируется до завершения загрузки браузера.
существует также случай, когда вы хотите обновить только определенные iframe на странице, а не всю страницу.
Вы делаете это следующим образом:
public void refreshIFrameByJavaScriptExecutor(String iFrameId){
String script= "document.getElementById('" + iFrameId+ "').src = " + "document.getElementById('" + iFrameId+ "').src";
((IJavaScriptExecutor)WebDriver).ExecuteScript(script);
}
другой способ обновить текущую страницу с помощью selenium в Java.
//first: get the current URL in a String variable
String currentURL = driver.getCurrentUrl();
//second: call the current URL
driver.get(currentURL);
использование этого обновит текущую страницу, например, щелкнув адресную строку браузера и нажав enter.