を使用してページを更新 Selenium ウェブドライバー

⚡ スマートサマリー

ページを更新すると Selenium WebDriver は現在の URL これにより、すべての要素がアサーションが実行される前にレンダリングされ、フレームワークは、同じリロードを異なる方法で実現する5つの異なるコマンドを提供します。

  • 🔘 デフォルトの選択肢: driver.navigate().refresh() は組み込みのリロード機能であり、引数を取らず、値を返しません。
  • ☑️ 再帰的なバリエーション: getCurrentUrl() を get() または navigate().to() に渡すと、同じアドレスが再読み込みされます。
  • キーボードルート: sendKeys は Keys.F5 または Unicode 値 \uE035 を受け入れますが、実際の要素を対象とする必要があります。
  • 🧪 スクリプトのルート: JavascriptWebDriverコマンドがブロックされている場合でも、location.reload()を実行するエグゼキュータは正常に動作します。
  • 🛠️ 再読み込み後: 以前に取得したすべての要素参照は無効になり、再度検索する必要があります。
  • 📊 最新のセットアップ: Selenium マネージャーはバージョン4.6で導入されたため、ドライバーパスを手動で設定する必要がなくなりました。

ページを更新するには Selenium WebDriverコマンド

Web ベース アプリケーションのテスト自動化中に、すべての Web 要素が完全に読み込まれるようにページを複数回更新する必要が生じます。最初のページ読み込みでは一部の Web 要素が読み込まれるかもしれませんが、すべての要素が表示されるには 2 回目のページ更新が必要になる場合があります。これは、以下の機能によって提供される refresh コマンドを使用して実行できます。 Selenium ウェブドライバー。

ページを更新する方法 Selenium

ブラウザの更新操作は、以下の方法で実行できます。 Selenium。この記事では、以下で説明する方法について詳しく説明します。

  1. driver.navigate().refresh() コマンド
  2. 取得メソッド
  3. キーの送信コマンド
  4. ナビゲートメソッド
  5. driver.navigate().to() コマンド

1) driver.navigate().refresh() コマンド

これは、ページ更新操作を実行するための組み込みメソッドです。 Selenium WebDriver。このコマンドは、テスト自動化においてページ更新操作を実行するために最も一般的に使用されるコマンドです。更新コマンドは、以下に示すように簡単に使用できます。

driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.navigate().refresh();

ナビゲーションは、前のページへの移動、次のページへの移動、ページの更新、ブラウザの閉じるなど、さまざまなブラウザ操作を実行するために使用されるインターフェースです。ナビゲーションインターフェースのメソッドは、コマンド driver.navigate() を使用してアクセスできます。ナビゲーションインターフェースの refresh メソッドは引数を取らず、値を返しません。

例:

テストシナリオ:

  1. Chromeブラウザでウェブページを開きます。 https://demo.guru99.com/selenium/guru99home/
  2. ページが正常に読み込まれたら、driver.navigate().refresh() メソッドを使用してウェブページを更新します。
  3. driver.close() メソッドを使用してブラウザを閉じます。

Code

package Guru99Demo;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class RefreshDemo {
public static void main(String args[]) throws InterruptedException
{
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.manage().window().maximize();
driver.navigate().refresh();
driver.close();
}
}

⚠️ バージョンノート: Selenium マネージャーには Selenium 4.6 そして、対応するブラウザドライバを自動的にダウンロードするため、現在のバージョンでは上記の System.setProperty 行は不要になりました。 new ChromeDriver() で十分です。元の行は、まだ正しいので保持されています。 Selenium 3. 例が書かれた際のスタイル設定。

Code 出力:

初回ページ読み込み時には、デモのホームページが以下のように表示されます。

Guru99 デモホームページは、更新コマンドが実行される前の初回読み込み時に表示されます。

ページを更新した後、ページ上の動画が変更されたことから、実際にページが再読み込みされたことが確認できます。

