gpt4 book ai didi

java - Selenium/Testng - 使用 testng.xml 中的参数时 IF 语句不起作用

转载 作者:行者123 更新时间:2023-12-01 15:19:08 24 4
gpt4 key购买 nike

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

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

表达式 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com