Maven项目崩溃,没有堆栈跟踪或具有Selenium依赖关系的日志消息

时间:2017-01-24 00:28:00

标签: java maven selenium noclassdeffounderror dependency-management

我确定我在这里使用依赖关系管理做错了什么,但是无法解决这个问题。

My Maven项目" A"取决于项目" B" (gradle管理项目)。两者都是" A"和" B"对于UI自动化,也依赖于Selenium。 " B"是一些硒加工库的集合。 selenium webDriver对象在项目B中初始化并返回到A,如下所示:

项目A中的某些课程

public WebDriver myDriver;
myDriver = B.initializeWebDriver(myDriver, various selenium related parameters...);

然后" A"可以在testNG测试中使用初始化的myDriver对象。 它崩溃的地方" B"没有堆栈跟踪是:

项目B中的initializeWebDriver方法

public WebDriver initializeWebDriver(WebDriver webDriver, ...) {
    webDriver =  new RemoteWebDriver(new URL(url), cap); // <-- crashes here
    return webDriver
}

我会想到&#34; A&#34;和&#34; B&#34;只需要依赖&#34; selenium-java&#34;。这就是&#34; B&#34;具有作为selenium依赖关系,并且可以创建驱动程序并在项目B中完全包含的各种单元测试中使用它。如果项目A依赖于selenium-java,并且我从A运行测试,那么Java立即结束testNG测试当它到达&#34; B&#34;实例化remoteWebDriver。 A和B都有一个try-catch,没有任何事情发生过。没有堆栈跟踪。没有日志消息。只是立即死在A中的测试方法内部,而不是跳到“赶上”,但最后跳到了“最后”。并结束。

是什么让我非常肯定它是一个依赖管理问题,如果我改变依赖关系&#34; A&#34;到selenium-api和selenium-chrome-driver和selenium-remote-driver,它工作正常。但我们不应该这样做 - selenium-java应该没问题,selenium-java反正包含其他对象(selenium-api等)!我猜测它有一些奇怪的CLASSDEF问题而且我没有正确地进行依赖管理。我也从来没有见过java只是公然放弃没有堆栈跟踪或这样的错误,除非它是一些非常奇怪的classdef事情。

有什么想法吗?

**

[编辑:按要求提供附加代码]

来自B:

public WebDriver getWebDriver(WebDriver webDriver,...) {                

    try {

        System.out.println("inside B try");
        webDriver =  new RemoteWebDriver(new URL(hubUrl), cap);         
        System.out.println("B instantiated webdriver");

     } catch (Exception e) {
            System.out.println("Caught in B");
            e.printStackTrace();

     }

    return webDriver;
}

来自A的课程:

try {

    System.out.println("inside A try");
    webDriver = B.getWebDriver(webDriver);
    System.out.println("webdriver A successful");

} catch (Exception e) {

      System.out.println("caught in A");
      e.printStackTrace();

} finally {
    closeBrowser(webDriver);
}

此处的输出是:

inside A try
inside B try
then output from the closeBrowser routine from the 'finally' in A.

没有任何例外或任何被抓住的证据。一旦它到达B中的线来创建remoteWebDriver,它就会以某种方式在没有输出的情况下死亡,然后转到最终的#39;在A。

编辑:解决了问题,我有gradle项目&#39; B&#39;确保它在为项目B导出的.jar中包含了selenium依赖项:

from sourceSets.main.output
from sourceSets.main.allJava

...在Maven项目A中,我定义了对selenium-java的依赖(删除了所有其他各种硒罐,如selenium-api等,因为现在可以工作)作为范围:提供。。因此,确保selenium-java依赖实际上是从项目&#39; B&#39;中真正获得的。

但我不明白为什么我不能让A和B都依赖于selenium-java。他们指的是完全相同的版本,我查看了依赖项解析,他们都使用了相同的版本,而不是因为某种冲突而使用不同的版本。

[编辑]

项目A的POM文件中列出的依赖关系的顺序是使它工作的顺序,而不是gradle更改或提供的&#39;更改。只需在项目B之前的pom中首先列出selenium-java。

1 个答案:

答案 0 :(得分:0)

我不知道你为什么没有得到一个堆栈跟踪。也许您正在使用closeBrowser方法终止该计划?这会使错误短路,并解释为什么你没有得到未捕获的异常堆栈跟踪。

无论如何,出于调试目的,请尝试以下操作:

您正在捕捉Exception,因此Error被忽略。 将try-catch更改为捕获Throwable。这将确保您捕获任何可能的错误。

try{
    ...
 } catch (Throwable e) {
     System.out.println("caught in A");
     e.printStackTrace();
 }