- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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)
最佳答案
不要使用引用相等运算符==
来比较String
。使用equals
或equalsIgnoreCase
。
引用相等运算符检查两个操作数是否引用对象的同一实例。对于字符串和许多对象类型,这很少会按照您期望的方式工作。
表达式 browser == "chrome"
解析为 false,因为即使 browser
变量的值为 "chrome"
,它也会最有可能是表示“chrome”的字符串的不同实例。有关这意味着什么的更多详细信息,请参阅 this question .
因此,当该表达式解析为 false 时,driver
返回一个 null
,您的 setUp
会继续愉快地使用它,就好像它是一个有效对象一样实例,导致 NullPointerException
。
将您的比较更改为:
if (browser.equals("chrome")) {
value = new ChromeDriver();
}
此声明有多种变体。您可以使用 equalsIgnoreCase
来匹配任意字符大小写组合中的 "chrome"
,并且可以颠倒文字 "chrome"
和浏览器
局部变量。如果 null
作为 browser
参数传入,这样做的作用是防止该行发生 NullPointerException
。
if ("chrome".equalsIgnoreCase(browser)) {
value = new ChromeDriver();
}
关于java - Selenium/Testng - 使用 testng.xml 中的参数时 IF 语句不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11210899/
我是一名优秀的程序员,十分优秀!