Erstellen Sie eine E2E-Testumgebung mit Selenium (Java).

~~18/11/29 Wenn Sie Selenide auf die neueste Version (ver5-Serie) aktualisieren, funktioniert dies nicht. Es ist besser, die neueste Version zu verwenden, daher werde ich sie später beheben. ~~ 18/12/03 Ich habe nur Chrome ausprobiert und den Programmcode aktualisiert. IE usw. bleibt wie in der Beschreibung von functions.json.

Einführung

Sofortige Qualitätssicherung: unschuldig: Um die aktuelle Situation, in der Regressionstests einige Zeit in Anspruch nehmen, schrittweise zu verbessern, haben wir eine Umgebung erstellt, um Systemtests zu automatisieren, die wiederholt dasselbe tun. Ich habe diese Aufzeichnung.

Ich habe nicht aufgezeichnet, wie der Test ausgeführt wird, da es besser ist, auf Pitalium Tutorial zu verweisen.

Verwendete Software

Dies ist die zur Überprüfung verwendete Software. Alles war großartig. Sie können mit Selenium Grid (Hub, Node-Konfiguration) mit Pitalium testen. Ich erstelle eine Verifizierungsversion unter Windows.

Sanft Ausführung Verwenden
java 1.8.0_191
Pitalium 1.2.4 Wird als Basis verwendet
Selenide 5.0.1 Wird nur mit PageObject verwendet
selenium-server-standalone.jar 3.141.59
chromedriver.exe 2.44

Umgebung

Fahren Sie mit Pitalium Tutorial fort, um eine Testausführungsumgebung zu erstellen.

18/04/23 ClassNotFound kann in CI (Jenkins) vorkommen, daher habe ich es in Maven geändert. Der Bereich ist kein Test, da wir ihn in einem Testprojekt versuchen.

Maven-Datei
Maven-Datei (Dekomprimierung)

pom.xml


<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>Autotest</groupId>
  <artifactId>Autotest</artifactId>
  <version>0.0.1</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <testSourceDirectory>src</testSourceDirectory>
    <resources>
      <resource>
        <directory>resource</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>resource</directory>
      </testResource>
    </testResources>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.4</version>
      </plugin>
    </plugins>
  </build>
  <dependencies>
  	<dependency>
  		<groupId>com.htmlhifive</groupId>
  		<artifactId>pitalium</artifactId>
  		<version>1.2.4</version>
  		<exclusions>
  			<exclusion>
  				<groupId>org.slf4j</groupId>
  				<artifactId>slf4j-api</artifactId>
  			</exclusion>
  		</exclusions>
  	</dependency>
  	<dependency>
  		<groupId>com.codeborne</groupId>
  		<artifactId>selenide</artifactId>
  		<version>5.0.1</version>
  		<exclusions>
  			<exclusion>
  				<groupId>org.apache.httpcomponents</groupId>
  				<artifactId>httpclient</artifactId>
  			</exclusion>
  			<exclusion>
  				<groupId>org.slf4j</groupId>
  				<artifactId>slf4j-api</artifactId>
  			</exclusion>
  		</exclusions>
  	</dependency>
  	<dependency>
  		<groupId>org.seleniumhq.selenium</groupId>
  		<artifactId>selenium-api</artifactId>
  		<version>3.141.59</version>
  	</dependency>
  	<dependency>
  		<groupId>org.seleniumhq.selenium</groupId>
  		<artifactId>selenium-remote-driver</artifactId>
  		<version>3.141.59</version>
  	</dependency>
  	<dependency>
  		<groupId>org.seleniumhq.selenium</groupId>
  		<artifactId>selenium-support</artifactId>
  		<version>3.141.59</version>
  	</dependency>
  	<dependency>
  		<groupId>com.google.guava</groupId>
  		<artifactId>guava</artifactId>
  		<version>27.0.1-jre</version>
  	</dependency>
  	<dependency>
  		<groupId>org.slf4j</groupId>
  		<artifactId>slf4j-log4j12</artifactId>
  		<version>1.8.0-beta2</version>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.httpcomponents</groupId>
  		<artifactId>httpclient</artifactId>
  		<version>4.5.6</version>
  	</dependency>
  </dependencies>
  <properties>
    <java.version>1.8</java.version>
    <file.encoding>UTF-8</file.encoding>
  	<project.build.sourceEncoding>${file.encoding}</project.build.sourceEncoding>
  	<project.reporting.outputEncoding>${file.encoding}</project.reporting.outputEncoding>
    <maven.compiler.encoding>${file.encoding}</maven.compiler.encoding>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
  </properties>
