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

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

pbaranski
источник

Ответы:

294

В Java или JavaScript:

driver.navigate().refresh();

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

Manpreet Singh
источник
Довольный! это помогло тебе. В качестве альтернативы, если вы используете исключительно селен 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)
Мэтт М.
54

В питоне

Используя встроенный метод

driver.refresh()

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

driver.execute_script("location.reload()")
Md. Nazmul Haque Sarker
источник
Как мы можем обновить модальные страницы?
Хамед Базияд
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");
    
Sandeep
источник
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
11

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

driver.Navigate().Refresh();
dmeehan
источник
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 () не блокировался до завершения загрузки браузера.

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

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

Driver.Instance.Navigate().Refresh();
user5320606
источник
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); 

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

RyanskyHeisenberg
источник
1

В R вы можете использовать метод refresh, но для начала перейдем к URL-адресу с помощью метода navigate:

remDr$navigate("https://...")
remDr$refresh()
Тиаго Мартинс Перес 李大仁
источник