Seleniumコードの構成と実行

IDEとテストランナーライブラリによるSelenium実行のスケーリング

1回限りのスクリプトを少数実行するだけではない場合は、コードを整理して作業できるようにする必要があります。このページでは、Seleniumコードを使用して実際に生産的なことを行う方法についてのアイデアを提供します。

一般的な用途

ほとんどの人は、Selenium を使用してウェブアプリケーションの自動テストを実行しますが、Selenium はブラウザ自動化のあらゆるユースケースをサポートしています。

反復作業

ウェブサイトにログインして何かをダウンロードしたり、フォームを送信する必要があるかもしれません。Selenium スクリプトを作成して、プリセットされた時間にサービスで実行できます。

ウェブスクレイピング

API がないサイトからデータを収集しようとしていますか?Selenium を使用するとこれが可能になりますが、一部のウェブサイトでは許可されておらず、Selenium をブロックすることさえあるため、ウェブサイトの利用規約を必ずよく理解してください。

テスト

テストのために Selenium を実行するには、Selenium によって実行されたアクションに対するアサーションを行う必要があります。したがって、優れたアサーションライブラリが必要です。テストの構造を提供する追加機能には、テストランナーの使用が必要です。

IDE

Selenium コードをどのように使用する場合でも、優れた統合開発環境がなければ、コードの作成や実行は非常に非効率になります。一般的なオプションをいくつかご紹介します...

テストランナー

Selenium をテストに使用していなくても、高度なユースケースがある場合は、テストランナーを使用してコードをより適切に整理することを検討する価値があるかもしれません。before/after フックを使用したり、グループまたは並行して実行したりできると非常に便利です。

選択

利用可能なテストランナーは多数あります。

このドキュメントのすべてのコード例は、テストランナーを使用し、すべてのコードが正しく更新されていることを保証するためにすべてのリリースで実行される、当社のサンプルディレクトリにあります(または移動中です)。以下は、リンク付きのテストランナーのリストです。最初の項目は、このリポジトリで使用されているものであり、このページのすべての例で使用されるものです。

  • JUnit - JavaベースのSeleniumテスト用の広く使用されているテストフレームワーク。
  • TestNG - 並列テスト実行やパラメータ化されたテストなどの追加機能を提供します。
  • pytest - そのシンプルさと強力なプラグインのおかげで、多くの人に好まれる選択肢です。
  • unittest - Python の標準ライブラリテストフレームワーク。
  • NUnit - .NET 用の一般的なユニットテストフレームワーク。
  • MS Test - Microsoft 独自のユニットテストフレームワーク。
  • RSpec - Ruby で Selenium テストを実行するために最も広く使用されているテストライブラリ。
  • Minitest - Ruby 標準ライブラリに付属する軽量テストフレームワーク。
  • Jest - 主に React のテストフレームワークとして知られていますが、Selenium テストにも使用できます。
  • Mocha - Selenium テストを実行するための最も一般的な JS ライブラリ。

インストール

これは、Selenium ライブラリのインストールで必要とされたものと非常によく似ています。このコードは、当社のドキュメント例プロジェクトで使用されているものの例のみを示しています。

Maven

Gradle

プロジェクトで使用するには、requirements.txt ファイルに追加してください

プロジェクトの csproj ファイルで、依存関係を ItemGroupPackageReference として指定します

プロジェクトの Gemfile に追加

プロジェクトの package.json で、dependencies に要件を追加します

アサート

		String title = driver.getTitle();
		assertEquals("Web form", title);
    title = driver.title
    assert title == "Web form"
            var title = driver.Title;
            Assert.AreEqual("Web form", title);
    title = @driver.title
    expect(title).to eq('Web form')
    let title = await driver.getTitle();
    assert.equal("Web form", title);

セットアップとティアダウン

セットアップ

	@BeforeEach
	public void setup() {
		driver = new ChromeDriver();
	}

ティアダウン

	@AfterEach
	public void teardown() {
		driver.quit();
	}

セットアップ

def setup():
    driver = webdriver.Chrome()
    driver.get("https://selenium.dokyumento.jp/selenium/web/web-form.html")
    return driver

ティアダウン

def teardown(driver):
    driver.quit()

セットアップ

  before do
    @driver = Selenium::WebDriver.for :chrome
  end

ティアダウン

  config.after { @driver&.quit }
### セットアップ
  before(async function () {
    driver = await new Builder().forBrowser('chrome').build();
  });