</project>

Meine Umgebung sieht folgendermaßen aus: Aufgrund des später beschriebenen Problems wurde der IE schließlich separat in einem anderen Knoten gestartet.

Hub-Startbefehl
Hub-Startbefehl (erweitern)
java -jar selenium-server-standalone-3.141.59.jar -role hub
Knotenkonfigurationsdatei
Knotenkonfigurationsdatei (Dekomprimierung)

NodeConfigBrowser.json


{
 "capabilities": [
    {
     "platform": "WINDOWS",
     "browserName": "firefox",
     "maxInstances": 2,
     "seleniumProtocol": "WebDriver"
    },
    {
     "platform": "WINDOWS",
     "browserName": "chrome",
     "maxInstances": 3,
     "seleniumProtocol": "WebDriver"
    },
    {
     "platform": "WINDOWS",
     "browserName": "internet explorer",
     "maxInstances": 1,
     "seleniumProtocol": "WebDriver"
    }
  ],
 "hub": "http://XXX.XXX.XXX.XXX:4444/grid/register",
 "register": true
}
Knotenstartbefehl
Befehl zum Starten des Knotens (erweitern)
java -Dwebdriver.ie.driver=IEDriverServer.exe -Dwebdriver.chrome.driver=chromedriver.exe -Dwebdriver.gecko.driver=geckodriver.exe -jar selenium-server-standalone-3.141.59.jar -role node -nodeConfig NodeConfigBrowser.json

Programmstruktur

Die Verzeichnisstruktur kann sich ändern, aber vorerst habe ich es mit der folgenden Struktur gemacht.

aWS050227.JPG

--Seitenpaket

Vom Klang des PageObject-Musters angezogen, habe ich beschlossen, vorerst einen Bildschirm mit einem Objekt zu erstellen. Ich benutze hier Selenide.

~~ Da die Generierung von WebDriver Pitalium überlassen bleibt, habe ich eine übergeordnete Klasse erstellt und WebDriver im Konstruktor an Selenide übergeben. ~~ 18/12/03 Die neueste Version von Selenide (ver5-Serie) hatte hier ein Problem. Geändert, um den Treiber anzugeben, der von Selenide nur einmal in der übergeordneten Testfallklasse verwendet werden soll.

Übergeordnete Seitenklasse
Übergeordnete Seitenklasse (Erweiterung)

PageBase.java


package page;

import com.htmlhifive.pitalium.core.config.PtlTestConfig;

/**
 *Übergeordnete Seitenklasse für die allgemeine Verarbeitung wie Kopf- und Fußzeilen in Seiten
 */
public abstract class PageBase {

    /**Basis-URL beginnend mit http oder https*/
    protected final String _BASE_URL = PtlTestConfig.getInstance().getTestAppConfig().getBaseUrl();

    /*********************************
     *Gemeinsame Bedienung
     *********************************/

}
Untergeordnete Seitenklasse
Untergeordnete Seitenklasse (Erweiterung)

Der Grund, warum der Klassenname usw. auf Japanisch ist, wird später beschrieben.

Einloggen.java


package page;

import static com.codeborne.selenide.Selenide.*;

public class __Der Anmeldebildschirm erweitert PageBase{

    public static final String _URL = "/login";

    /*********************************
     *Wähler
     *********************************/

