Selenium開発　個人的メモ

Seleniumの開発、ソースコードについての個人的メモです。

## :motorcycle: 実行環境

mavenプロジェクトとして構成し、Seleniumの実行はmvn testコマンドを実行する。


## :motorcycle: ファイル・ソース構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/2d94fec8-66e8-46a5-8a34-0630330fc984.png)


## :motorcycle: ソース内容

上記の構成で、それぞれのソースは以下とする。
　①CommonUtil.java
　②Login1Test.java
　③Login2Test.java
　④Login3Test.java
　⑤Login4Test.java
　⑥pom.xml

```ruby:①CommonUtil.java
import org.openqa.selenium.*;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

public class CommonUtil {

    public void takeScreenshot(WebDriver driver, String fileName) {

        // スクリーンショット保存ディレクトリを作成
        File screenshotDirectory = new File("screenshots");
        if (!screenshotDirectory.exists()) {
            screenshotDirectory.mkdirs();
        }

        // 現在のウィンドウサイズを保存しておく
        Dimension originalSize = driver.manage().window().getSize();

        // JavascriptExecutor を使ってページの高さと幅を取得
        JavascriptExecutor js = (JavascriptExecutor) driver;
        long height = (Long) js.executeScript("return document.body.scrollHeight"); // ページの高さを取得
        long width = (Long) js.executeScript("return document.body.scrollWidth"); // ページの幅を取得

        // ページ全体に合わせてウィンドウサイズを変更
        driver.manage().window().setSize(new Dimension((int) width, (int) height));

        // スクリーンショットを取得
        File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

        // スクリーンショットの保存先ファイルを作成
        File destinationFile = new File(screenshotDirectory, fileName);

        try {
            // スクリーンショットを指定のパスにコピー
            Files.copy(screenshot.toPath(), destinationFile.toPath());
        } catch (IOException e) {
            // エラーの詳細をログに記録
            System.err.println("Error while saving screenshot: " + e.getMessage());
            e.printStackTrace();
        }

        // 元のウィンドウサイズに戻す
        driver.manage().window().setSize(originalSize); // 元のサイズに戻す
    }
}

```

```ruby:②Login1Test.java
import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
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;

import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class Login1Test {
    CommonUtil commonUtil = new CommonUtil();
    WebDriver driver;

    @BeforeAll
    static void setupClass() {
        //System.setProperty("webdriver.chrome.driver", "./exe/chromedriver.exe");
        //WebDriverManager.chromedriver().setup();
        ChromeDriver.builder();
    }

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

    @Test
    void loginSuccess() {

        // トップページへアクセスする。
        driver.get("http://localhost:8080/atrs");

        // スクリーンショットを撮る
        commonUtil.takeScreenshot(driver, "Login1Test_ATRSPage.png");

        // login というIDの要素を取得(ログインボタン)
        WebElement loginButton = driver.findElement(By.id("login"));

        // ログインボタンが存在するか確認（アサーション）
        assertNotNull(loginButton, "Login button should be found.");

        // ログインボタンがクリック可能か確認
        assertTrue(loginButton.isDisplayed(), "Login button should be displayed.");
        assertTrue(loginButton.isEnabled(), "Login button should be enabled.");

        // 画面右上のログインボタンを押下する。
        loginButton.click();

        // 「会員番号」と「パスワード」の入力画面が表示されること。
        // スクリーンショットを撮る
        commonUtil.takeScreenshot(driver, "Login1Test_MemberNumberAndPassword.png");

        // lomembershipNumber というIDの要素を取得(会員番号)
        WebElement membershipNumber = driver.findElement(By.id("membershipNumber"));
        // 会員番号が存在するか確認
        assertNotNull(membershipNumber, "Membership Number should be found.");
        // 会員番号が空白であるか確認
        assertTrue(membershipNumber.getText().isEmpty(), "Membership Number should be empty.");

        // password というIDの要素を取得(パスワード)
        WebElement password = driver.findElement(By.id("password"));
        // パスワードが存在するか確認
        assertNotNull(password, "Password should be found.");
        // パスワードが空白であるか確認
        assertTrue(password.getText().isEmpty(), "Password should be empty.");

        // 会員番号に"0000000001"をセット
        membershipNumber.sendKeys("0000000001");
        // パスワードに"aaaaa11111"をセット
        password.sendKeys("aaaaa11111");
        // ログインボタンをクリック
        driver.findElement(By.id("login-btn")).click();

        // トップ画面が表示されること。
        // スクリーンショットを撮る
        commonUtil.takeScreenshot(driver, "Login1Test_TopPage.png");

        // 画面右上に「ようこそ 電電 花子 さま」と記載されたプルダウンが表示される。
        // name というIDの要素を取得(プルダウン)
        WebElement name = driver.findElement(By.id("name"));
        // プルダウンが存在するか確認
        assertNotNull(name, "Hello Welcome pull-down should be found.");
        // プルダウンが空白でないことを確認
        System.out.println(name.getText());
        assertFalse(name.getText().isEmpty(), "Hello Welcome pull-down should not be empty.");

        // プルダウンに文字列"ようこそ"が含まれること
        assertTrue(name.getText().contains("ようこそ"), "ようこそ should be contained.");
        // プルダウンに文字列"電電 花子"が含まれること
        assertTrue(name.getText().contains("電電 花子"), "電電 花子 should be contained.");
        // プルダウンに文字列"さま"が含まれること
        assertTrue(name.getText().contains("さま"), "さま should be contained.");

    }

    @AfterEach
    void tearDown() {
        // テスト終了後にブラウザを閉じる
        if (driver != null) {
            driver.quit();
        }
    }
}

```

