2017-05-05 1 views
1

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(); 
    } 
} 
+0

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) –

Antwort

1

Diese Ausnahme ist ziemlich einfach: die Classpath fehlt etwas. Java findet diese org/openqa/selenium... Klasse nicht.

Und alle Ihre Einstellungen erwähnt Junit, Hamcrest, ... aber nicht Selen.

Lange Rede, kurzer Sinn: Wahrscheinlich fügt Ihre IDE dem Klassenpfad ein Selenglas hinzu, ohne dass Sie es bemerken. Aber wenn Sie Dinge auf der Kommandozeile ausführen, müssen Sie alle die Elemente bereitstellen, die benötigt werden. Selen fehlt. Und wahrscheinlich Ihre eigenen Klassen auch.

+1

Vielen Dank! Meine eigenen Klassen fehlten nicht, weil sie alle im Zielglas sind;). Was mich in den Wahnsinn getrieben hat, war, dass es anfing mit junit vermisst, dann hamcrest, dann ... wo ich annahm, dass Maven sich darum kümmern würde. Ich löste es mit dem Maven-Assembly-Plugin, um ein Jar mit Abhängigkeiten zu erstellen, und jetzt kann ich die Hauptklasse ausführen. –

Verwandte Themen