Ich schreibe ein Programm, um eine Besucheranmeldung zu automatisieren, mit selenide (4.4.x) und junit (4.12). Die Tests laufen gut, wenn ich sie als JUnit-Test in der IDE ausführe, aber für eine bequemere Verwendung möchte ich sie von main/commandline ausführen.Ich kann JUnitCore Test Runner von IntelliJ ausführen. Run config, aber nicht form commandline
Ich habe es geschafft, dies mit einer IntelliJ Run-Konfiguration zu arbeiten, aber nicht, wenn ich das gleiche von der Kommandozeile aus versuche. Grundsätzlich habe ich eine abstrakte Klasse, die den Selenium/ide WebDriver startet und stoppt, eine konkrete Testklasse (RegisterVisitorTest.java
), die die eigentliche Reservierungslogik enthält, und RunTest.java
mit einer main
Methode. Siehe unten für ein MWE (Schnitt irrelevanter Code, so dass es möglicherweise nicht als solches ausführbar ist).
Wenn ich schaffen eine IntelliJ Laufkonfiguration mit:
-Dselenide.browser=chrome -Dwebdriver.chrome.driver="C:\downloads\chromedriver.exe" -DlastName="Peeters" -DfirstDay="5-5-2017"
als VM-Optionen, es führt dann sehr gut und Drucke sowohl „in RunTest.main“, „RegisterVisitorTest“, und es füllt das Formular für mich . Allerdings, wenn ich ein Glas mit mvn install
erstellen und führen Sie es als
java -Dselenide.browser=chrome -Dwebdriver.chrome.driver="C:\downloads\chromedriver.exe" -DlastName="Peeters" -DfirstDay="5-5-2017" -cp %junit_path%;target\name-of-jar.jar x.selenide.RunTest
wo `% junit_path% eine Referenz enthält junit.jar und hamcrest.jar, es geht in Haupt- und druckt„in RunTest.main“ , aber es führt die Tests nicht durch. Die gute Nachricht ist, dass ich auch keine Fehler bekomme.
Allerdings, wenn ich es direkt als JUnitCore Läufer von der Kommandozeile ausgeführt werden mit:
java -Dselenide.browser=chrome -Dwebdriver.chrome.driver="C:\downloads\chromedriver.exe" -DlastName="Peeters" -DfirstDay="5-5-2017" -cp %junit_path%;target\name-of-jar.jar org.junit.runner.JUnitCore nl.ing.selenide.RegisterVisitorTest
ich die folgende Ausgabe:
JUnit version 4.12
Exception in thread "main" java.lang.NoClassDefFoundError: org/openqa/selenium/support/events/WebDriverEventListener
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.junit.internal.Classes.getClass(Classes.java:16)
at org.junit.runner.JUnitCommandLineParseResult.parseParameters(JUnitCommandLineParseResult.java:100)
at org.junit.runner.JUnitCommandLineParseResult.parseArgs(JUnitCommandLineParseResult.java:50)
at org.junit.runner.JUnitCommandLineParseResult.parse(JUnitCommandLineParseResult.java:44)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:72)
at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.support.events.WebDriverEventListener
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 8 more
Was mich stört, ist, dass es in Ordnung läuft, wenn ich führe es von der IDE aus, aber dass es den Test nicht auslöst, wenn ich main von der Kommandozeile aus starte, und dass es fehlschlägt, wenn ich den Test direkt ausführe. In meinem Maven-Projekt habe ich eine Reihe von roten Linien, aber das scheint die meiste Zeit keine Rolle zu spielen ...
Wie auch immer, das scheint auf den oben erwähnten WebDriverEventListener zu laufen, aber wenn ich versuche, einen WebDriverEventListener hinzuzufügen es kann anscheinend die Abhängigkeit finden und fügt automatisch die korrekte Importanweisung hinzu, obwohl das das Ergebnis nicht ändert, wenn ich einen anderen mvn install
mache.
Fehle ich etwas?
EDIT: Obwohl 'Klasse nicht gefunden' in anderen SO Fragen gefunden wird, ist es kein Duplikat der Hadoop Frage, da ich die richtigen Umgebungsvariablen gesetzt habe.
Ich bin in der Lage, andere JARs zu betreiben, nur nicht diese.
Gelöst durch die Verwendung des Maven Assembly Plugins, um alle Abhängigkeiten einzubeziehen.
MWE (Versuch):
package x.selenide;
//RunTest.java
import org.junit.runner.JUnitCore;
public class RunTest {
public static void main(String[] args) {
System.out.println("In RunTest.main");
JUnitCore junit = new JUnitCore();
junit.run(RegisterVisitorTest.class);
}
}
//RegisterVisitorTest.java
public class RegisterVisitorTest extends ClickTest {
private static String lastName;
private static LocalDate firstDay;
private static LocalDate lastDay;
private static final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("d-M-yyyy");
public RegisterVisitorTest() {
System.out.println("RegisterVisitorTest");
}
@BeforeClass
public static void setUp() {
// setup properties with System.getProperties();
}
@Test
public void openRegistrationPage(){
Selenide.$(Selectors.byText("Bezoekers aanmelden")).click();
String parentWindowHandle = WebDriverRunner.getWebDriver().getWindowHandle();
// switch tab/window as it opens a new window
Set<String> handles = WebDriverRunner.getWebDriver().getWindowHandles();
for (String handle: handles){
if(!handle.equals(parentWindowHandle)){
Selenide.switchTo().window(handle);
}
}
// method call to fill the actual registration form
}
}
// ClickTest.java
public abstract class ClickTest {
@BeforeClass
public static void openOrderSite() {
Configuration.timeout = 10000;
Configuration.baseUrl = "https://intranet.net";
Configuration.startMaximized = false;
Selenide.open("/subdomain");
waitUntilPageIsLoaded();
}
private static void waitUntilPageIsLoaded() {
waitUntilPageIsLoaded("Bezoekers aanmelden");
}
static void waitUntilPageIsLoaded(String expected){
logger.info(String.format("Waiting for string '%s' to appear...", expected));
Selenide.$(Selectors.byText(expected)).waitUntil(Condition.appears, 20000);
logger.info("Page loaded");
}
@AfterClass
public static void logout() {
WebDriverRunner.closeWebDriver();
}
}
Mögliche Duplikate von [Hadoop in Windows mit Cygwin noclassdefinition Fehler gefunden] (http://stackoverflow.com/questions/23219089/hadoop-in-windows-with-cygwin-noclassdefinition-found-error) –