0

我正在使用 Selenium WebDriver 和 Testng(使用 .xml 文件开始)来测试使用多个浏览器的站点。

我正在尝试创建一个方法,该方法将从 xml 文件中获取参数,并使用 IF 语句检测浏览器,创建相关驱动程序并返回它。

我遇到的麻烦是当我尝试将参数传递给方法时。例如,如果我通过“Chrome”,IF 语句可以正常工作并创建驱动程序。但是,如果我使用参数本身,则不会创建驱动程序,并且在第一次使用时测试会失败。

这是我正在使用的设置代码:

@Parameters ({"driver_property_value","driver_property_location","browser"})
@BeforeClass
public void setUp(String driverPropertyValue, String driverPropertyLocation, String browser) throws Exception {
    Setup setup = new Setup();

    //set properties
    System.setProperty(setup.driverPropertyValue(driverPropertyValue),setup.driverPropertyLocation(driverPropertyLocation));
    driver = setup.driver(browser);
    baseUrl = setup.baseURL();
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}

这就是它的名称:

public WebDriver driver(String browser)
{
    WebDriver value = null;

    if (browser == "chrome")
    {
    value = new ChromeDriver();
    }
    return value;
}

这是我用来运行测试并传递参数的 testng xml:

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd">
<suite name = "testng" verbose="1">
<parameter name="driver_property_value" value="webdriver.chrome.driver"/>
<parameter name="driver_property_location" value="C:/chromedriver.exe"/>
<parameter name="browser" value="chrome"/>
<test name="chrome_tests">
    <packages>
        <package name="com.LoginPage"/>
    </packages>
</test>

第一个设置似乎工作正常,只是驱动程序选择在使用参数时似乎不起作用。

任何帮助或建议将不胜感激。

谢谢

ps这是一个失败的跟踪,不确定它是否有帮助。

java.lang.NullPointerException
at com.LoginPage.Login_Logout.setUp(Login_Logout.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:543)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:212)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138)
at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:175)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:107)
at org.testng.TestRunner.privateRun(TestRunner.java:753)
at org.testng.TestRunner.run(TestRunner.java:613)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1137)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1062)
at org.testng.TestNG.run(TestNG.java:974)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:109)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:202)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:173)
4

1 回答 1

1

不要使用引用相等运算符==来比较Strings。使用equalsequalsIgnoreCase

引用相等运算符检查两个操作数是否引用对象的同一实例。对于字符串和许多对象类型,这很少会像您期望的那样工作。

表达式browser == "chrome"解析为 false,因为即使browser变量具有值"chrome",它也很可能是表示 的字符串的不同实例"chrome"。有关这意味着什么的更多详细信息,请参阅此问题

因此,当该表达式解析为 false 时,driver返回 a null,您setUp可以愉快地使用它,就好像它是一个有效的对象实例一样,从而导致NullPointerException.

将您的比较更改为:

if (browser.equals("chrome")) {
   value = new ChromeDriver();
}

该声明有几种变体。您可以使用equalsIgnoreCase匹配"chrome"字符大小写的任意组合,并且可以颠倒文字"chrome"browser局部变量的顺序。如果作为参数传入,这将防止 aNullPointerException在该行上发生。nullbrowser

if ("chrome".equalsIgnoreCase(browser)) {
   value = new ChromeDriver();
}
于 2012-06-26T18:50:42.250 回答