特定の条件を待つときにWebDriverによってWebページを更新する


154

テスト中にWebページを更新するよりエレガントな方法を探しています(私はSelenium2を使用しています)。私はF5キーを送信するだけですが、ドライバにWebページ全体を更新する方法があるかどうか疑問に思います。

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

多分手動で更新されたページ上の要素を見つけるためのいくつかのより良い解決策です

回答:


294

JavaまたはJavaScriptの場合:

driver.navigate().refresh();

これでページが更新されます。


うれしい!それはあなたを助けました。または、純粋にセレンRCまたはWebDriverBackedSeleniumを使用している場合は、次の方法も使用できます。selenium.refresh();
Manpreet Singh 2012

47
ただし、F5キーを押すのとまったく同じではありません。driver.navigate().refresh()リクエストヘッダーに「キャッシュなし」と表示され、その結果、すべてのコンテンツが無条件に再ロードされます。F5キーを押すと「If-Modified-Since」リクエストが発生する可能性がありますが、「304 Not Modified」レスポンスが返される可能性があります。負荷テストを行う場合は、その違いを覚えておく必要があります。
Vsevolod Golovanov 2013

@Manpreetソリューションをありがとう。賛成票を投じる価値があります。
RNS

75

Pythonには、これを行う方法がありますdriver.refresh()。Javaでは同じではない場合があります。

代わりに、できますがdriver.get("http://foo.bar");、refreshメソッドは問題なく機能するはずです。


1
あなたが使用している場合driver.get("http://foo.bar")にも威力をちょうど使用driver.get(driver.current_url)
マット・M.

54

Pythonで

組み込みメソッドを使用する

driver.refresh()

または、JavaScriptを実行する

driver.execute_script("location.reload()")

モーダルページを更新するにはどうすればよいですか?
hamed baziyad

21

Selenium Webdriverを使用してWebページを更新する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");
    

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 2018年

11

これは、わずかに異なるC#バージョンです。

driver.Navigate().Refresh();

5

ページ更新の代替(F5)

driver.navigate().refresh();

(または)

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

4

注意すべき重要な点の1つは、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();
}

いくつかのメモ:

  • ページを再読み込みしているため、特定の要素の存在を確認することはできません。要素は、再読み込みの開始前と終了後に存在するためです。したがって、場合によってはtrueになることもありますが、ページはまだロードを開始していません。
  • ページが再読み込みされるときに、WebElement.isDisplayed()をチェックすると、StaleElementReferenceExceptionがスローされます。残りはすべての拠点をカバーすることです
  • getName():ページの名前を取得する内部メソッド
  • getMaximumLoadTime():ページのロードを許可する時間を秒単位で返す内部メソッド
  • verify():内部メソッドは、ページが実際にロードされていることを確認します

この場合も、ほとんどの場合、do / whileループは1回実行されます。navigate()。refresh()を超えるコードは、ブラウザーが実際にページを完全に再ロードするまで実行されないためですが、ブラウザがロードを完了するまで、navigate()。refresh()がブロックしなかったため、実際にはそのループを通過するのに数秒かかります。


真の価値のある答え...ありがとう。
Ogmios 2018年


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キーを押すような現在のページが更新されます。


1

Rあなたはリフレッシュ方法を使用することができますが、私たちがナビゲート方法を使用してURLに移動して起動します:

remDr$navigate("https://...")
remDr$refresh()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.