    //Konto-ID
    private static final String _ACCOUNT_TXT_CSS = "#accountID";
    //Passwort
    private static final String _PASS_TXT_CSS = "#password";
    //Anmeldeschaltfläche
    private static final String _LOGIN_BTN_CSS = "#login";

    /*********************************
     *Operation
     *********************************/

    public __Anmeldebildschirm__Geben Sie Ihre Konto-ID ein(String s) {
        $(_ACCOUNT_TXT_CSS).setValue(s);
        return this;
    }

    public __Anmeldebildschirm__Passwort eingeben(String s) {
        $(_PASS_TXT_CSS).setValue(s);
        return this;
    }

    public __Anmeldebildschirm__Klicken Sie auf die Schaltfläche Anmelden() {
        $(_LOGIN_BTN_CSS).click();
        return this;
    }

}

Erstellt durch Erben der Pitalium-Klasse. Wir führen Testoperationen und Bildvergleiche durch.

Wieder entschied ich mich, vorerst eine Elternklasse als Basis einzurichten.

Übergeordnete Testklasse
Übergeordnete Testklasse (Erweiterung)

TestBase.java


package test;

import java.util.Locale;

import org.junit.Before;
import org.junit.Rule;

import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.WebDriverRunner;
import com.codeborne.selenide.commands.Commands;
import com.codeborne.selenide.junit.TextReport;
import com.google.common.base.Strings;
import com.htmlhifive.pitalium.core.PtlTestBase;
import com.htmlhifive.pitalium.core.model.ScreenshotArgument;

import custom.SetValueCustomize;

public abstract class TestBase extends PtlTestBase {

    /**Selenid-Leistungsbericht*/
    @Rule
    public TextReport report = new TextReport();

    private int _ssCount = 1;

    @Override
    @Before
    public void setUp() {
        super.setUp();

        //Ersetzt durch den Befehl, der die Verarbeitung für IE hinzugefügt hat
        Commands.getInstance().add("setValue", new SetValueCustomize(Strings.nullToEmpty(capabilities.getBrowserName()).toLowerCase(Locale.ENGLISH)));

        //Stellen Sie das Zeitlimit für die Elementsuche auf 10 Sekunden und den Selenide-Treiber ein
        Configuration.timeout = 10000;
        WebDriverRunner.setWebDriver(driver);

        //Die Standardeinstellung ist keine Ausgabe eines Leistungsberichts
        report.onSucceededTest(false);
        report.onFailedTest(false);

        //Vorverarbeitung der Testausführung
        init();
    }

    /**
     *Vorverarbeitung der Testausführung
     */
    protected void init() {};

    /**
     *Aktivieren Sie die Selenide-Leistungsberichterstattung
     */
    protected void enablePerfReport() {
        report.onSucceededTest(true);
        report.onFailedTest(true);
    }

    /**
     *Stellen Sie fest, ob es sich um einen Chrome-Browser handelt
     * @return true:Chrome
     */
    protected boolean isChrome(){
        return "chrome".equals(Strings.nullToEmpty(capabilities.getBrowserName()).toLowerCase(Locale.ENGLISH)) ? true : false;
    }

    /**
     *Stellen Sie fest, ob es sich um einen Edge-Browser handelt
     * @return Edge
     */
    protected boolean isEdge(){
        return "MicrosoftEdge".equals(Strings.nullToEmpty(capabilities.getBrowserName()).toLowerCase(Locale.ENGLISH)) ? true : false;
    }

    /**
     *Beurteilung, ob es sich um einen IE-Browser handelt
     * @return IE
     */
    protected boolean isIE(){
        return "internet explorer".equals(Strings.nullToEmpty(capabilities.getBrowserName()).toLowerCase(Locale.ENGLISH)) ? true : false;
    }

    /**
     *Mache ein Bildschirmfoto
     */
    protected void screenShotAndVerifyView() {
        screenShotAndVerifyView("image");
    }

