簡體   English   中英

TestNG,Selenium如何在多個類之間共享對象

[英]TestNG, Selenium How to share object among multiple Classes

我正在使用Selenium + TestNG執行我的測試用例。 我的測試用例分布在多個類中。 我想在每個類中使用webDriver的相同副本。 (我不想每次都登錄然后再做其他操作,所以選擇調用單獨的瀏覽器,每個類都消失了)。 為了解決這個問題,我現在正在使用繼承與靜態webdriver對象。 但是當使用具有並行模式的selenium網格時,它不起作用,因為它使用相同的對象。 你能告訴我一個方法,我可以用多個類共享對象或者在每個“測試”上創建一個不同的靜態實例(就像我為每個測試運行單獨的Java程序一樣)。

目前,您正在跨各種類/測試使用webdriver對象的靜態引用。 因此,有一個驅動程序實例正在修改代碼中的靜態資源。 但是當你進入網格時,你將為每個節點創建不同的驅動程序實例。 這些驅動程序將並行運行,並將訪問共享資源(靜態變量等),同時更改和覆蓋其他驅動程序實例所做的更改,這些更改將導致問題。

編寫代碼,以便不共享資源(最少使用靜態)。 嘗試將驅動程序實例傳遞給方法,以確保所需的驅動程序僅執行該段代碼。

以下是我實施解決方案的方法。

我有一個對象myObj,其中包含webDriver對象以及更多內容。 我創建了靜態對象myObj的靜態數組。 就像這樣

//在其中實現WebDriver的類的一部分。 WebDriver不是靜態順便說一句。

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> 

對於我來說,這對於我來說是平行和正常的硒網格。

我遇到了類似的問題。 這就是我做的。

假設:說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");
}

希望這有助於某人。

我們在測試工作中遇到了類似的情況。 我們還希望利用TestNG並行化和Selenium Web驅動程序。 遺憾的是,在啟用任何TestNG並行模式時,管理每個測試類中的Web驅動程序生命周期或嘗試使用保存Web驅動程序的靜態類都無效。 即。 parallel="tests|classes|methods" 使用活動的TestNG線程和實例化的Web驅動程序匹配測試的類和方法在它工作時很難實現。 我們花費更多時間來確定網絡驅動程序生命周期,而不是參加真正的Web應用程序測試。 我們找到了更好的方法。 我們有一個開源項目,它抽象了TestNG / Selenium測試的Web驅動程序生命周期管理。 它適當地支持每個TestNG並行模式,為每個測試的測試類方法提供正確和活動的Web驅動程序。 它對我們的測試工作有很大幫助。 也許它也適用於您的情況。 或者,如果沒有別的東西讓你知道如何以不同的方式解決它。 該項目已在GitHub上作為Concurrent Selenium TestNG(COSENG)完成 親切的問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM