특정 조건 대기시 WebDriver로 웹 페이지 새로 고침


158

테스트 중에 웹 페이지를 새로 고치는 더 우아한 방법을 찾고 있습니다 (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();    

수동으로 새로 고친 페이지에서 요소를 찾는 데 더 나은 솔루션 일 수 있습니다.

답변:


299

Java 또는 JavaScript에서 :

driver.navigate().refresh();

페이지를 새로 고침해야합니다.


기쁜! 그것은 당신을 도왔습니다. 또는 순전히 셀레늄 RC 또는 WebDriverBackedSelenium을 사용하는 경우 다음을 사용할 수도 있습니다. selenium.refresh ();
Manpreet Singh

49
하지만 F5를 누르는 것과 정확히 동일하지는 않습니다. driver.navigate().refresh()요청 헤더에 "no-cache"라고되어 있으며 결과적으로 모든 콘텐츠를 무조건 다시로드합니다. F5 키를 누르면 "If-Modified-Since"요청이 발생할 수 있지만 "304 Not Modified"응답을받을 수 있습니다. 부하 테스트를한다면 그 차이를 염두에 두어야합니다.
Vsevolod Golovanov 2013

@Manpreet 솔루션에 감사드립니다. Upvote 할 가치가 있습니다.
RNS

77

파이썬에는이를 수행하는 방법이 있습니다 : driver.refresh(). Java에서는 동일하지 않을 수 있습니다.

또는 driver.get("http://foo.bar");새로 고침 방법이 잘 작동한다고 생각하지만 을 사용할 수 있습니다.


1
당신이 사용하는 경우 driver.get("http://foo.bar")로 힘을 잘 만 사용driver.get(driver.current_url)
매트 M.


23

Selenium Webdriver를 사용하여 웹 페이지를 새로 고치는 5 가지 방법

특별한 추가 코딩이 없습니다. 방금 기존 기능을 다른 방식으로 사용하여 작동했습니다. 여기 있습니다 :

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

18

셀레늄에서 응용 프로그램을 새로 고치는 다양한 접근 방식을 찾았습니다.

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

11

다음은 약간 다른 C # 버전입니다.

driver.Navigate().Refresh();

6

페이지 새로 고침 대체 (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 ()가 차단되지 않았기 때문에 실제로 해당 루프를 통과하는 데 몇 초가 걸립니다.


진정한 가치의 대답 ... 감사합니다.
Ogmios


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

이를 사용하면 브라우저의 주소 표시 줄을 클릭하고 Enter 키를 누르는 것처럼 현재 페이지가 새로 고쳐집니다.


getCurrentUrl () 또는 get (CurrentUrl)을 사용하면 페이지가 새로 고쳐 집니까? @RyanskyHeisenberg
user3520544

1
아니요, getCurrentUrl ()은 활성 URL을 추출하기위한 것입니다. driver.get (var_extractedURL)을 사용하여 다시 호출해야합니다. 기본적으로 활성 URL을 복사하고 동일한 브라우저의 탭을 사용하여 다시 열어 새로 고침을 시뮬레이션합니다. 이게 도움이 되길 바란다.
RyanskyHeisenberg

1

R 에서는 새로 고침 방법을 사용할 수 있지만 먼저 탐색 방법을 사용하여 URL로 이동합니다.

remDr$navigate("https://...")
remDr$refresh()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.