Erstellen einer E2E-Testumgebung mit Selen (Java)
Obwohl ich es gebaut habe, werde ich wahrscheinlich einen schweren Lift bekommen, wenn ich gefragt werde, ob Sie eine Seitenklasse erstellen möchten. Daher werde ich aufzeichnen, wie eine Seitenklasse so einfach wie möglich erstellt werden kann. Nach meiner Erfahrung sage ich wahrscheinlich viel: unschuldig:
In der Windows-Version erklärt. Verwenden Sie die Entwicklertools von Chrome.
Zeigen Sie den Bildschirm an, den Sie überprüfen möchten
Drücken Sie F12, um die Entwicklertools anzuzeigen
Klicken Sie auf die Schaltfläche Auswählen und wählen Sie das Element aus, das Sie bedienen möchten
Klicken Sie mit der rechten Maustaste auf die invertierte HTML-Quelle und wählen Sie Kopieren - Kopierauswahl, um Informationen wie "#q" zu kopieren.
Die folgende Seitenklasse wird unter Berücksichtigung der zuvor untersuchten Elemente erstellt.
Google.java
package page;
import static com.codeborne.selenide.Selenide.*;
import org.openqa.selenium.WebDriver;
public class Google extends PageBase {
public static final String _url = "https://www.google.co.jp/webhp";
public Google(WebDriver webDriver) {
super(webDriver);
}
private String _id_search = "#lst-ib";
// ****************************************
//Suchseite
// ****************************************
public Google __Suchworteingabe(String s) {
$(_id_search).setValue(s);
return this;
}
public Google __Mach eine Suche() {
$(_id_search).submit();
return this;
}
}
Der Test ist der folgende Code.
GoogleTest.java
package test;
import org.junit.Test;
import com.htmlhifive.pitalium.core.model.ScreenshotArgument;
import page.Google;
public class GoogleTest extends TestBase {
@Test
public void OK() throws Exception {
driver.get(Google._url);
Google page = new Google(driver);
page.__Suchworteingabe("test")
.__Mach eine Suche();
ScreenshotArgument arg = ScreenshotArgument.builder("result").addNewTarget().build();
assertionView.verifyView(arg);
}
}
Fügen Sie nach dem Anzeigen der Suchergebnisse eine Methode hinzu, die durch Klicken auf das Tool ausgeführt werden kann. Die Überprüfung der Elemente ist dieselbe wie zuvor.
Selen scheint zu schnell zu wirken und kann Fehler wie fehlende Elemente verursachen. Es ist stabil, wenn Sie nach dem Klicken auf das angezeigte Element warten.
Google.java
package page;
import static com.codeborne.selenide.Condition.*;
import static com.codeborne.selenide.Selenide.*;
import java.util.Iterator;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import com.codeborne.selenide.SelenideElement;
public class Google extends PageBase {
public static final String _url = "https://www.google.co.jp/webhp";
public Google(WebDriver webDriver) {
super(webDriver);
}
private String _id_search = "#lst-ib";
// ****************************************
//Suchseite
// ****************************************
public Google __Suchworteingabe(String s) {
$(_id_search).setValue(s);
return this;
}
public Google __Mach eine Suche() {
$(_id_search).submit();
return this;
}
// ****************************************
//Suchergebnisseite (das Folgende ist eine andere Klasse)
//Ursprünglich "__Mach eine Suche()Geben Sie die Suchergebnis-Seitenklasse mit der Methode zurück
// ****************************************
public Google __Klicken Sie auf das Werkzeug() {
$("#hdtb-tls").click();
return this;
}
public Google __Werkzeug$Klicken Sie auf den Punkt() {
//Überprüfen Sie, ob das Menü nach Auswahl des Werkzeugs angezeigt wird
if (!$("#hdtbMenus").isDisplayed()) {
__Klicken Sie auf das Werkzeug();
}
//Warten Sie 60 Sekunden, bis das Element nach der Auswahl angezeigt wird
$("#hdtbMenus").waitUntil(appear, 60000);
$("#hdtbMenus > div > div:nth-child(5) > div").click();
return this;
}
public Google __Werkzeug$Zeitraum$Klicken Sie innerhalb von 1 Stunde() {
return __Werkzeug$Zeitraum$Klicken Sie auf das angegebene Zeichen("Innerhalb einer Stunde");
}
public Google __Werkzeug$Zeitraum$Klicken Sie innerhalb von 1 Jahr() {
return __Werkzeug$Zeitraum$Klicken Sie auf das angegebene Zeichen("Innerhalb von 1 Jahr");
}
private Google __Werkzeug$Zeitraum$Klicken Sie auf das angegebene Zeichen(String text) {
//Überprüfen Sie, ob das Periodenmenü angezeigt wird
if (!$("#hdtbMenus > div > ul.hdtbU.hdtb-mn-o").isDisplayed()) {
__Werkzeug$Klicken Sie auf den Punkt();
}
//Warten Sie 60 Sekunden, bis das Element nach der Auswahl angezeigt wird
$("#hdtbMenus > div > ul.hdtbU.hdtb-mn-o").waitUntil(appear, 60000);
return matchTextClick(text, $$("#hdtbMenus > div > ul.hdtbU.hdtb-mn-o > li").iterator());
}
private Google matchTextClick(String text, Iterator<SelenideElement> seItr) {
boolean ckickFlg = false;
while (seItr.hasNext()) {
SelenideElement se = seItr.next();
if (text.equals(se.getText())) {
se.click();
ckickFlg = true;
break;
}
}
if (!ckickFlg) {
throw new NoSuchElementException("Click error:" + text);
}
return this;
}
}
Der Test ist der folgende Code.
GoogleTest.java
package test;
import org.junit.Test;
import com.htmlhifive.pitalium.core.model.ScreenshotArgument;
import page.Google;
public class GoogleTest extends TestBase {
@Test
public void OK() throws Exception {
driver.get(Google._url);
Google page = new Google(driver);
page.__Suchworteingabe("test")
.__Mach eine Suche();
ScreenshotArgument arg = ScreenshotArgument.builder("result1").addNewTarget().build();
assertionView.verifyView(arg);
page.__Werkzeug$Zeitraum$Klicken Sie innerhalb von 1 Stunde();
//Wenn Sie den Bildschirmzustand perfekt verstehen können, ist die folgende Beschreibung schneller
// page.__Klicken Sie auf das Werkzeug()
// .__Werkzeug$Klicken Sie auf den Punkt()
// .__Werkzeug$Zeitraum$Klicken Sie innerhalb von 1 Stunde();
arg = ScreenshotArgument.builder("result2").addNewTarget().build();
assertionView.verifyView(arg);
page.__Werkzeug$Zeitraum$Klicken Sie innerhalb von 1 Jahr();
arg = ScreenshotArgument.builder("result3").addNewTarget().build();
assertionView.verifyView(arg);
}
}
Es scheint, dass Sie Seiten mit separaten Frames wechseln müssen. Ich denke, es ist besser, dieses Steuerelement auch mit der Page-Klasse abzudecken. (Bitte unterrichten Sie, ob es einen Weg gibt, ohne zu wechseln)
18/04/23 geändert Ich verstehe, was Sie kommentiert haben, aber ich konnte es aufgrund mangelnder Fähigkeiten nicht im Code wiedergeben: schreien: Ich wünschte, ich könnte eine ähnliche Beschreibung in der Methode "__Enter in Punkt 1" schreiben, aber ich kann mir das nicht vorstellen.
FrameSample.java
package page;
import static com.codeborne.selenide.Selenide.*;
import org.openqa.selenium.WebDriver;
import com.codeborne.selenide.SelenideElement;
import com.codeborne.selenide.WebDriverRunner;
public class FrameSample extends PageBase {
public static final String _url = "https://";
public FrameSample(WebDriver webDriver) {
super(webDriver);
}
/**Geben Sie das Element ein, das im Standardrahmen vorhanden ist*/
public FrameSample __Geben Sie in Punkt 1 ein(String s) throws InterruptedException {
$("#in1").setValue(s);
return this;
}
/**Eingabe in ein Element, das in einem anderen Frame vorhanden ist*/
public FrameSample __Geben Sie in Punkt 2 ein(String s) throws InterruptedException {
switcFrame($(".iframe"));
$("#in2").setValue(s);
switchDefaultFrame();
return this;
}
/***
*Zum Standardbild wechseln
* @throws InterruptedException
*/
private void switchDefaultFrame() throws InterruptedException{
//Da die Verarbeitung nicht stabil ist, habe ich Wait vorerst in den Frame-Wechsel eingefügt
WebDriverRunner.getWebDriver().switchTo().defaultContent();
Thread.sleep(2000);
}
/***
*Wechseln Sie zu einem anderen Frame
* @Element des Parameterrahmens
* @throws InterruptedException
*/
private void switcFrame(SelenideElement se) throws InterruptedException{
//Da die Verarbeitung nicht stabil ist, habe ich Wait vorerst in den Frame-Wechsel eingefügt
WebDriverRunner.getWebDriver().switchTo().frame(se);
Thread.sleep(2000);
}
}
Recommended Posts