Обновление веб-страницы 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 ответов


в Java или JavaScript:

driver.navigate().refresh();

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


в 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

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

  1. используя sendkeys будет.Ключи!--7--> метод

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

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. С помощью перейти.на() метод

    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");
    

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

driver.Navigate().Refresh();

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

driver.navigate().refresh();

(или)

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

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

Driver.Instance.Navigate().Refresh();

важно отметить, что драйвер.плавать.)(вызов 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);
}

в PHP:

$driver->navigate()->refresh();

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

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

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