【问题标题】:Able to run JUnitCore test runner from IntelliJ run config, but not form commandline能够从 IntelliJ 运行配置运行 JUnitCore 测试运行程序,但不能从命令行运行
【发布时间】:2017-05-05 16:09:33
【问题描述】:

我正在编写一个程序来自动化访客注册,使用 selenide (4.4.x) 和 junit (4.12)。如果我在 IDE 中将它们作为 JUnit 测试运行,这些测试运行良好,但为了更方便的使用,我想从主/命令行运行它。

我设法让它与 IntelliJ 运行配置一起工作,但当我从命令行尝试相同的事情时却没有。基本上,我有一个启动和停止 Selenium/ide WebDriver 的抽象类,一个包含实际保留逻辑的具体测试类 (RegisterVisitorTest.java),以及带有 main 方法的 RunTest.java。请参阅下面的 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 运行程序运行它时:

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

让我困扰的是,当我从 IDE 运行它时它运行良好,但是当我从命令行运行 main 时它不会触发测试,而当我直接运行测试时它会失败。在我的 Maven 项目中,我确实有许多红线,但这似乎并不重要……

无论如何,这似乎归结为上面提到的那个 WebDriverEventListener,但是如果我尝试添加一个 WebDriverEventListener,它显然可以找到依赖项并自动添加正确的导入语句,尽管如果我再做一个 @987654330 这不会改变结果@。

我错过了什么吗?

编辑:虽然在其他 SO 问题中找到了“找不到类”,但它不是提到的 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();
    }
}

【问题讨论】:

标签: java selenium intellij-idea junit selenide


【解决方案1】:

这个异常非常简单:类路径 缺少一些东西。 java 找不到那个org/openqa/selenium... 类。

您的所有设置都提到了 junit、hamcrest ......但没有提到 selenium。

长话短说:您的 IDE 可能会在您没有注意到的情况下将 selenium jar 添加到类路径中。但是当在命令行上运行时,你需要提供所有需要的元素。硒缺失。也可能是你的自己的类。

【讨论】:

  • 谢谢!我自己的课程没有丢失,因为它们都在目标 jar 中;)。让我发疯的是,它开始于 junit 丢失,然后是 hamcrest,然后......我认为 Maven 会处理所有这些。我使用 Maven 程序集插件解决了这个问题,创建了一个带有依赖项的 jar,现在我可以运行主类了。
猜你喜欢
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多