【问题标题】:Selenium/Testng - IF statement not working when using parameter from testng.xmlSelenium/Testng - 使用 testng.xml 中的参数时,IF 语句不起作用
【发布时间】:2012-06-26 15:37:18
【问题描述】:

我正在使用 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>

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

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

谢谢

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

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)

【问题讨论】:

标签: java selenium testng selenium-chromedriver


【解决方案1】:

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

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

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

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

将您的比较改为:

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

此声明有多种变体。您可以使用equalsIgnoreCase 匹配"chrome" 的任意字符大小写组合,并且可以颠倒文字"chrome"browser 局部变量的顺序。如果 null 作为 browser 参数传入,则这样做可以防止在该行上出现 NullPointerException

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

【讨论】:

  • 啊,我明白了,所以其他对象正在工作,因为它只是传递对象,这些对象都是具有相同文本的字符串,因此可以工作。一旦IF开始发挥作用,对象就不同并且不匹配。感谢您为我澄清这一点,也感谢您提供背景信息,这对我未来非常有用。
猜你喜欢
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 2012-07-16
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多