我将@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] -------------------------------------
您的数据提供程序有一个额外的逗号,
@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的方式。我遇到了同样的问题,找不到使
我正在探索硒网格,用于在多个浏览器上执行测试。我已经按照在线教程配置了集线器和节点。我已经创建了一个测试脚本。 这是测试脚本的代码: 我的目标是在多个浏览器上运行此测试,我已经添加了所需的功能,如火狐, 感谢任何帮助