Guru99 デモホームページ、driver.navigate().refresh() 後に別のビデオを表示

ページを更新するその他の複数の方法

ページのリフレッシュだけが再読み込みの方法ではありません。以下の4つの方法はすべて同じ結果をもたらし、知っておく価値があります。なぜなら、ロックダウンされたアプリケーションや頑固なブラウザによっては、これらの方法のいずれかがブロックされることがあるからです。

2) 取得メソッド

getメソッドは、ページを再帰的に更新するために使用できます。そのためには、getメソッドに別のメソッドを引数として渡す必要があります。

例:

driver.get("https://www.guru99.com");
driver.get(driver.getCurrentUrl());

3) ナビゲーション方法

このメソッドは、上記で説明した再帰の概念と同じものを使用します。getCurrentUrl() メソッドは、driver.navigate().to() メソッドへの引数として渡されます。

例:

driver.get("https://www.guru99.com");
driver.navigate().to(driver.getCurrentUrl());

4) F5キーを使用したキー送信方法

これは、ページを更新するために 2 番目によく使用される方法です。 SeleniumsendKeys メソッドは、更新キー (F5) を引数として受け取ります。sendKeys はブラウザではなく Web 要素に対してのみ機能するため、まず Web ページ上の有効な Web 要素を特定してから sendKeys メソッドを使用する必要があります。これは以下のように実現できます。

例:

driver.get("https://www.guru99.com");
driver.findElement(By.id("username")).sendKeys(Keys.F5);

キーストロークはブラウザのクロームではなく要素に渡されるため、この経路は要素がフォーカスを保持しているかどうかに依存します。 ロケータ フォーカスを受け付けないフィールドに一致すると、キーが無視され、ページが再読み込みされません。

5) ASCIIを使用したキー送信方式 Code

この方法は上記と同じ概念を用いますが、F5キーを引数として渡す代わりに、更新キーのコードポイントを引数として渡します。これは以下のように実現できます。

driver.get("https://www.guru99.com");
driver.findElement(By.id("username")).sendKeys("\uE035");

値 \uE035 は、プロトコルが F5 にマッピングする WebDriver Unicode コードポイントです。したがって、このコードスニペットと前のコードスニペットは同等です。

ページを更新する方法 Javaスクリプトエグゼキュータ

すべてのブラウザはページスクリプトに再読み込み機能を提供し、 Selenium それを呼び出すことができます Javascriptエグゼキュータインターフェース。これは、WebDriverの更新コマンドがアプリケーションまたはブラウザ拡張機能によって傍受された場合の一般的なフォールバックです。

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("location.reload();");

覚えておくべき2つのバリエーションは以下のとおりです。

  1. location.reload() 通常のページ再読み込みを実行し、キャッシュからページを提供する場合があります。
  2. history.go(0) これは、一部の旧型ソフトウェアスイートで今でも使用されている、より古い同等のものです。

エグゼキュータ ルートはページ内で実行されるため、新しいドキュメントを単独で待機しません。driver.navigate().refresh() の後と同様に、明示的に待機処理を続けて実行してください。また、スクリプトによる再読み込みではブラウザ レベルのダイアログはクリアされないことに注意してください。テスト対象のアプリケーションがコンテンツを非同期で読み込む場合、次の点に注意してください。 AJAX呼び出しの処理 Selenium webdriver.

更新後に StaleElementReferenceException を回避する方法

ページを更新すると、現在のDOMが破棄され、新しいDOMが構築されます。更新前に取得されたすべてのWebElementは、もはや存在しないノードを指しているため、次にそのノードを呼び出すとStaleElementReferenceExceptionが発生します。これは、ページ更新後に発生する最も一般的なエラーです。

