2012-06-26 2 views
0

Я использую Selenium WebDriver с Testng (начал использовать XML-файл) для тестирования сайта с использованием нескольких браузеров.Selenium/Testng - оператор IF не работает при использовании параметра из 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> 

Первая настройка, похоже, работает нормально, это просто выбор драйвера, который, похоже, не работает при использовании параметра.

Любая помощь или совет будут оценены.

С благодарностью

p.s. вот трассировка сбоя, не уверен, поможет ли это или нет.

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) 
+0

Обратитесь к этому вопросу: http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java –

ответ

1

Не используйте ссылку оператор равенства == для сравнения String с. Используйте equals или equalsIgnoreCase.

Оператор равенства ссылок проверяет, что оба операнда относятся к одному экземпляру объекта. С Strings и многими типами объектов это редко будет работать так, как вы ожидаете.

Выражение browser == "chrome" решает ложно, потому что даже если переменная browser имеет значение "chrome", он будет скорее всего, будет отличаться экземпляром строки, представляющей "chrome". Для получения более подробной информации о том, что это значит, обратитесь к this question.

Так что с выражением разрешения на ложь, driver возвращает null, который ваш setUp переходит на использование счастливо, как будто это допустимый экземпляр объекта, в результате чего в NullPointerException.

Измените сравнение с этим:

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

Есть несколько вариантов данного заявления. Вы можете использовать equalsIgnoreCase для соответствия "chrome" в любой комбинации случайных символов, и вы можете отменить порядок буквально "chrome" и локальную переменную browser.Что бы это сделало, так это предотвратить появление NullPointerException в этой строке, если null был принят как параметр browser.

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

А я вижу, так что другие объекты работали, как это было просто передавая объекты, вокруг которых были все строки с одним и тем же текстом, поэтому работали. Как только IF вошел в игру, объекты были разными и не соответствовали друг другу. Спасибо, что поняли, что для меня, а также для справочной информации, это будет действительно полезно для меня в будущем. – user1483193