[JAVA] Selenide Know-how

Überblick

Selenid ist ein Junit-basierter Test Diejenigen, die den Browser bedienen und prüfen können, ob der erwartete Bildschirmübergang und die Daten angezeigt werden

Grundeinstellung

Umgebung Sprache: JDK 1.8

Beschreibung von Maven

Die folgende Beschreibung wurde zu pom.xml hinzugefügt

    <dependencies>
 <! - Ausgelassen->
        <dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>selenide</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

4.9: Neueste Version von Selenide vom 12.03.2008

Für Spring Boot

Wenn Sie SpringBoot installiert haben, ist die Version der Bibliothek (Selenium), auf die Selenide verweist, alt. Die folgenden Einstellungen sind zusätzlich erforderlich, um Selenid zu betreiben.

Zusätzliche Einstellungen
    <dependencies>
 <! - Ausgelassen->
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-api</artifactId>
          <version>3.8.1</version>
      </dependency>
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-chrome-driver</artifactId>
          <version>3.8.1</version>
      </dependency>
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-firefox-driver</artifactId>
          <version>3.8.1</version>
      </dependency>
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-remote-driver</artifactId>
          <version>3.8.1</version>
      </dependency>

      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-support</artifactId>
          <version>3.8.1</version>
      </dependency>
    </dependencies>

Angenommen, es funktioniert mit FireFox und Chrome, funktioniert es nur mit den oben genannten Einstellungen Wenn Sie andere Fehler wie "NoClassDefFound" oder "NoSuchMethod" erhalten Überprüfen Sie Selenium-API-Abhängigkeiten und vergleichen Sie sie mit der lokal aktivierten Version.

Vorbereitung des Fahrers

Chrome-Treiber vorbereiten

Wenn der zu startende Browser nicht FireFox ist, ist eine Treiberdatei (eine Ausführungsdatei, die den in Selenide beschriebenen Inhalt empfängt und den Browser bedient / Informationen abruft) erforderlich. Rufen Sie die für Ihre Umgebung geeignete Datei von Download Site ab und platzieren Sie sie an einem von Junit angegebenen Ort.

Solitary 1 Ich habe den Artikel gelesen, dass es nach Selenid 4.8 nicht mehr notwendig ist, aber als ich es ausgeführt habe, ist der Download nicht erfolgt Ich habe den Fahrer vorbereitet.
Solitary 2 Wenn Sie den Treiber lokal bereitstellen, müssen Sie überprüfen, ob Sie über Ausführungsberechtigungen für die Zieldatei verfügen. Wenn nicht, müssen Sie die Ausführungsberechtigung separat festlegen. Seien Sie vorsichtig, wenn Sie in einer anderen Umgebung als Windows wie Docker implementieren

Vom Treiberstart bis zur Beendigung

Grundeinstellungen des Treibers

Führen Sie die folgenden Schritte aus, um den Treiber einzustellen Stellen Sie die Methode @ @ Before ein

Für Chrome

    @Before
    public void before() {
        Configuration.browser = WebDriverRunner.CHROME;
 //Chromeドライバのパスを設定(ここでは設定ファイルから取得)
        System.setProperty("webdriver.chrome.driver", getClass().getResource(properties.getChromeDriver()).getPath());

        ChromeOptions chromeOptions = new ChromeOptions();
 //HeadLessモード指定
        if (properties.isHeadless()) {
            chromeOptions.addArguments("--headless");
        }
        Map<String, Object> chromePrefs = new HashMap<>();
 //PopUp表示を抑制
        chromePrefs.put("profile.default_content_settings.popups", 0);
 //ダウンロードフォルダ指定(テストメソッドごとに格納パスを切り替える等任意で設定)
        chromePrefs.put("download.default_directory", "/User/Temp/result/DownloadFile");
 //ダウンロード先指定ダイアログ表示抑制
        chromePrefs.put("download.prompt_for_download", false);
        chromeOptions.setExperimentalOption("prefs", chromePrefs);
        driver = new ChromeDriver(chromeOptions);

 //WebDriverRunnerにDriverを指定
        WebDriverRunner.setWebDriver(driver);
        
        Configuration.fastSetValue = true;
 //スクリーンショットの設定ディレクトリ設定
        Configuration.reportsFolder = "/User/Temp/result/ScreenShot"; 
    }  

Jede Spezifikation wird unten beschrieben.

Headless-Modus-Spezifikation

Wenn Sie Folgendes angeben, können Sie Chrome im Headless-Modus starten und mit einem Browser überprüfen. Mit dieser Spezifikation kann die automatische Überprüfung auch in einer Umgebung ohne Benutzeroberfläche durchgeführt werden.

            chromeOptions.addArguments("--headless");

