1

我敢肯定我在这里做错了依赖管理,但不能完全弄清楚。Maven项目崩溃,没有堆栈跟踪或日志消息与硒依赖

我的Maven项目“A”依赖于项目“B”(一个Gradle托管项目)。 “A”和“B”都对Selenium的UI自动化有依赖性。 “B”是一些硒处理库的集合。硒的webdriver对象是在项目乙初始化并返回到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 
} 

我本来认为“A”和“B”将只需要对“selenium-java”有依赖性。这就是所有“B”都具有硒依赖性,并且可以创建驱动程序,并将其用于完全包含在项目B中的各种单元测试。如果项目A依赖于selenium-java,并且我从A运行测试,那么Java当它到达实例化remoteWebDriver的“B”中的代码行时立即结束testNG测试。我在A和B都有try-catch,并且什么都没有发生。没有堆栈跟踪。没有日志消息。只是立即死于A中的测试方法,而不是跳到'catch',而是跳到'finally'并结束。

是什么让我非常确定它是一个依赖管理问题,如果我将“A”的依赖关系更改为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; 
} 

从类中所述的:

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中创建远程Web驱动程序,它就会以某种方式死在没有输出的情况下,然后进入A中的'finally'。

编辑:修复了问题, B'确保它包括硒的依赖性。坛子里有人出口项目B:

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

...在Maven项目A,我定义硒的Java的依赖(删除了所有其他各种硒罐硒等-API等,因为这现在工作)作为范围:提供。。所以它确保selenium-java依赖实际上是真正从项目'B'获得的。

但我不明白为什么我不能让A和B都依赖于硒-java。他们指定了完全相同的版本,我查看了依赖关系解决方案,他们都使用相同的版本,而不是使用不同的版本,这是由于某种类型的冲突。

[编辑]

项目A的POM文件中列出的依赖的顺序是什么使得它的工作,而不是变化的gradle或“提供”的变化。在项目B之前简单地列出selenium-java。

+2

你试试抓住'Throwable'吗?你能用try-catch-finally来显示代码吗? – alexbt

+0

我没有试图抛出,但有证据表明它不会被捕获。这是代码/输出: – borisivan

+0

其中是代码/输出? – alexbt

回答

0

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

不管怎样,对于调试目的,请尝试以下操作:

您正赶上Exception,所以Error s的忽略。 更改您的try-catch以捕获Throwable。这将确保您捕捉到任何可能的错误。

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

谢谢alexbt!这很有帮助。 Upvoted,但我也是堆栈溢出的新手,因此它可能不会显示。 – borisivan

相关问题