Проблема заключается в настройке возможности использования кросс браузерного и кросс ОП тестирования в одной Дженкинс job.
Я попытался сделать через desired capabilities, но в случае с запуском тестов с одной Джобы в различных браузерах этот вариант не подходит. Далее была попытка настроить значения переменных через создание файла json, где указано следующее -
[
{
"platform":"LINUX",
"os":"Linux",
"browser":"firefox",
"url":"sauce-ondemand:?os=Linux&browser=firefox&browser-version=16",
"browserVersion":"16"
},
{
"platform":"VISTA",
"os":"Windows 2008",
"browser":"iexploreproxy",
"url":"sauce-ondemand:?os=Windows 2008&browser=iexploreproxy&browser-version=9",
"browserVersion":"9"
}
]
Сслались на сауслабс документацию - “the SAUCE_ONDEMAND_BROWSERS environment variable will be populated with a JSON-formatted string containing the attributes of the selected browsers”
Вот, что у меня получилось:
- JSon file с переменными (указан выше)
- Класс, где данные должны передаваться с JSon file в значение строчки:
public class SauceBrowserDataProvider {
public static final String SAUCE_ONDEMAND_BROWSERS = "SAUCE_ONDEMAND_BROWSERS";
@DataProvider(name = "sauceBrowserDataProvider")
public static Iterator<Object[]> sauceBrowserDataProvider(Method testMethod) {
List<Object[]> data = new ArrayList<Object[]>();
//read browsers from JSON-formatted environment variable if specified
String json = SUtils.readPropertyOrEnv(SAUCE_ONDEMAND_BROWSERS, "");
if (json == null || json.equals("")) {
throw new IllegalArgumentException("Unable to find JSON");
}
try {
JsonArray browsers = (JsonArray) new JsonParser().parse(json);
for (Object object : browsers) {
JsonObject jsonObject = (JsonObject) object;
data.add(new Object[]{
jsonObject.get("platform"),
jsonObject.get("os"),
jsonObject.get("browser"),
jsonObject.get("browserVersion")
});
}
} catch (JsonParseException e) {
throw new IllegalArgumentException("Error parsing JSON String", e);
}
return data.iterator();
}
- Базовый тест класс, где выполняется вся логика запуска браузера, ОП через сауслабс:
public class BasicTest {
protected WebDriver driver;
protected static String baseUrl;
protected Application app;
protected ConfigFileReader configRead;
protected PropertyLoader propertyRead;
protected DesiredCapabilities caps;
public Logger Log = Logger.getLogger(BasicTest_Local.class.getName());
public static final String SAUCE_ACCESS_KEY = System.getenv("SAUCE_ACCESS_KEY");
public static final String SAUCE_USERNAME = System.getenv("SAUCE_USERNAME");
@BeforeMethod (description = "Get the browser and site url before the test run")
public void setUp() throws Exception {
Class<? extends BasicTest_Remote> SLclass = this.getClass();
// Start with Jenkins
DesiredCapabilities caps = new DesiredCapabilities();
caps.setBrowserName(System.getenv("SELENIUM_BROWSER"));
caps.setVersion(System.getenv("SELENIUM_VERSION"));
caps.setCapability(CapabilityType.PLATFORM_NAME, System.getenv("SELENIUM_PLATFORM"));
caps.setCapability("seleniumVersion", "3.8.1");
caps.setCapability("name", SLclass.getSimpleName());
caps.setCapability("screenResolution", "1920x1080");
driver = (new RemoteWebDriver(new URL("http://" + SAUCE_USERNAME + ":" + SAUCE_ACCESS_KEY + "@ondemand.saucelabs.com:80/wd/hub"), caps));
configRead = new ConfigFileReader();
propertyRead = new PropertyLoader();
baseUrl = propertyRead.getProperty("site.url");
app = new Application(driver);
Не могу разобраться как использовать sauce_ondemand_browsers в базовом классе, что-бы Дженкинс передавал в нее параметры браузера и ОП, заданные в Jenkins job.