我确定我在这里使用依赖关系管理做错了什么,但是无法解决这个问题。
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。
答案 0 :(得分:0)
我不知道你为什么没有得到一个堆栈跟踪。也许您正在使用closeBrowser
方法终止该计划?这会使错误短路,并解释为什么你没有得到未捕获的异常堆栈跟踪。
无论如何,出于调试目的,请尝试以下操作:
您正在捕捉Exception
,因此Error
被忽略。
将try-catch
更改为捕获Throwable
。这将确保您捕获任何可能的错误。
try{
...
} catch (Throwable e) {
System.out.println("caught in A");
e.printStackTrace();
}