```ruby:③Login2Test.java
import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
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;

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

public class Login2Test {
    CommonUtil commonUtil = new CommonUtil();
    WebDriver driver;

    @BeforeAll
    static void setupClass() {
        //System.setProperty("webdriver.chrome.driver", "./exe/chromedriver.exe");
        //WebDriverManager.chromedriver().setup();
        ChromeDriver.builder();
    }

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

    @Test
    void loginErrorForInvalidValue() {

        // トップページへアクセスする。
        driver.get("http://localhost:8080/atrs");

        // スクリーンショットを撮る
        commonUtil.takeScreenshot(driver, "Login2Test_ATRSPage.png");

        // login というIDの要素を取得(ログインボタン)
        WebElement loginButton = driver.findElement(By.id("login"));

        // 画面右上のログインボタンを押下する。
        loginButton.click();

        // 「会員番号」と「パスワード」の入力画面が表示されること。
        // スクリーンショットを撮る
        commonUtil.takeScreenshot(driver, "Login2Test_MemberNumberAndPassword.png");

        // lomembershipNumber というIDの要素を取得(会員番号)
        WebElement membershipNumber = driver.findElement(By.id("membershipNumber"));
        // password というIDの要素を取得(パスワード)
        WebElement password = driver.findElement(By.id("password"));

        // 会員番号に"0000000001"をセット
        membershipNumber.sendKeys("0000000001");
        // パスワードに"bbbbb11111"をセット
        password.sendKeys("bbbbb11111");
        // ログインボタンをクリック
        driver.findElement(By.id("login-btn")).click();

        // エラーメッセージが表示されること。
        // スクリーンショットを撮る
        commonUtil.takeScreenshot(driver, "Login2Test_LoginError.png");

        // "alert-danger"クラスの要素を取得する
        WebElement alertDangerClass = driver.findElement(By.className("alert-danger"));

        // alertDangerClass に"Bad credentials"が含まれること
        assertTrue(alertDangerClass.getText().contains("Bad credentials"), "'Bad credentials' should be contained.");

    }

    @AfterEach
    void tearDown() {
        // テスト終了後にブラウザを閉じる
        if (driver != null) {
            driver.quit();
        }
    }

}

```

```ruby:④Login3Test.java
import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
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;

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

public class Login3Test {
    CommonUtil commonUtil = new CommonUtil();
    WebDriver driver;

    @BeforeAll
    static void setupClass() {
        //System.setProperty("webdriver.chrome.driver", "./exe/chromedriver.exe");
        //WebDriverManager.chromedriver().setup();
        ChromeDriver.builder();
    }

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

    @Test
    void loginErrorForEmptyValue() {

        // トップページへアクセスする。
        driver.get("http://localhost:8080/atrs");

        // スクリーンショットを撮る
        commonUtil.takeScreenshot(driver, "Login3Test_ATRSPage.png");

        // login というIDの要素を取得(ログインボタン)
        WebElement loginButton = driver.findElement(By.id("login"));

        // 画面右上のログインボタンを押下する。
        loginButton.click();

        // 「会員番号」と「パスワード」の入力画面が表示されること。
        // スクリーンショットを撮る
        commonUtil.takeScreenshot(driver, "Login3Test_MemberNumberAndPassword.png");

        // lomembershipNumber というIDの要素を取得(会員番号)
        WebElement membershipNumber = driver.findElement(By.id("membershipNumber"));
        // password というIDの要素を取得(パスワード)
        WebElement password = driver.findElement(By.id("password"));

        // 会員番号を空にセット
        membershipNumber.sendKeys("");
        // パスワードを空にセット
        password.sendKeys("");
        // ログインボタンをクリック
        driver.findElement(By.id("login-btn")).click();

        // エラーメッセージが表示されること。
        // スクリーンショットを撮る
        commonUtil.takeScreenshot(driver, "Login3Test_LoginError.png");

        // "parsley-required"クラスの要素を取得する
        WebElement parsleyRequiredClass = driver.findElement(By.className("parsley-required"));

        // parsleyRequiredClass に"入力必須項目です"が含まれること
        assertTrue(parsleyRequiredClass.getText().contains("入力必須項目です"), "'入力必須項目です' should be contained.");

    }

    @AfterEach
    void tearDown() {
        // テスト終了後にブラウザを閉じる
        if (driver != null) {
            driver.quit();
        }
    }
}

```ruby:⑤Login4Test.java
import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Login4Test {
    CommonUtil commonUtil = new CommonUtil();
    WebDriver driver;

    @BeforeAll
    static void setupClass() {
        //System.setProperty("webdriver.chrome.driver", "./exe/chromedriver.exe");
        //WebDriverManager.chromedriver().setup();
        ChromeDriver.builder();
    }

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

    @Test
    void loginExit() {

        // トップページへアクセスする。
        driver.get("http://localhost:8080/atrs");

        // スクリーンショットを撮る
        commonUtil.takeScreenshot(driver, "Login4Test_ATRSPage.png");

        // ウィンドウを閉じる
        driver.quit();

    }
}

```

```ruby:⑥pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Login2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>23</maven.compiler.source>
        <maven.compiler.target>23</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.27.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.7.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.36</version>
        </dependency>

    </dependencies>

</project>
```

## :motorcycle: 実行方法

pom.xmlの存在するディレクトリでmvn testを事項するか、IDEからpom.xmlを実行する。

以上