Выполнение Selenium в нескольких браузерах с @DataProvider возвращает исключение NullPointerException - PullRequest
0 голосов
/ 06 июля 2018

Я использую @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] -------------------------------------

Ответы [ 2 ]

0 голосов
/ 10 июля 2018

Просто отредактируйте значение для аннотации @Test:

@Test (groups = {"HappyPath"}, dataProvider = "hardCodedBrowsers")//you should add data provider
public void Login(String browser, String version, String os, Method method) {
//and add initialization for some browser
    this.createDriver(browser, version, os, method.getName());// you missed this init
    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");

    }
0 голосов
/ 06 июля 2018

Ваш DataProvider имеет дополнительную запятую,

@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"}, //no need of comma for the last value           
};}

Попробуйте, я удалил эту запятую, и она работает

 @DataProvider(name = "hardCodedBrowsers", parallel = true)
 public static Object[][] sauceBrowserDataProvider(Method testMethod) {
        return new Object[][]{              
        {"firefox", "55.0", "Windows 10"},                
        {"chrome", "65.0", "Windows 10"}                
};}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...