Angeben des Dateidownloadpfads

Die folgenden zwei Zeilen geben das Verzeichnis beim Herunterladen der Datei an Unterdrückt die Anzeige des Dialogfelds beim Herunterladen.

 //ダウンロードフォルダ指定(テストメソッドごとに格納パスを切り替える等任意で設定)
        chromePrefs.put("download.default_directory", "/User/Temp/result/DownloadFile");
 //ダウンロード先指定ダイアログ表示抑制
        chromePrefs.put("download.prompt_for_download", false);

Dies wird im folgenden Teil des Chrome-Einstellungsbildschirms angezeigt Chrome設定.JPG

Screenshot Ziel speichern

Geben Sie das Speicherziel des folgenden Screenshots an (Siehe Screenshots später)

 //スクリーンショットの設定ディレクトリ設定
        Configuration.reportsFolder = "/User/Temp/result/ScreenShot";

Zeicheneingabespezifikation

Wenn Sie bei der Eingabe von Zeichen in das Eingabe-Tag Folgendes angeben, Geben Sie die angegebenen Zeichen sofort an (Wenn Sie Folgendes nicht angeben, wird jedes Zeichen auf dem Bildschirm eingegeben.)

        Configuration.fastSetValue = true;

Fahrer fertig

Es wird in der Methode @ @ After ausgeführt. Beenden Sie den Treiber mit der folgenden Methode

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

Prüfung

Implementiert innerhalb der @ Test-Methode (ähnlich einem normalen Junit) Zuallererst als rauer Fluss

  1. Starten Sie die angegebene URL mit "Selenide # open (String, Class)"
  2. Holen Sie sich das gestartete Seitenelement und prüfen Sie, ob das erwartete Element angezeigt wird
  3. Klicken Sie auf die Schaltfläche usw., um zu überprüfen, ob der Übergang wie erwartet ist oder sich wie erwartet verhält Sie können mehrere Bildschirme überprüfen, indem Sie "2-3" wiederholen.

Startbildschirm durch Angabe der URL

Öffnen Sie die angegebene Seite wie folgt

ItemsPageObject itemsPage = Selenide.open("http://localhost:8080/items", ItemsPageObject.class);

Über PageObject

Die Klasse (Object), die das zweite Argument und der Rückgabewert ist, heißt "PageObject". Abrufen und Bedienen von Selenide-Elementen in diesem PageObject Es wird empfohlen, das Erfassungsergebnis zu beurteilen und den Bildschirm über PageObject in der Testmethode zu bedienen.

    @Test
    public void testItemList() throws Exception {
        ItemspageObject itemsPage = Selenide.open("/items", ItemspageObject.class);
        List<String> ret = itemsPage.getItemNames();
        assertEquals("ItemCount", 2, ret.size());
    }

Holen Sie sich im obigen Beispiel das HTML-Element in "ItemspageObject # getItemNames ()" Die Bestätigung des erfassten Inhalts erfolgt in der Testmethode

Element abrufen

Holen Sie sich das Element, indem Sie die get-Methode im Page-Objekt (Klasse) beschreiben.

Grundlegende Elementerfassungsmethode

Sie können das Zielelement mit Selenide # $ (String) erhalten Danach werde ich eine so einfache Seite als Beispiel beschreiben

<table>
 <tr>
   <th>Header1</th>
 </tr>
 <tr>
   <td>Data1</td>
 </tr>
 <tr>
   <td>Data1</td>
 </tr>
</table>

Sie können das gesamte "

" - Tag abrufen, indem Sie es wie folgt abrufen

public SelenideElement getTable(){
   return Selenide.$("table");
}

Wenn Sie mehr untergeordnete Elemente erhalten möchten, können Sie diese wie folgt abrufen

public ElementsCollection getTableRows(){
 //Tableの要素を取得
   SelenideElement table = Selenide.$("table");
 //子要素の一覧を取得
   return table.$$("tr");
}

Sie können nach einem Element mit der durch "SelenideElement Selenide # $ (String)" angegebenen Zeichenfolge suchen und das erste Element abrufen, das erhalten wurde.

Sie können nach einem Element mit der durch "ElementsCollection Selenide # $$ (String)" angegebenen Zeichenfolge suchen und es in die zuerst erhaltene Elementliste aufnehmen. Da "ElementsCollection" eine geerbte Klasse von "AbstarctList " ist, ist es möglich, die Anzahl der erfassten Elemente und den Inhalt der Liste zu überprüfen (Details weggelassen).