3つの習慣を身につけることで、これらの失敗のほとんどを解消できます。

  1. 後から見つける、決して前に見つけるな。 WebElementではなくByロケーターを保存し、リロードが完了したらfindElementを再度呼び出します。
  2. 実際の信号を待ちましょう。 リロード後にのみ存在する要素の表示状態を明示的に待機する方が、固定の待機時間よりもはるかに信頼性が高い。
  3. 更新してから、もう一度読んでください。 リロード前に取得したテキスト値や属性を、リロード後に実行されるアサーションに引き継いではいけません。

以下のパターンは、3つすべてに適用されます。

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
driver.navigate().refresh();
WebElement search = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("username")));
search.sendKeys("guru99");

WebDriverWait は Duration を受け取ります Selenium 4、これは、整数秒コンストラクタからの変更です。 Selenium 3. これらの障害に対するより広範な技術については、当社のガイドで説明しています。 例外処理 Selenium.

の比較 Selenium ページ更新方法

これら6つのコマンドはすべてページを再読み込みしますが、依存する要素や失敗した場合の対処方法が異なります。

方法 依存する リロード それが正しい選択である場合
ドライバー.navigate().refresh() 余分なものはありません ブラウザの再読み込みコマンド ほとんどの場合、デフォルト
driver.get(driver.getCurrentUrl()) 読みやすい電流 URL 新しいナビゲーション 履歴エントリも削除したい場合
driver.navigate().to(driver.getCurrentUrl()) 読みやすい電流 URL 新しいナビゲーション 上記と同様、ナビゲーションインターフェースを介して記述
sendKeys(Keys.F5) フォーカス可能な要素 キーストローク キーボードパスを意図的にテストする場合
sendKeys(“\uE035”) フォーカス可能な要素 キーストローク F5と同一で、コードポイントとして記述されています。
JavascriptExecutor location.reload() スクリプトが有効になっています ページスクリプト WebDriverコマンドがブロックされた場合

更新コマンドから始め、理解できる理由で失敗した場合にのみ別の行に進みます。同じ優先順位は、 ブラウザウィンドウを最大化またはサイズ変更する: ネイティブの WebDriver 呼び出しを優先し、スクリプトによる呼び出しはフォールバックとして扱います。

よくあるご質問

可能です。現在のページが POST によって生成された場合、ブラウザはデータの再送信を要求し、再読み込みはそのダイアログの背後で停止する可能性があります。 URL get() を使用すると、プロンプトを完全に回避できます。

バインディング名は異なりますが、コマンドは同じです: driver.refresh() PythonC# の driver.Navigate().Refresh() と driver.navigate().refresh() Java3つすべてが同一のWebDriver命令を発行します。

いいえ。ページをリロードしても、同じオリジンのCookie、セッションストレージ、ローカルストレージは保持されるため、ページをリフレッシュすることは状態をリセットする適切な方法ではありません。代わりに、Cookieを明示的に削除するか、新しいブラウザセッションを開始してください。

自己修復エンジンは、再読み込みされたDOMが一致しなくなった場合に、複数の属性からロケーターを再解決し、障害分析モデルは再読み込みタイミングの不安定性をクラスタリングすることで、チームが50個のテストではなく1つの待機処理を修正できるようにします。

はい、そして、1行の更新呼び出しは、常に正しく機能する提案です。提案がうまくいかないのは、その後に続く待機時間の部分です。そのため、生成されたタイムアウトを、アプリケーションの実際の読み込み状況と照らし合わせて確認してください。

専用のコマンドはありません。チームは、Actionsクラスを介してCtrlキーとF5キーを同時に送信するか、ブラウザの設定でキャッシュを無効にすることで、それに近い動作を実現しています。後者の方法の方がより確実です。

更新コマンドでは、常に最上位のドキュメントが再読み込みされてしまうため、この方法は使えません。フレームに切り替えてスクリプトで再読み込みするか、ソース属性をリセットしてから、デフォルトのコンテンツに戻してください。

固定の待機時間で推測しないでください。ページが再読み込みされた後にのみ真となる条件に対して、10秒から30秒の明示的な待機時間を設定し、ページが準備完了した瞬間にテストが再開されるようにしてください。