Я использую @dataprovider для проекта Selenium on Java и TestNg, в частности, для класса TestBase, который реализует желаемые возможности соуса.
Меня беспокоит то, что этот код возвращает ошибку «NullPointerException», поскольку значения поставщика данных никогда не принимаются.
Может ли кто-нибудь указать, что не так с моим кодом (используя тот же код, что и в примере: https://github.com/saucelabs-sample-test-frameworks/Java-TestNG-Selenium/blob/master/src/test/java/com/yourcompany/Tests/TestBase.java)
public class TestBase {
protected WebDriver driver;
protected static String baseUrl;
protected Application app;
protected ConfigFileReader configRead;
protected PropertyLoader propertyRead;
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");
private ThreadLocal<WebDriver> webDriver = new ThreadLocal<WebDriver>();
@DataProvider(name = "hardCodedBrowsers", parallel = true)
public static Object[][] sauceBrowserDataProvider(Method testMethod) {
return new Object[][]{
new Object[]{"firefox", "55.0", "Windows 10"},
new Object[]{"chrome", "65.0", "Windows 10"},
};}
public void createDriver(String browser, String version, String os, String methodName)
throws Exception, MalformedURLException, UnexpectedException {
Class<? extends TestBase> SLclass = this.getClass();
DesiredCapabilities capabilities = new DesiredCapabilities();
// set desired capabilities to launch appropriate browser on Sauce
capabilities.setCapability(CapabilityType.BROWSER_NAME, browser);
capabilities.setCapability(CapabilityType.VERSION, version);
capabilities.setCapability(CapabilityType.PLATFORM_NAME, os);
System.out.println(CapabilityType.PLATFORM_NAME + CapabilityType.VERSION + CapabilityType.PLATFORM_NAME);
capabilities.setCapability("seleniumVersion", "3.8.1");
capabilities.setCapability("name", SLclass.getSimpleName());
capabilities.setCapability("screenResolution", "1920x1080");
this.webDriver.set(new RemoteWebDriver(new URL("http://" + SAUCE_USERNAME + ":" + SAUCE_ACCESS_KEY + "@ondemand.saucelabs.com:80/wd/hub"), capabilities));
configRead = new ConfigFileReader();
propertyRead = new PropertyLoader();
baseUrl = propertyRead.getProperty("site.url");
app = new Application(driver);
getURL();
}
private void getURL () {
driver.get(baseUrl);
driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);
Log.info("Open a site URL");
}
@AfterMethod(description = "Throw the test execution results into saucelabs")
public void afterMethod(ITestResult result) throws Exception {
((JavascriptExecutor) driver).executeScript("sauce:job-result=" + (result.isSuccess() ? "passed" : "failed"));
driver.quit();
}
}
К вашему сведению: я пытался добавить аннотацию @Test с именем поставщика данных перед методом createDriver:
@ Test (DataProvider = "имя")
public void createDriver (строковый браузер, строковая версия, строковая операционная система, строковое имя-метода)
но этот подход только открывает браузеры и URL сайта (baseURL), но никогда не идет в тестовый класс ("Логин"), который расширяет класс TestBase:
public class Login_and_CreateOrder extends TestBase {
@Test (groups = {"HappyPath"})
public void Login() {
app.homePage().homePageDisplayed();
Log.info("Validate Home Page");
app.loginPage().Login_as(
configRead.getUserName2(),configRead.getPassword());
Log.info("Login as user");
assertTrue(app.loginPage().welcomeMessage.getText().contains("Hello"),
"Validate user's login.Display Welcome message");
}
}
Дополнительный XML-файл
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Tests Suite" verbose="2" parallel="methods" thread-count="2">
<test name="SmokeRunTests" parallel="methods" thread-count="2">
<classes>
<class name="com.****.tests.Login"/>
</classes>
</test>
Ошибка:
[ERROR] Tests run: 2, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 4.448
s <<< FAILURE! - in TestSuite
[ERROR] Login(com.****.tests.Login) Time elapsed: 0.365 s <<< FAILURE!
java.lang.NullPointerException
at com.****.tests.Login.Login(Login.java:13)
[ERROR] afterMethod(com.****.tests.Login) Time elapsed: 0.455 s <<<
FAILURE!
java.lang.NullPointerException
[INFO]
[INFO] Results:
[INFO]
[ERROR] Failures:
[ERROR] Login.Login:13 NullPointer
[ERROR] Login.TestBase.afterMethod:95 » NullPointer
[INFO]
[ERROR] Tests run: 2, Failures: 2, Errors: 0, Skipped: 0
[INFO]
[INFO] ----------------------------------------------------------------------
--
[INFO] BUILD FAILURE
[INFO] -------------------------------------