Elementerfassungsmethode (im Feld PageObject festgelegt)

Sie können Elemente einfügen, indem Sie beschreiben, wie das PageObject-Feld in @ FindBy abgerufen wird (siehe Abbildung unten).

public class ItemspageObject extends SelenideBasePageObject {

    @FindBy(how = How.TAG_NAME, using = "table")
    private SelenideElement table;


    @FindBy(how = How.TAG_NAME, using = "tr")
    private ElementsCollection rows;

Wenn Sie im obigen Fall eine Instanz von "ItemspageObject" erstellen, rufen Sie das Element von der Startseite mit dem Tag name = "table" ab und legen Sie den Wert fest. Wenn Sie die untergeordneten Elemente der obigen "Tabelle" erhalten möchten, können Sie anstelle von "SelenideElement" eine eigene Klasse angeben.

public class ItemspageObject extends SelenideBasePageObject {

    @FindBy(how = How.TAG_NAME, using = "table")
    private OriginalTable table;

"OriginalTable" wird erstellt, indem "ElementsContainer" wie folgt geerbt wird

public class OriginalTable extends ElementsContainer {
    @FindBy(how = How.TAG_NAME,using = "tr")
    private List<TableRow> tableRows;

Wenn Sie mehrere Elemente einfügen und Ihre eigene Klasse angeben möchten, deklarieren Sie diese als "List " T muss eine Klasse sein, die ElementsContainer erbt

public class TableRow extends ElementsContainer {
    /**
     * TableHeader
     */
    @FindBy(how = How.TAG_NAME, using = "th")
    private ElementsCollection headers;

Elemente manipulieren

Ich werde die Operation für das erfasste Element erklären

Wert erhalten

Um den Wert zu erhalten, der im Tag des angegebenen Elements enthalten ist Verwenden Sie String SelenideElement # getText ()

   <th>Header1</th>

Wenn Sie es für Elemet ausführen, das dem obigen "th" -Tag entspricht, können Sie die Zeichenfolge "Header1" erhalten.

Attributwert abrufen

Verwenden Sie "String SelenideElement # getAttribute (String)", um den Attributwert des angegebenen Elements abzurufen.

<a href="/users">Data2</a>

Wenn Sie das obige Attribut "href" erhalten möchten, rufen Sie es wie folgt auf.

SelenideElement aTag;
 //中略
String hrefStr = aTag.getAttribute("href");

wichtiger Punkt Im Fall des href-Attributs ist der abzurufende Wert wie folgt http: // loalhost: 8080 / users (gibt den interpretierten absoluten Pfad anstelle des relativen Pfads zurück)

Legen Sie einen Wert für ein Element fest

Zeichenketteneinstellung

Geben Sie eine Zeichenfolge für die folgenden Eingabeelemente für Zeichenfolgen an

<a>Input:<input type="text" name="NAME"></a>

Implementiert mit SelenideElemnt # setValue (String)

 //InputTagに文字列を設定
inputTag.setValue("aaaaa");
 //設定した文字列は"SelenideElemnt#getValue()"で取得できる
assertEquals("InputTagValue", "aaaaa", inputTag.getValue());

Dateispezifikation

Geben Sie den Dateipfad für die folgenden Dateiauswahlelemente an

<a>FileUp:<input type="file" name="FILE"></a>
 //InputTagにファイルパスを設定
fileUpTag.uploadFile(new File("/User/Text.txt"));

Die Datei wird nicht tatsächlich hochgeladen, wenn der obige Prozess ausgeführt wird, sondern nur der Dateipfad wird im Element festgelegt. (Der Upload erfolgt erst nach der Übermittlung)

Werteinstellung für versteckte Objekte

Wenn Sie einen Wert für ein Element mit "type =" hidden "festlegen möchten, wird bei Verwendung von" SelenideElemnt # setValue (String) "eine Fehlermeldung angezeigt. Stellen Sie daher den Wert über JavaScript ein.

<input type='hidden' name='hiddenItem' value='HiddenValue' />

Um im obigen Beispiel einen Wert für das 'hiddenItem'-Element festzulegen, können Sie den Wert wie folgt festlegen.

