等待特定条件时通过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();    

也许是在手动刷新的页面上查找元素的更好的解决方案

Answers:


294

在Java或JavaScript中:

driver.navigate().refresh();

这应该刷新页面。


高兴!它帮助了您。另外,如果您使用的是纯硒RC或WebDriverBackedSelenium,则还可以使用:selenium.refresh();。
Manpreet Singh'4

47
但是,这并不完全等同于按F5。driver.navigate().refresh()在其请求标头中显示“ no-cache”,因此无条件重新加载所有内容。按下F5可能会导致“ If-Modified-Since”请求,但可能会收到“ 304 Not Modified”响应。如果进行负载测试,则必须牢记这种差异。
Vsevolod Golovanov

@Manpreet感谢您的解决方案。值得Upvote。
RNS

75

在Python中有这样做的方法:driver.refresh()。在Java中可能不同。

另外,您也可以driver.get("http://foo.bar");,尽管我认为refresh方法应该可以正常工作。


1
如果您也使用driver.get("http://foo.bar"),请使用driver.get(driver.current_url)
Matt


21

使用Selenium Webdriver刷新网页的5种不同方式

没有特殊的额外编码。我只是以不同方式使用现有功能来使其正常工作。他们来了 :

  1. 使用sendKeys.Keys方法

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. 使用navigation.refresh()方法

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. 使用Navigation.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(“ Contact-us”))不是一个好方法。始终存在的元素更可靠总是很好的,例如:'/ html / body'。这样可以进行硬刷新吗?以及如果页面具有发布数据怎么办,firefox已知会显示发布数据对话框。
mrtipale '18

11

这是稍有不同的C#版本:

driver.Navigate().Refresh();

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循环只运行一次,因为在浏览器实际完全重载页面之前,不会执行navigation()。refresh()之外的代码,但是我们已经看到了其中实际上需要花费几秒钟来完成该循环,因为navigation()。refresh()直到浏览器完成加载才被阻塞。


真正有价值的答案...谢谢。
Ogmios '18 -10-25


2

在某些情况下,您只想刷新页面上的特定iframe而不刷新整个页面。

您要做的如下:

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


1

Java中使用Selenium刷新当前页面的另一种方法。

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

使用它会刷新当前页面,就像单击浏览器的地址栏并按Enter一样。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.