web-dev-qa-db-ja.com

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

テスト中にWebページを更新するためのもっとエレガントな方法を探しています(私はSelenium 2を使用しています)。 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();    

手動で更新されたページ上の要素を見つけるためのおそらくよりよい解決策

133
pbaranski

JavaまたはJavaScriptの場合:

driver.navigate().refresh();

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

262
Manpreet Singh

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

あるいは、driver.get("http://foo.bar");を使用することもできますが、refreshメソッドは問題なく機能するはずです。

57
Isaac

Pythonで

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

driver.refresh()

または、JavaScriptを実行する

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

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

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

15
AugustRush

これはちょっと違うC#バージョンです:

driver.Navigate().Refresh();
9
dmeehan

ページ更新(F5)の代わりに使用

driver.navigate().refresh();

(または)

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

注意すべき重要なことの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回実行されます。これは、browse()。refresh()を超えるコードが、ブラウザが実際にページを完全に再ロードするまで実行されないためです。 navigate()。refresh()はブラウザのロードが完了するまでブロックされないため、実際にはこのループを通過するのに数秒かかります。

3
mac

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

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

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

あなたは以下の通りです:

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

PHPの場合:

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

JavaのSeleniumを使って現在のページを更新するもう一つの方法

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

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

0