### ティアダウン
  after(async () => await driver.quit());

実行

Maven

mvn clean test

Gradle

gradle clean test
pytest path/to/test_script.py

Mocha

mocha runningTests.spec.js

npx

npx mocha runningTests.spec.js

最初のスクリプトでは、Selenium スクリプトの各コンポーネントを確認しました。テストランナーを使用したコードの例を次に示します

package dev.selenium.getting_started;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.time.Duration;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class UsingSeleniumTest {

	WebDriver driver;

	@BeforeEach
	public void setup() {
		driver = new ChromeDriver();
	}

	@Test
	public void eightComponents() {

		driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500));
		driver.get("https://selenium.dokyumento.jp/selenium/web/web-form.html");

		String title = driver.getTitle();
		assertEquals("Web form", title);

		WebElement textBox = driver.findElement(By.name("my-text"));
		WebElement submitButton = driver.findElement(By.cssSelector("button"));

		textBox.sendKeys("Selenium");
		submitButton.click();

		WebElement message = driver.findElement(By.id("message"));
		String value = message.getText();
		assertEquals("Received!", value);

	}

	@AfterEach
	public void teardown() {
		driver.quit();
	}

}
from selenium import webdriver
from selenium.webdriver.common.by import By


def test_eight_components():
    driver = setup()

    title = driver.title
    assert title == "Web form"

    driver.implicitly_wait(0.5)

    text_box = driver.find_element(by=By.NAME, value="my-text")
    submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button")

    text_box.send_keys("Selenium")
    submit_button.click()

    message = driver.find_element(by=By.ID, value="message")
    value = message.text
    assert value == "Received!"

    teardown(driver)

def setup():
    driver = webdriver.Chrome()
    driver.get("https://selenium.dokyumento.jp/selenium/web/web-form.html")
    return driver

def teardown(driver):
    driver.quit()
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace SeleniumDocs.GettingStarted
{
    [TestClass]
    public class UsingSeleniumTest
    {

        [TestMethod]
        public void EightComponents()
        {
            IWebDriver driver = new ChromeDriver();

            driver.Navigate().GoToUrl("https://selenium.dokyumento.jp/selenium/web/web-form.html");

            var title = driver.Title;
            Assert.AreEqual("Web form", title);

            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(500);

            var textBox = driver.FindElement(By.Name("my-text"));
            var submitButton = driver.FindElement(By.TagName("button"));
            
            textBox.SendKeys("Selenium");
            submitButton.Click();
            
            var message = driver.FindElement(By.Id("message"));
            var value = message.Text;
            Assert.AreEqual("Received!", value);
            
            driver.Quit();
        }
    }
}
# frozen_string_literal: true
require 'spec_helper'
require 'selenium-webdriver'


RSpec.describe 'Using Selenium' do
  before do
    @driver = Selenium::WebDriver.for :chrome
  end

  it 'uses eight components' do
    @driver.get('https://selenium.dokyumento.jp/selenium/web/web-form.html')

    title = @driver.title
    expect(title).to eq('Web form')

    @driver.manage.timeouts.implicit_wait = 500

    text_box = @driver.find_element(name: 'my-text')
    submit_button = @driver.find_element(tag_name: 'button')

    text_box.send_keys('Selenium')
    submit_button.click

    message = @driver.find_element(id: 'message')
    value = message.text
    expect(value).to eq('Received!')
  end
end
const {By, Builder} = require('selenium-webdriver');
const assert = require("assert");

describe('First script', function () {
  let driver;

  before(async function () {
    driver = await new Builder().forBrowser('chrome').build();
  });

  it('First Selenium script with mocha', async function () {
    await driver.get('https://selenium.dokyumento.jp/selenium/web/web-form.html');

    let title = await driver.getTitle();
    assert.equal("Web form", title);

    await driver.manage().setTimeouts({implicit: 500});

    let textBox = await driver.findElement(By.name('my-text'));
    let submitButton = await driver.findElement(By.css('button'));

    await textBox.sendKeys('Selenium');
    await submitButton.click();

    let message = await driver.findElement(By.id('message'));
    let value = await message.getText();
    assert.equal("Received!", value);
  });

  after(async () => await driver.quit());
});

次のステップ

学んだことを活かして、Selenium コードを構築してください!

必要な機能がさらに見つかったら、残りのWebDriver ドキュメントをお読みください。

最終更新日 2024年9月2日: removed hanging badge code (#1912) (d501255fa65)