我正在使用Selenium + TestNG執行我的測試用例。我的測試用例分佈在多個類中。我想在每個班級都使用同一份webDriver。 (我不想每次登錄,然後做其他操作,所以選擇調用單獨的瀏覽器每個類都不見了)。 要解決這個問題,現在我正在使用靜態webdriver對象繼承。但在並行模式下使用硒網格時,它不起作用,因爲它使用相同的對象。你能告訴我一種方式,我可以與多個類共享對象或爲了在每個「測試」(就像我爲每個測試運行單獨的Java程序)上創建一個不同的靜態實例。TestNG,Selenium如何在多個類中共享對象
回答
當前,您正在跨各種類/測試使用webdriver對象的靜態引用。因此,有一個驅動程序實例正在修改代碼中的靜態資源。但是當你使用網格時,你會爲每個節點創建不同的驅動程序實例。這些驅動程序將並行運行,並將訪問共享資源(靜態變量等),同時更改並覆蓋其他驅動程序實例所做的更改,這些更改會導致問題。
編寫代碼,使資源不共享(最小使用靜態)。嘗試將您的驅動程序實例傳遞給方法,以確保所需的驅動程序僅執行那段代碼。
感謝Vishal,但這不是解決方案。我知道代碼需要寫成不共享資源的方式(即沒有靜態變量)。我想要一種技術實現的方式。 我實現了通過一個類傳遞給另一個類的參數,但這樣我必須通過java代碼傳遞對象,我不能通過testng來完成。如果你知道一種方法,請求你分享。 –
以下是我如何實施解決方案。
我有一個對象myObj,它裏面有webDriver對象,還有更多的東西。我創建了靜態對象myObj的靜態數組。它是這樣的
//有WebDriver實現的類的一部分。 WebDriver不是靜態的btw。
private static MyClass[] ObjectArr = new MyClass[100];
public static MyClass getInstance(Integer id){
id = (id==null)? 0 : id;
if(ObjectArr[id] == null){
ObjectArr[id] = new MyClass();
}
return ObjectArr[id];
}
現在,當我想在我的testng類中使用它時,我這樣做。
public class x{
MyClass i;
@BeforeClass
@Parameters("instanceId")
public void getInstance(@Optional String instanceId){
i = MyClass.getInstance(Integer.parseInt(instanceId));
}
}
這裏是我的testng.xml的樣子。
<test name="FireFox" preserve-order="true">
<parameter name="instanceId" value="1" />
<parameter name="browser" value="firefox" />
<classes>
<class name="com.app.Login"/>
</classes>
</test>
<test name="Chrome" preserve-order="true">
<parameter name="instanceId" value="2" />
<parameter name="browser" value="chrome" />
<classes>
<class name="com.app.Login"/>
</classes>
</test>
這工作完全對我來說硒電網並聯和正常的方式。
我們的努力與我們的測試工作類似的情況。我們還希望利用TestNG並行化和Selenium Web驅動程序。不幸的是,在啓用任何TestNG並行模式時,管理每個測試類中的Web驅動程序生命週期或試圖使用持有Web驅動程序的靜態類都不奏效。即。 parallel="tests|classes|methods"
。使用主動TestNG線程和實例化的Web驅動程序來匹配正在測試的類和方法在工作時很難應付。我們花費更多的時間來搞清楚網絡驅動程序的生命週期,而不是進行真正的Web應用程序測試。我們找到了更好的方法。我們有一個開源項目,爲TestNG/Selenium測試抽象出Web驅動程序生命週期管理。它正確地支持每種TestNG並行模式,爲每個被測試的測試類方法提供正確和有效的Web驅動程序。這對我們的測試工作幫助很大。也許它也可以用於你的情況。或者如果沒有其他的東西給你一個關於你如何解決它的想法。該項目已在GitHub上發佈,名稱爲Concurrent Selenium TestNG (COSENG)。親切的問候。
我遇到了類似的問題。這是我做的。
假設:說B類測試依賴於A類實例。
@AfterClass(alwaysRun = true)
public void insertValueIntoAttribute(ITestContext ctx) {
ctx.setAttribute("INSTANCE_OF_A", this); // from inside class A tests
}
然後在B類中,我檢索A的這個實例並使用它。
@BeforeClass(alwaysRun=true)
@SuppressWarnings("unchecked")
public void fetchData(ITestContext ctx) {
A a = (A) ctx.getAttribute("INSTANCE_OF_A");
}
希望這可以幫助別人。
- 1. 如何在Java中共享類對象?
- 2. 在不同的測試類中共享TestNG設置 - Selenium Java
- 3. MMAP共享多個對象
- 4. 多處理共享對象中的共享對象
- 5. 在使用Selenium,TestNG和Cucumber-JVM時共享一個WebDriver實例
- 6. AngularJS - 如何在多個控制器中共享監視對象?
- 7. 在多個進程之間共享共享對象
- 8. C++在多個進程之間共享單個類對象
- 9. 如何在多個對象之間共享一個值? C#
- 10. 在C++中如何在同一個類對象內共享公共元素。
- 11. 如何在共享內存中得到共享對象
- 12. 如何在共享對象庫中共享變量
- 13. 如何在多個片段之間共享MediaPlayer對象?
- 14. 如何在幾個類之間共享對象
- 15. 組間共享多少個對象?
- 16. 跨多個網格對象共享VBO
- 17. 多個JInternalFrame之間的共享對象
- 18. OLE:爲多個OLE對象共享IStorage?
- 19. 在共享對象
- 20. 通過幾個類共享對象
- 21. 如何從一個共享對象
- 22. 在php中共享對象
- 23. 在堆中共享對象
- 24. 如何與多個Scalatest套件共享一個對象?
- 25. 鏈接到另一個共享對象的共享對象
- 26. 如何在多進程中共享大對象?
- 27. 如何在多個操作中共享一個對象的單個實例?
- 28. 如何在類和活動中共享對象和變量
- 29. 共享對象
- 30. 如何在多個portlet中共享jar?
不明確。你想有一個單一的瀏覽器實例嗎?如果那麼你想在網格中做什麼?您可以使用網格在多個節點上運行多個實體 – Shamik
然後,您沒有正確使用TestNg。只需使用testng.xml並行運行測試,就不需要共享同一個對象,或者爲此繼承這些類。 – Manu