1. 序章

この短いチュートリアルでは、JavaScriptを使用して SeleniumWebDriverをクリックして要素化する方法の簡単な例を見ていきます。

デモでは、JUnitとSeleniumを使用してhttps://baeldung.com を開き、「Selenium」の記事を検索します。

2. 依存関係

まず、selenium-javajunitの依存関係をpom.xmlのプロジェクトに追加します。

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.141.59</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <scope>test</scope>
</dependency>

3. 構成

次に、WebDriverを構成する必要があります。 この例では、最新バージョンをダウンロードした後、Chromeの実装を使用します。

@Before
public void setUp() {
    System.setProperty("webdriver.chrome.driver", new File("src/main/resources/chromedriver.mac").getAbsolutePath());
    driver = new ChromeDriver();
}

@Before のアノテーションが付けられたメソッドを使用して、各テストの前に初期設定を行います。 内部では、 chromedriverの場所を定義するwebdriver.chrome.driverプロパティを設定しています。 その後、WebDriverオブジェクトをインスタンス化します。

テストが終了したら、ブラウザウィンドウを閉じる必要があります。 これを行うには、 driver.close()ステートメントを@Afterで注釈が付けられたメソッドに配置します。 これにより、テストが失敗した場合でも確実に実行されます。

@After
public void cleanUp() {
    driver.close();
}

4. ブラウザを開く

これで、最初のステップであるテストケースを作成できます。Webサイトを開きます。

@Test
public void whenSearchForSeleniumArticles_thenReturnNotEmptyResults() {
    driver.get("https://baeldung.com");
    String title = driver.getTitle();
    assertEquals("Baeldung | Java, Spring and Web Development tutorials", title);
}

ここでは、 driver.get()メソッドを使用してWebページをロードします。 次に、タイトルを確認して、正しい場所にいることを確認します。

5. JavaScriptを使用して要素をクリックする

Seleniumには、特定の要素でクリックイベントを呼び出す便利なWebElement#clickメソッドが付属しています。 ただし、クリック操作ができない場合があります。

1つの例は、無効になっている要素をクリックする場合です。 その場合、 WebElement#clickIllegalStateExceptionをスローします。 代わりに、SeleniumのJavaScriptサポートを使用できます。

これを行うために最初に必要なのは、JavascriptExecutorです。 ChromeDriver 実装を使用しているため、必要なものに簡単にキャストできます。

JavascriptExecutor executor = (JavascriptExecutor) driver;

JavascriptExecutor を取得したら、そのexecuteScriptメソッドを使用できます。 引数は、スクリプト自体とスクリプトパラメータの配列です。 この例では、最初の引数でclickメソッドを呼び出します。

executor.executeScript("arguments[0].click();", element);

それでは、clickElementと呼ぶ単一のメソッドにまとめましょう。

private void clickElement(WebElement element) {
    JavascriptExecutor executor = (JavascriptExecutor) driver;
    executor.executeScript("arguments[0].click();", element);
}

そして最後に、これをテストに追加できます。

@Test
public void whenSearchForSeleniumArticles_thenReturnNotEmptyResults() {
    // ... load https://baeldung.com
    WebElement searchButton = driver.findElement(By.className("nav--menu_item_anchor"));
    clickElement(searchButton);

    WebElement searchInput = driver.findElement(By.id("search"));
    searchInput.sendKeys("Selenium");

    WebElement seeSearchResultsButton = driver.findElement(By.cssSelector(".btn-search"));
    clickElement(seeSearchResultsButton);
}

6. クリックできない要素

JavaScriptを使用して要素をクリックするときに発生する最も一般的な問題の1つは、要素がクリック可能になる前にクリックスクリプトを実行することです。 この状況では、クリックアクションは発生しませんが、コードは実行を継続します。

この問題を解決するには、クリックが可能になるまで実行を保留する必要があります。 WebDriverWait#until を使用して、ボタンがレンダリングされるまで待つことができます。

まず、 W ebDriverWaitオブジェクトには2つのパラメーターが必要です。 ドライバーとタイムアウト:

WebDriverWait wait = new WebDriverWait(driver, 5000);

次に、 until を呼び出し、予想されるelementToBeClickable条件を指定します。

wait.until(ExpectedConditions.elementToBeClickable(By.className("nav--menu_item_anchor")));

そして、それが正常に戻ったら、次に進むことができることがわかります。

WebElement searchButton = driver.findElement(By.className("nav--menu_item_anchor"));
clickElement(searchButton);

より利用可能な条件メソッドについては、公式ドキュメントを参照してください。

7. 結論

このチュートリアルでは、JavaScriptを使用してSeleniumの要素をクリックする方法を学習しました。 いつものように、記事のソースはGitHubから入手できます。