当前位置: 首页 > 知识库问答 >
问题:

使用@DataProvider执行Selenium多浏览器返回NullPointerException

束向荣
2023-03-14

我将@DataProvider用于Selenium on Java and TestNg项目,特别是用于实现saucelabs所需功能的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();
}

}

注意:我尝试在“createdRiver”方法之前添加带有dataprovider名称的@test注释:

@test(dataProvider=“name”)创建的public void River(String browser、String version、String os、String methodName)

  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");

    }
}
<?html" target="_blank">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] -------------------------------------

共有1个答案

萧玮
2023-03-14

您的数据提供程序有一个额外的逗号,

@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"}                
};}
 类似资料:
  • 我想运行和控制一个浏览器窗口从一个web应用程序,以自动化的一些事情(如帐户创建等)在另一个网站。 所以我的问题是,有没有一种方法可以直接从浏览器使用selenium来实现它,在这种情况下如何实现它? 我知道有selenium-webdriver for JS,但在常见的用例中,我们将它与Node.JS一起使用。 WebDriver介绍建议这是可能的: 它的主要目的是允许web作者编写测试,使用户

  • 我目前正在尝试使用Selenium WebDriver(JAVA)2.53和Firefox 43.0执行TOR 6.0.4。我已经按照这篇文章的说明使用Selenium WebDriver和Tor,但在将Tor的profilePath加载到Firefox二进制文件时,我遇到了一个错误。我已经看到可以通过加载TOR配置文件来访问TOR。firefox二进制文件的默认存档,但我得到了一个驱动程序信息:

  • 我目前正在使用testng selenium来自动化我的测试,我有以下场景: 我需要从excel文件中读取数据,转换对象中的每一行,并为每一行运行一个测试。我试图使用annotation@DataProvider返回一个对象数组,但是它只能返回迭代器和对象[]。是否有任何变通方法可用于从数据提供程序返回客户机对象数组?我尝试了以下代码,但它只打印来自Client2的数据: 编辑1:客户类别: 在控

  • 我正在帮助建立一个自动化框架来测试我们的网站。由于测试用例必须运行在Chrome、Firefox和IE上,我们目前正在传递一个WebDriver对象作为我们的驱动程序。这个对象实际上是ChromeDriver、FirefoxDriver或InternetExplorerDriver(视情况而定)。 这似乎行不通--至少,我不能将ChromeDriver分配给SpecialDriver,因为Chro

  • 问题内容: 我有一种创建2个远程Web驱动程序的方法。一个带有chrome,另一个带有Firefox: Driver.cs 然后我有一个Test类: } 问题是当Driver.Intialize被调用时,它无法同时运行chrome和firefox。我要发生的是,调用Init方法时,它将启动两个浏览器并在每个浏览器中运行测试方法。 问题答案: 我目前使用NUnit的方式。我遇到了同样的问题,找不到使

  • 我正在探索硒网格,用于在多个浏览器上执行测试。我已经按照在线教程配置了集线器和节点。我已经创建了一个测试脚本。 这是测试脚本的代码: 我的目标是在多个浏览器上运行此测试,我已经添加了所需的功能,如火狐, 感谢任何帮助