    /**
     *Mache ein Bildschirmfoto
     * @param Screenshotname
     */
    protected void screenShotAndVerifyView(String screenName) {
        ScreenshotArgument arg = ScreenshotArgument.builder(screenName + _ssCount).addNewTarget().build();
        assertionView.verifyView(arg);
        _ssCount++;
    }

}
Kindertestklasse
Untergeordnete Testklasse (Erweiterung)

LoginTest.java


package test;

import org.junit.Test;

import page.__Anmeldebildschirm;

public class LoginTest extends TestBase {
    @Test
    public void loginOK() throws Exception {
        driver.get(__Anmeldebildschirm._url);
        __Anmeldebildschirmseite= new __Anmeldebildschirm();

        page.__Geben Sie Ihre Konto-ID ein("user")
                .__Passwort eingeben("password")
                .__Klicken Sie auf die Schaltfläche Anmelden();

        assertionView.assertView("loginOK");
    }
}

Dinge, auf die Sie achten sollten

Da einige Mitglieder des Testteams nur ungern horizontale Zeichen sagen, haben wir beschlossen, alle Klassen und Methoden im Zusammenhang mit Bildschirmoperationen auf Japanisch zu schreiben.

Darüber hinaus ist die Bildschirmbedienungsmethode so konzipiert, dass Kandidaten mit zwei Unterbalken leicht eingegrenzt werden können.

Ich denke, dass der Schwellenwert hoch ist, weil es niemanden gibt, der Erfahrung in der Codierung von Qualität hat. Deshalb möchte ich mit der Seitenklasse in der Entwicklung fortfahren.

Seitenklasse: Schreiben von Entwicklungscode Testklasse: Qualität & Testteam codiert

Ärger

Ich glaube nicht, dass ich große Probleme mit der Operation hatte, die ich durchführen möchte: Umarmen: IE und Teme sind jedoch nicht gut.

Ich habe Probleme bei der Eingabe von Text im IE

Ich kenne den Grund nicht, aber das Phänomen, dass die Eingabe nur im IE fehlschlägt, tritt auf. Im IE gibt es viele Informationen, wie zum Beispiel, dass es besser ist, Steuerelemente im Voraus zu platzieren und zu klicken. Deshalb habe ich es nicht verstanden und beschlossen, alles zu tun: rollende_eyes: Entspricht dem Vorgang der Eingabe mit Selenide durch Einhaken (um genau zu sein, kann es ersetzt werden).

Benutzerdefinierte Befehlsklasse
Benutzerdefinierte Befehlsklasse (Erweiterung)

SetValueCustomize.java


package common;

import java.io.IOException;

import org.openqa.selenium.Keys;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebElement;

import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.SelenideElement;
import com.codeborne.selenide.commands.Commands;
import com.codeborne.selenide.commands.SetValue;
import com.codeborne.selenide.impl.WebElementSource;

/**
 *SetValue-Ersatzklasse
 *Der Unterschied ist die individuelle Entsprechung von IE
 */
public class SetValueCustomize extends SetValue {

    private boolean _ieFlg;

    public SetValueCustomize(String _browserName) {
        _ieFlg = "internet explorer".equals(_browserName) ? true : false;
    }

    @Override
    public WebElement execute(SelenideElement proxy, WebElementSource locator, Object[] args) {
        WebElement element = locator.findAndAssertElementIsVisible();

        if (Configuration.versatileSetValue
                && "select".equalsIgnoreCase(element.getTagName())) {
            return super.execute(proxy, locator, args);
        }
        if (Configuration.versatileSetValue
                && "input".equalsIgnoreCase(element.getTagName()) && "radio".equals(element.getAttribute("type"))) {
            return super.execute(proxy, locator, args);
        }

        if (_ieFlg) {
            element.sendKeys(Keys.CONTROL);
            try {
                Commands.getInstance().execute(proxy, locator, "click", null);
            } catch (IOException e) {
                throw new NoSuchElementException("IE Click error in SetValueCustomize", e);
            }
        }

        return super.execute(proxy, locator, args);
    }
}

