Обновление веб-страницы с помощью 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();    

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


person pbaranski    schedule 20.04.2012    source источник


Ответы (13)


В Java или JavaScript:

driver.navigate().refresh();

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

person Manpreet Singh    schedule 20.04.2012
comment
Радостный! это помогло тебе. В качестве альтернативы, если вы используете исключительно Selenium RC или WebDriverBackedSelenium, вы также можете использовать: selenium.refresh (); - person Manpreet Singh; 23.04.2012
comment
Однако это не совсем то же самое, что нажать F5. driver.navigate().refresh() в заголовке запроса говорит об отсутствии кеширования и, как следствие, безоговорочно перезагружает все содержимое. В то время как нажатие F5 может привести к запросу If-Modified-Since, это может привести к ответу 304 Not Modified. Вы должны помнить об этой разнице, если проводите нагрузочное тестирование. - person Vsevolod Golovanov; 16.02.2013
comment
@Manpreet Спасибо за решение. Это достойно Upvote. - person RNS; 04.05.2017

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

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

person Isaac    schedule 20.04.2012
comment
Если вы используете driver.get("http://foo.bar"), можете просто использовать driver.get(driver.current_url) - person Mattwmaster58; 20.04.2018

В питоне

Использование встроенного метода

driver.refresh()

или, выполняя JavaScript

driver.execute_script("location.reload()")
person Md. Nazmul Haque Sarker    schedule 12.02.2014
comment
Как мы можем обновить модальные страницы? - person hamed baziyad; 26.01.2019

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");
    
person Sandeep    schedule 02.12.2016

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

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

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

Вот немного другая версия C #:

driver.Navigate().Refresh();
person dmeehan    schedule 08.07.2015

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

driver.navigate().refresh();

(или)

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.F5).perform();
person Prashanth Sams    schedule 04.09.2013

Важно отметить, что вызов 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 () не блокировалась, пока браузер не завершил загрузку.

person mac    schedule 09.06.2016
comment
Правдивый ответ ... Спасибо. - person Ogmios; 25.10.2018

Вы также можете попробовать

Driver.Instance.Navigate().Refresh();
person user5320606    schedule 10.09.2015

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

Вы делаете следующее:

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

В PHP:

$driver->navigate()->refresh();
person MegaCasper    schedule 15.06.2016

Другой способ обновить текущую страницу с помощью селена в Java.

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

Это обновит текущую страницу, например, щелкнув адресную строку браузера и нажав клавишу ВВОД.

person RyanskyHeisenberg    schedule 22.12.2016
comment
обновляет ли страницу использование getCurrentUrl () или get (CurrentUrl)? @RyanskyHeisenberg - person user3520544; 16.09.2020
comment
Нет, getCurrentUrl () предназначен только для извлечения активного URL. Вам нужно будет вызвать его снова, используя driver.get (var_extractedURL). По сути, он имитирует обновление, копируя активный URL-адрес и снова открывая его, используя ту же вкладку браузера. Надеюсь, это поможет. - person RyanskyHeisenberg; 21.09.2020

В R вы можете использовать метод обновления, но Для начала мы переходим к URL-адресу с помощью метода навигации:

remDr$navigate("https://...")
remDr$refresh()
person Tiago Martins Peres 李大仁    schedule 01.11.2019