JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

SeleniumでJavaScriptを含む複雑なページの読み込み完了を待つ方法

Seleniumでは、JavaScriptを多用した複雑なページでも、読み込みが完了するまで適切に待機することができます。ページの読み込み状態を確認するには、JavaScriptのdocument.readyStateメソッドを実行し、戻り値がcompleteになるまで待つのが一般的な手法です。

基本構文

JavascriptExecutorを使って、現在のページの準備状態(readyState)を取得します。

JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("return document.readyState").toString().equals("complete");

明示的な待機(Explicit Wait)との組み合わせ

ページ全体の読み込み確認に加えて、特定の要素が操作可能な状態になっているかを検証するには、同期処理における明示的な待機(explicit wait)の概念を活用します。ExpectedConditionsのpresenceOfElementLocatedを使うことで、対象要素がDOM上に存在するまで待機できます。

以下のコード例では、検証処理全体をtry-catchブロック内に実装し、要素が見つからない場合にも例外を安全に処理できるようにしています。

コード例

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.JavascriptExecutor;
public class PageLoadWt{
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver",
        "C:\\Users\\ghs6kor\\Desktop\\Java\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.tutorialspoint.com/index.htm");
        // Javascript Executorでページのready stateを確認
        JavascriptExecutor j = (JavascriptExecutor)driver;
        if (j.executeScript
        ("return document.readyState").toString().equals("complete")){
            System.out.println("Page loaded properly.");
        }
        // expected condition: presenceOfElementLocated
        WebDriverWait wt = new WebDriverWait(driver,3);
        try {
            wt.until(ExpectedConditions
            .presenceOfElementLocated
            (By.id("gsc−i−id1")));
            // 要素を特定してテキストを入力
            driver.findElement
            (By.id("gsc−i−id1")).sendKeys("Selenium");
        }
        catch(Exception e) {
            System.out.println("Element not located");
        }
        driver.quit();
    }
}

コードのポイント

  • JavascriptExecutor:executeScriptメソッドでdocument.readyStateを実行し、値が「complete」であればコンソールに「Page loaded properly.」と出力します。
  • WebDriverWait:最大3秒間の待機時間を設定し、指定した条件が満たされるまでポーリングを行います。
  • presenceOfElementLocated:id属性が「gsc-i-id1」の要素がDOM上に存在するかどうかを確認します。
  • try-catchブロック:タイムアウトなどで要素が見つからなかった場合に備え、例外をキャッチして「Element not located」と出力することで、テストが異常終了しないようにしています。
  • driver.quit():処理完了後、ブラウザセッションを確実に終了させます。

実行結果

このコードを実行すると、ページが正常に読み込まれた場合はコンソールに「Page loaded properly.」と表示され、続いて対象要素へのテキスト入力が実行されます。要素が見つからなかった場合には「Element not located」が出力されます。


  1. Selenium WebDriverとJavaで特定のDIV要素をスクロールする方法

    Selenium WebDriverを使用すれば、ページ内の特定のDIV要素までスクロールすることが可能です。ただし、Selenium自体にはスクロール操作を直接実行する機能が備わっていないため、JavaScript Executorの力を借りる必要があります。手順としては、まずXPathやCSSセレクターなどのロケーターを使って、スクロール先となる対象のDIV要素を特定します。続いて、JavaScript Executorを利用してJavaScriptのコマンドを実行します。SeleniumでJavaScriptを実行する際にはexecuteScriptメソッドを使用し、JavaScript

  2. 【Python】Selenium WebDriverでページの読み込み完了まで待機する方法

    Selenium WebDriverを使えば、ページが完全に読み込まれるまで待機することができます。Seleniumには「同期(synchronization)」という概念があり、これには暗黙的待機(implicit wait)と明示的待機(explicit wait)の2種類があります。ページの読み込み完了を待つ場合には、明示的待機の仕組みを利用するのが適切です。明示的待機(explicit wait)とは明示的待機は、特定の要素に対して設定された期待条件(expected condition)が満たされるまで待つ仕組みです。ページの読み込み完了を判定したい場合は、対象となる要素に対して p