能够从 IntelliJ 运行 配置 运行 JUnitCore 测试 运行ner,但不能从命令行
Able to run JUnitCore test runner from IntelliJ run config, but not form commandline
我正在编写一个程序来自动执行访客注册,使用 selenide (4.4.x) 和 junit (4.12)。如果我 运行 将测试 运行 作为 IDE 中的 JUnit 测试,测试 运行 很好,但为了更方便的使用,我想 运行 它来自 main/commandline .
我设法让它与 IntelliJ 运行 配置一起工作,但是当我从命令行尝试同样的事情时却不行。基本上,我有一个启动和停止 Selenium/ide WebDriver 的抽象 class,一个包含实际预订逻辑的具体测试 class (RegisterVisitorTest.java
),以及 RunTest.java
使用 main
方法。请参阅下面的 MWE(删除不相关的代码,因此它可能无法执行)。
如果我创建一个 IntelliJ 运行 配置:
-Dselenide.browser=chrome -Dwebdriver.chrome.driver="C:\downloads\chromedriver.exe" -DlastName="Peeters" -DfirstDay="5-5-2017"
作为 VM 选项,然后它执行得非常好并打印 "in RunTest.main"、"RegisterVisitorTest",并为我填写表格。但是,如果我使用 mvn install
和 运行 创建一个 jar,它作为
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
其中 `%junit_path% 包含对 junit.jar 和 hamcrest.jar 的引用,它确实进入 main 并打印 "in RunTest.main",但它实际上并不 运行 测试。好消息是我也没有收到错误。
但是,当我 运行 它直接作为 JUnitCore 运行ner 从命令行使用:
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
我得到以下输出:
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
令我困扰的是,当我从 运行 它 运行 时它 运行 没问题,但是当我 运行 主从命令行,当我直接 运行 测试时它失败了。在我的 Maven 项目中,我确实有一些红线,但大多数时候这似乎并不重要......
无论如何,这似乎归结为上面提到的 WebDriverEventListener,但如果我尝试添加 WebDriverEventListener,它显然可以找到依赖项并自动添加正确的导入语句,尽管如果我再做一次,这不会改变结果mvn install
.
我是不是漏掉了什么?
编辑:尽管在其他 SO 问题中发现 'class not found',但它不是提到的 hadoop 问题的副本,因为我设置了正确的环境变量。
我可以 运行 其他 JAR,只是这个不行。
已通过使用 Maven 程序集插件包含所有依赖项解决。
MWE(尝试):
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();
}
}
这个异常非常简单:class路径 缺少一些东西。 java 无法找到 org/openqa/selenium...
class.
并且您的所有设置都提到了 junit、hamcrest ……但没有提到 selenium。
长话短说:您的 IDE 可能会在您不注意的情况下将硒罐添加到 class 路径。但是当 you 运行 命令行上的东西时,你需要提供 all 需要的元素。缺少硒。可能还有您的 自己的 class。
我正在编写一个程序来自动执行访客注册,使用 selenide (4.4.x) 和 junit (4.12)。如果我 运行 将测试 运行 作为 IDE 中的 JUnit 测试,测试 运行 很好,但为了更方便的使用,我想 运行 它来自 main/commandline .
我设法让它与 IntelliJ 运行 配置一起工作,但是当我从命令行尝试同样的事情时却不行。基本上,我有一个启动和停止 Selenium/ide WebDriver 的抽象 class,一个包含实际预订逻辑的具体测试 class (RegisterVisitorTest.java
),以及 RunTest.java
使用 main
方法。请参阅下面的 MWE(删除不相关的代码,因此它可能无法执行)。
如果我创建一个 IntelliJ 运行 配置:
-Dselenide.browser=chrome -Dwebdriver.chrome.driver="C:\downloads\chromedriver.exe" -DlastName="Peeters" -DfirstDay="5-5-2017"
作为 VM 选项,然后它执行得非常好并打印 "in RunTest.main"、"RegisterVisitorTest",并为我填写表格。但是,如果我使用 mvn install
和 运行 创建一个 jar,它作为
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
其中 `%junit_path% 包含对 junit.jar 和 hamcrest.jar 的引用,它确实进入 main 并打印 "in RunTest.main",但它实际上并不 运行 测试。好消息是我也没有收到错误。
但是,当我 运行 它直接作为 JUnitCore 运行ner 从命令行使用:
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
我得到以下输出:
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
令我困扰的是,当我从 运行 它 运行 时它 运行 没问题,但是当我 运行 主从命令行,当我直接 运行 测试时它失败了。在我的 Maven 项目中,我确实有一些红线,但大多数时候这似乎并不重要......
无论如何,这似乎归结为上面提到的 WebDriverEventListener,但如果我尝试添加 WebDriverEventListener,它显然可以找到依赖项并自动添加正确的导入语句,尽管如果我再做一次,这不会改变结果mvn install
.
我是不是漏掉了什么?
编辑:尽管在其他 SO 问题中发现 'class not found',但它不是提到的 hadoop 问题的副本,因为我设置了正确的环境变量。
我可以 运行 其他 JAR,只是这个不行。
已通过使用 Maven 程序集插件包含所有依赖项解决。
MWE(尝试):
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();
}
}
这个异常非常简单:class路径 缺少一些东西。 java 无法找到 org/openqa/selenium...
class.
并且您的所有设置都提到了 junit、hamcrest ……但没有提到 selenium。
长话短说:您的 IDE 可能会在您不注意的情况下将硒罐添加到 class 路径。但是当 you 运行 命令行上的东西时,你需要提供 all 需要的元素。缺少硒。可能还有您的 自己的 class。