Сейчас тесты бегают в параллели с одним выбранным браузером. Нужно эти же тесты запускать в нескольких браузерах одновременно.
Для этого был создан класс для унаследования, с desired capabilities и dataProvider, назовем его RemoteTestBase:
public class RemoteTestBase {
public WebDriver driver;
private static final String SAUCE_ACCESS_KEY = System.getenv("SAUCE_ACCESS_KEY");
private static final String SAUCE_USERNAME = System.getenv("SAUCE_USERNAME");
@BeforeMethod
@DataProvider(name = "browsers", parallel = true)
public static Object[][] sauceBrowserDataProvider(Method testMethod) throws JSONException {
String browsersJSONArrayString = System.getenv("SAUCE_ONDEMAND_BROWSERS");
JSONArray browsersJSONArrayObj = new JSONArray(browsersJSONArrayString);
Object[][] browserObjArray = new Object[browsersJSONArrayObj.length()][3];
for (int i=0; i < browsersJSONArrayObj.length(); i++) {
JSONObject browserObj = (JSONObject)browsersJSONArrayObj.getJSONObject(i);
browserObjArray[i] = new Object[]{browserObj.getString("browser"), browserObj.getString("browser- version"), browserObj.getString("os")};
}
return browserObjArray;
}
void createRemoteDriver(String browser, String version, String os, String methodName) throws Exception
{
DesiredCapabilities capabilities = new DesiredCapabilities();
Class<? extends RemoteTestBase> SLclass = this.getClass();
capabilities.setCapability("browserName", browser);
if (version != null) {
capabilities.setCapability("browser-version", version);
}
capabilities.setCapability("platform", os);
capabilities.setCapability("name", SLclass.getSimpleName());
capabilities.setCapability("tunnelIdentifier", "***");
driver = (new RemoteWebDriver(new URL("http://" + SAUCE_USERNAME + ":" + SAUCE_ACCESS_KEY+
"@ondemand.saucelabs.com:80/wd/hub"), capabilities));
randomuser = new RandomDataSelect();
configRead = new ConfigFileReader();
propertyRead = new PropertyLoader();
baseUrl = propertyRead.getProperty("site.url");
getURL();
}
@AfterMethod(description = "Throw the test execution results into saucelabs")
public void tearDown(ITestResult result) throws Exception {
((JavascriptExecutor) driver).executeScript("sauce:job-result=" + (result.isSuccess() ? "passed" : "failed"));
printSessionId();
driver.quit(); }
void annotate (String text) {
((JavaScriptExecutor) driver).executeScript(script "sauce:context="+ text); } }
Сам тестовый класс выглядит как:
public class Login extends RemoteTestBase {
@Test (dataProvider = "browsers")
public void LoginTest(String browser, String version, String os, Method method) throws Exception {
this.createRemoteDriver(browser, version, os, method.getName());
Application app = new Application (driver);
app.login().login_as(configRead.getUsername, configRead.getPassword)
}
При запуске данного теста в Saucelabs, в 2-х браузерах параллельно, происходит то, что оба теста якобы используют один инстанс app. И один из тестов - получает двойной ввод в поле логин-пароль, когда второй падает, не получая никакого ввода.
Помогите разобраться в чем же проблема.
Работаю на джава, с селениум вебдрайвер, testng, maven