167

テスト中に 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();    

手動で更新されたページで要素を見つけるためのより良い解決策かもしれません

4

13 に答える 13

319

JavaまたはJavaScriptの場合:

driver.navigate().refresh();

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

于 2012-04-20T21:31:47.400 に答える
86

Python には、これを行うためのメソッドがあります: driver.refresh(). Java では同じではないかもしれません。

または、driver.get("http://foo.bar");更新方法がうまく機能するはずですが、可能です。

于 2012-04-20T13:44:44.527 に答える
29

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");
    
于 2016-12-02T18:49:20.570 に答える
21

セレンでアプリケーションを更新するためのさまざまなアプローチが見つかりました:-

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を参照してください。

于 2014-11-13T09:45:01.297 に答える
12

わずかに異なる C# バージョンを次に示します。

driver.Navigate().Refresh();
于 2015-07-08T14:30:06.297 に答える
5

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

いくつかのメモ:

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

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

于 2016-06-09T20:33:21.747 に答える
3

あなたも試すことができます

Driver.Instance.Navigate().Refresh();
于 2015-09-10T09:39:45.863 に答える
2

PHP の場合:

$driver->navigate()->refresh();
于 2016-06-15T16:07:09.263 に答える
2

ページ全体ではなく、ページ上の特定の iframe のみを更新したい場合もあります。

あなたは次のようにします:

public void refreshIFrameByJavaScriptExecutor(String iFrameId){
        String script= "document.getElementById('" + iFrameId+ "').src = " + "document.getElementById('" + iFrameId+ "').src";
       ((IJavaScriptExecutor)WebDriver).ExecuteScript(script);
}
于 2014-06-30T09:11:40.837 に答える
1

Java でセレンを使用して現在のページを更新する別の方法。

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

これを使用すると、ブラウザのアドレス バーをクリックして Enter キーを押すように、現在のページが更新されます。

于 2016-12-22T06:01:32.843 に答える