Обновление веб-страницы с помощью WebDriver при ожидании определенного условия


154

Я ищу более элегантный способ обновления веб-страницы во время тестов (я использую 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();    

Возможно, это лучшее решение для поиска элемента на обновленной вручную странице.

Ответы:


294

В Java или JavaScript:

driver.navigate().refresh();

Это должно обновить страницу.


Довольный! это помогло тебе. В качестве альтернативы, если вы используете исключительно селен RC или WebDriverBackedSelenium, вы также можете использовать: selenium.refresh ();
Manpreet Singh

47
Это не совсем эквивалентно нажатию клавиши F5. driver.navigate().refresh()в заголовке запроса говорится «no-cache» и, как результат, безоговорочно перезагружает весь контент. Принимая во внимание, что нажатие F5 может привести к запросу «If-Modified-Since», который может получить ответ «304 Not Modified». Вы должны помнить об этой разнице, если выполняете нагрузочное тестирование.
Всеволод Голованов

@Manpreet Спасибо за решение. Это достойно Upvote.
RNS

75

В Python есть способ сделать это: driver.refresh(). Это может быть не так в Java.

Кроме того, вы могли бы driver.get("http://foo.bar");, хотя я думаю, что метод обновления должен работать просто отлично.


1
Если вы используете, driver.get("http://foo.bar")возможно, просто используйтеdriver.get(driver.current_url)
Мэтт М.


21

5 различных способов обновить веб-страницу с помощью Selenium Webdriver

Специального дополнительного кодирования нет. Я только что использовал существующие функции по-разному, чтобы заставить его работать. Они здесь :

  1. Использование метода sendKeys.Keys

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. Использование метода navigate.refresh ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. Использование метода navigate.to ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. Использование метода get ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. Используя SendKeys () метод

    driver.get("https://accounts.google.com/SignUp"); 
    driver.findElement(By.id("firstname-placeholder")).sendKeys("\uE035");
    

16

Найдены различные подходы к обновлению приложения в селене: -

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


1
Ницца! несколько способов сделать это. findElement (By.id ("Свяжитесь с нами")) не очень хороший способ. более надежный всегда присутствующий элемент хорош, например: '/ html / body'. Это работает для жесткого обновления? а что, если на странице есть данные поста, как известно, firefox показывает диалог данных поста.
mrtipale


5

Альтернатива для обновления страницы (F5)

driver.navigate().refresh();

(или)

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.F5).perform();

4

Важно отметить, что вызов driver.navigate (). 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();
}

Некоторые заметки:

  • Поскольку вы перезагружаете страницу, вы не можете просто проверить существование данного элемента, потому что этот элемент будет там до начала перезагрузки и после того, как это будет сделано. Поэтому иногда вы можете получить правду, но страница еще даже не начала загружаться.
  • Когда страница перезагрузится, проверка WebElement.isDisplayed () вызовет исключение StaleElementReferenceException. Остальное только для того, чтобы охватить все базы
  • getName (): внутренний метод, который получает имя страницы
  • getMaximumLoadTime (): внутренний метод, который возвращает продолжительность загрузки страницы в секундах.
  • verify (): внутренний метод гарантирует, что страница действительно загружена

Опять же, в подавляющем большинстве случаев цикл do / while запускается один раз, потому что код, выходящий за пределы navigate (). Refresh (), не выполняется до тех пор, пока браузер не перезагрузит страницу полностью, но мы видели случаи, когда на самом деле этот цикл занимает несколько секунд, потому что navigate (). refresh () не блокировался до завершения загрузки браузера.


Ответ с верным значением ... Спасибо.
Огмиос


2

Существует также случай, когда вы хотите обновить только конкретный iframe на странице, а не всю страницу.

Вы делаете это следующим образом:

public void refreshIFrameByJavaScriptExecutor(String iFrameId){
        String script= "document.getElementById('" + iFrameId+ "').src = " + "document.getElementById('" + iFrameId+ "').src";
       ((IJavaScriptExecutor)WebDriver).ExecuteScript(script);
}


1

Еще один способ обновить текущую страницу, используя селен в Java.

//first: get the current URL in a String variable
String currentURL = driver.getCurrentUrl(); 
//second: call the current URL
driver.get(currentURL); 

Использование этого обновит текущую страницу, например, нажав на адресную строку браузера и нажав клавишу ввода.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.