Web-driver + TestNG フレームワークを使用した以下のシナリオのサンプル コードを教えてください。
複数のテストを持つ 1 つのクラス。これらのテストを実行している間、一度に同じブラウザー (例: Firefox) の複数のインスタンスですべてのテストを並行して実行する必要があります。したがって、テストごとに、ブラウザーの新しいインスタンスを開く必要があります。
これまでの私の解決策は次のようなものでした:
public MyTestClass {
SupportedBrowser browser;
private static ThreadLocal<WebDriver> threadLocalDriver = new ThreadLocal<WebDriver>();
@DataProvider (name = "getBrowsers")
public Object[][] getBrowsers {
return Object[][] {
{
SupportedBrowser.FIREFOX;
},
{
SupportedBrowser.CHROME;
}
};
}
@Factory (dataProvider = "getBrowsers")
public MyTestClass(SupportedBrowser browser) {
this.browser = browser;
}
@BeforeMethod
public void setup()
{
threadLocalDriver.set(browser.getDriver());
}
@Test
public void test1()
{
WebDriver driver = threadLocalDriver.get();
//do stuff
}
@AfterMethod
public void tearDown()
{
WebDriver driver = threadLocalDriver.get();
driver.quit();
}
}
ここに私の列挙型があります:
public enum SupportedBrowser {
FIREFOX, CHROME; //add more as needed
public getDriver() {
if(this == SupportedBrowser.FIREFOX) {
return new RemoteDriver(hubAddress, DesiredCapabilities.firefox()); //alternatively could be new FirefoxDriver()
}
else {
return new RemoteDriver(hubAddress, DesiredCapabilities.chrome());
}
}
}
悪いコード規則を許してください。私はこれを IDE で書いたわけではありません (私はこのようなものを使用しましたが、動作します)。クラスは、異なるブラウザーごとに 1 回実行されます。各メソッドには独自の独立したドライバーがあり、テストを同時に実行できるようにします。また、テストメソッドを異なる引数で複数回実行する必要がある場合に備えて、各メソッドが独自の DataProvider を取ることもできます。また、testng.xml ファイルで parallel 属性が「メソッド」レベルに設定されていることを確認してください。
私のコードの唯一の問題は、テストが失敗した場合にドライバーが終了することを確認することです。現在、このメソッドは、失敗したテストをセレン グリッドまで閉じたままにします (-timeout を使用)。私の質問を参照してください: @BeforeMethod と @AfterMethod の間でドライバーを共有する TestNG。
編集:スレッド全体でドライバーを共有するコードに ThreadLocal 変数を追加したので、@AfterMethod で driver.quit() を呼び出すことができます。