Ersetzen Sie den erstellten Befehl im Voraus durch die übergeordnete Testklasse.

TestBase.java



public abstract class TestBase extends PtlTestBase {
    @Override
    @Before
    public void setUp() {
        super.setUp();
        //Ersetzt durch den Befehl, der die Verarbeitung für IE hinzugefügt hat
        Commands.getInstance().add("setValue", new SetValueCustomize(Strings.nullToEmpty(capabilities.getBrowserName()).toLowerCase(Locale.ENGLISH)));
    }
}

Wenn die setValue-Methode in verschiedenen Seitenklassen aufgerufen wird, wird die dem angegebenen Methodennamen zugeordnete Klasse aus der Befehlskarte in Selenide abgerufen und die Ausführung aufgerufen.

Einloggen.java



public class login erweitert PageBase{

öffentliches Login__Geben Sie Ihre Login-ID ein(String id) {
        $("#account").setValue(id);
        return this;
    }
}

Im IE wird das Hover-Menü nur 0,1 Sekunden lang angezeigt (Erfahrung) und untergeordnete Elemente können nicht ausgewählt werden.

Lass die Maus wie sie ist! Es schien, als würde es nicht gelöst werden, selbst wenn ich schrie, also ging ich damit um, indem ich die Fähigkeiten mit se: ieOptions spezifizierte.

Funktionen ieOptions zusätzliche Version
capabilities.json

capabilities.json


[
 {
  "browserName": "internet explorer",
  "se:ieOptions" : {
    "enablePersistentHover" : true,
    "requireWindowFocus" : true
  }
 }
]

Aus diesen Gründen wurde willkürlich entschieden, einen Knoten (Terminal) vorzubereiten, der dem IE gewidmet ist und der nur einen Prozess startet und den Betrieb oder die Entfernung von anderen nicht zulässt: unschuldig:

NodeConfig für Nur-IE-Terminal
NodeConfig für Nur-IE-Terminal

NodeConfigBrowser.json


{
 "capabilities": [
    {
     "platform": "WINDOWS",
     "browserName": "internet explorer",
     "maxInstances": 1,
     "seleniumProtocol": "WebDriver"
    }
  ],
 "hub": "http://XXXXX:4444/grid/register",
 "register": true
}

In IE und Firefox wird beim Herunterladen ein Dialogfeld usw. angezeigt, und der Vorgang funktioniert nicht (ungelöst * Möglicherweise wird er mit WinAppDriver behoben. *)

Firefox hat versucht, Funktionen mit moz: FirefoxOptions --prefs festzulegen, aber es hat nicht funktioniert. Deshalb habe ich beschlossen, keinen anderen Test als Chrome herunterzuladen: unschuldig:

Fähigkeiten FirefoxOptions zusätzliche Version (bedeutungslos)
(bedeutungslose) Capabilities.json

capabilities.json


[
 {
  "browserName": "firefox",
  "moz:firefoxOptions": {
    "prefs": {
        "browser.download.folderList": 0,
        "browser.download.useDownloadDir": true,
        "browser.helperApps.neverAsk.saveToDisk": "text/*,application/*",
        "browser.helperApps.alwaysAsk.force": false,
        "browser.download.manager.closeWhenDone": true,
        "pdfjs.enabledCache.state": false
    }
  }
 }
]

Recommended Posts

Erstellen Sie eine E2E-Testumgebung mit Selenium (Java).
Erstellen Sie mit Docker x Cypress eine E2E-Testumgebung
Java EE Test (CDI / Interceptor) mit Arquillian
Erstellen Sie eine Umgebung mit Docker unter AWS
Erstellen Sie eine Windows-Anwendungstestumgebung mit Selenium Grid, Appium und Windows Application Driver
Erstellen und testen Sie Java + Gradle-Anwendungen mit Wercker
[Rails] So erstellen Sie eine Umgebung mit Docker
Erstellen Sie Java mit Wercker
Erstellen Sie eine Java-Entwicklungsumgebung mit VS Code
Erstellen Sie eine Java-Entwicklungsumgebung mit VS Code auf dem Mac
Erstellen Sie mit Docker eine Ruby2.7.x + Rails6.0.x + MySQL8.0.x-Umgebung
So erstellen Sie eine Java-Entwicklungsumgebung mit VS Code
Erstellen Sie eine Java-Programmentwicklungsumgebung mit Visual Studio Code
Aktivieren Sie Java EE mit NetBeans 9
Erstellen einer Docker-Umgebung mit WSL
Was ist in "Java 8 bis Java 11" passiert und wie wird eine Umgebung erstellt?
Erstellen Sie mit Java + Spring eine Web-APP-Entwicklungsumgebung mit Visual Studio Code
Erstellen Sie mit JAVA eine unveränderliche Klasse
Erstellen eines Java-Projekts mit Gradle
Erstellen Sie mit Docker eine Node.js-Umgebung
Erstellen Sie mit Pleiades 4.8 eine Tomcat 8.5-Umgebung
[Java EE] Implementieren Sie den Client mit WebSocket
Bereiten Sie die Java-Entwicklungsumgebung mit Atom vor
Erstellen Sie Java mit Mac vs Code
Erstellen einer Java-Entwicklungsumgebung (für Mac)
Folgen Sie dem Link mit Selen (Java)
Erstellen Sie mit Eclipse eine Jooby-Entwicklungsumgebung
[Java] Testen Sie private Methoden mit JUnit
Führen Sie in Java8 geschriebene Anwendungen in Java6 aus
Erstellen Sie mit Laradock eine Docker + Laravel-Umgebung
Erstellen Sie eine Umgebung, in der pip3 mit CentOS7 + Python3 verwendet werden kann
Ich habe versucht, mit Eclipse + Tomcat eine http2-Entwicklungsumgebung zu erstellen
Bereiten Sie die Java-Entwicklungsumgebung mit VS Code vor
[Java] Erstellen Sie mit Gradle ein ausführbares Modul
Erstellen Sie mit Docker eine PureScript-Entwicklungsumgebung
Erstellen Sie mit Docker eine Umgebung für "API-Entwicklung + API-Überprüfung mithilfe der Swagger-Benutzeroberfläche"
One-JAR Java EE-Anwendung mit WebSphere Liberty
CICS-Java-Anwendung ausführen- (3) Build-Management mit Gradle
01. Ich habe versucht, eine Umgebung mit SpringBoot + IntelliJ + MySQL (MyBatis) (Windows 10) zu erstellen.
Erstellen Sie eine Java-Entwicklungsumgebung auf dem Mac
Erstellen Sie eine Java 8-Entwicklungsumgebung mit AWS Cloud 9
Erstellen Sie mit Docker eine Wordpress-Entwicklungsumgebung
CICS-Java-Anwendung ausführen- (2) Build-Management mit Maven
Lesen Sie die xlsx-Datei in Java mit Selenium
Erstellen Sie OpenCV mit Java Wrapper unter Ubuntu 18.04
Erstellen Sie eine Nuxt TypeScript + Vuetify-Umgebung mit Docker-Compose
[Docker] Erstellen Sie die Ausführungsumgebung von Jupyter Lab mit Docker
Einführung eines automatisierten Java-Tests mit JUnit 5 + Gradle
Starten Sie die Java-Überprüfungsumgebung lokal mit Vagrant
Erstellen Sie eine Ultra96v2-Entwicklungsumgebung auf Docker 1
Reduzieren Sie die Java / Maven-Erstellungszeit mit Nexus 3 in der OpenShift (okd 3.11) DevOps-Umgebung
Erstellen Sie mit Docker eine TensorFlow-Betriebsüberprüfungsumgebung