 String value = "Einstellwert"
((JavascriptExecutor) webDriver).executeScript("document.getElementsByName('hiddenItem').item(0).value = '" + value + "';");

WebDrivers für IE / FireFox / Chrome erben beide "RemoteWebDriver" und Da RemoteWebDriver`` JavascriptExecutor implementiert, kann es von einem allgemeinen Browser verarbeitet werden.

Datei download

Download-Prozess von Selenide

Verwenden Sie "File SelenideElemnt # download ()", um die Datei abzurufen, auf die das href-Attribut verweist. Es ist nicht möglich, eine Verarbeitung zu verarbeiten, die eine Zwischenverarbeitung umfasst, z. B. eine Operation mit JavaScript

Download-Prozess, der notwendig erscheint

Überprüfen Sie nach dem Klicken auf eine Schaltfläche oder einen Link den Download-Ordner (angegeben in den Einstellungen unter [Link-Ziel](#Spezifikations-Download-Pfad angeben)) und rufen Sie die neu erstellte Datei als Download-Datei ab.

Die folgenden Hinweise

  1. Behalten Sie die Anzahl der Dateien im angegebenen Ordner bei, bevor Sie auf klicken (siehe [Link](# Listener-Einstellungen)).
  2. Wenn der Downloadvorgang ausgeführt wird, ändert sich der Inhalt des Ordners in der folgenden Reihenfolge. Daher muss der Abschluss des Dateidownloads endgültig erkannt und die Datei überprüft werden.
  3. Keine Dateierweiterung (Download nicht gestartet)
  4. Die Erweiterung der erstellten Datei lautet ".tmp" (Download-Status von Chrome-1).
  5. Die Erweiterung der erstellten Datei lautet ".crdownload" (Herunterladen mit Chrome-2).
  6. Der erstellte Dateiname wird zu einem regulären Namen (Download abgeschlossen)

Sie können es erhalten, indem Sie die obigen 1-4 Urteile mit den folgenden Quellen durchführen

    /**
 * Holen Sie sich die neueste Download-Datei
     *
 * @return Neueste Download-Datei
     */
    public File getLatestDownloadFile() {
        final File downloadDir = new File(getFileDownloadPath());
        
 //ダウンロード完了まで10秒待機
        WebDriverWait waitForUpload = new WebDriverWait(driver, 10);

        waitForUpload.until(new ExpectedCondition<Boolean>() {
 //ここの判定処理は、デフォルトで500ミリ秒ごとに実施
            public Boolean apply(WebDriver _driver) {
 //ファイル名からダウンロード中か否かを判定
                return isDownloadFinish(getLatestFile(downloadDir));
            }
        });

 //最新ファイルを取得
        File retFile = getLatestFile(downloadDir);
 //最新ファイルが取得できたら対象のファイルを返却
        if (isDownloadFinish(retFile)) {
            return retFile;
        }
 //出来なかったらNull返却
        return null;
    }

    /**
 * Stellen Sie fest, ob der Download ausgeführt wird
     *
 * @param target Zieldatei
 * @return Gibt an, ob der Download abgeschlossen ist
     */
    private static boolean isDownloadFinish(File target) {
        return target != null && !target.getName().endsWith(".crdownload") && !target.getName().endsWith(".tmp");
    }

    /**
 * Holen Sie sich die neueste Datei
     *
 * @param targetDir Download-Verzeichnis
 * @return Neueste Download-Datei
     */
    private File getLatestFile(File targetDir) {
        File[] downLoaededFiles = targetDir.listFiles();
        
 //クリック前に保持したファイル数と変わっていなかったらNullを返却
         if (downLoaededFiles == null || downLoaededFiles.length == resultFileCount) {
            return null;
        }

 //ファイルの更新時間で比較し、最新のファイルを返却
        Arrays.sort(downLoaededFiles, new Comparator<File>() {
            @Override
            public int compare(File file1, File file2) {
                return file1.lastModified() <= file2.lastModified() ? 1 : -1;
            }
        });

        return downLoaededFiles[0];
    }

Listener-Einstellungen

Durch Angabe eines Listeners (WebDriverEventListener-Implementierungsklasse) für WebDriverRunner (siehe unten) kann die Verarbeitung zum Zeitpunkt vor dem Klicken ausgeführt werden.

       WebDriverRunner.addListener(new WebDriverListenerImpl());

Die Implementierungsklasse von "WebDriverEventListener" wird folgendermaßen implementiert (halten Sie die Anzahl der Dateien im angegebenen Ordner, bevor Sie auf klicken).

/**
 * Implementierungsklasse von WebDriverEventListener
 */
public class WebDriverListenerImpl implements WebDriverEventListener {

 //その他のメソッド群は省略

    @Override
    public void beforeClickOn(WebElement webElement, WebDriver webDriver) {
 //クリック前に実績フォルダ配下のファイル数を取得する
        baseClass.setResultFileCount(new File(" "/User/Temp/result/DownloadFile"").listFiles().length);
    }
}


Recommended Posts

Selenide Know-how
Selenid-Optionsliste