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