2015-04-22 47 views
1

我想將此代碼傳遞給其他類,因此我不必粘貼它。如何成功傳遞此代碼? Java Webdriver TestNg

這是包含代碼的類:

package utility; 

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.testng.annotations.Parameters; 
import org.testng.annotations.Test; 

public class BrowserType { 
    public static WebDriver driver; 

    @Parameters("browser") 
    @Test 
    public static void CallBrowser(String browser) { 

     if(browser.equalsIgnoreCase("firefox")) { 

       driver = new FirefoxDriver(); 

      // If browser is IE, then do this 

      }else if (browser.equalsIgnoreCase("chrome")) { 

       // Here I am setting up the path for my IEDriver 

       {System.setProperty("webdriver.chrome.driver","C:/Users/elsid/Desktop/Eclipse/Selenium/chromedriver.exe");} 
       driver = new ChromeDriver(); 

       driver.get(Constant.URL); 

      } 

    } 
} 

我想通過CallBrowserSetUp這低於:

package automationFramework; 

import java.util.concurrent.TimeUnit; 

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.testng.annotations.AfterMethod; 
import org.testng.annotations.BeforeMethod; 
import org.testng.annotations.Parameters; 
import org.testng.annotations.Test; 

import utility.Constant; 
import appModule.SignIn_Action; 

public class SignIn { 

    public WebDriver driver; 



@BeforeMethod 
@Parameters("browser") 
public void SetUp(String browser) { 

    if(browser.equalsIgnoreCase("firefox")) { 

      driver = new FirefoxDriver(); 

     // If browser is Chrome, then do this 

     }else if (browser.equalsIgnoreCase("chrome")) { 

      { System.setProperty("webdriver.chrome.driver","C:/Users/elsid/Desktop/Eclipse/Selenium/chromedriver.exe");} 
      driver = new ChromeDriver(); 

      { driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);} 
      {driver.manage().window().maximize();} 
      driver.get(Constant.URL); 
     } 
     } 

@Test 
public void signIn() { 

    SignIn_Action.Execute(driver, Constant.DevStudentUsername, Constant.DevStudentPassword);  
} 

@AfterMethod 
public void Teardown() { 
    driver.quit(); 

} 

    } 

我嘗試了調用靜態類,但隨後@BeforeMethod拋出一個配置錯誤,我確信我只是在傳遞驅動程序和參數時做錯了。

有人可以請解釋我需要對這兩個類,使其正常工作的變化?

這些都是錯誤的:

FAILED CONFIGURATION: @AfterMethod Teardown 
java.lang.NullPointerException 
    at automationFramework.SignIn.Teardown(SignIn.java:38) 
    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:84) 
    at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564) 
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:786) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 
    at org.testng.TestRunner.privateRun(TestRunner.java:767) 
    at org.testng.TestRunner.run(TestRunner.java:617) 
    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:1224) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) 
    at org.testng.TestNG.run(TestNG.java:1057) 
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) 
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) 
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) 

FAILED: signIn 
java.lang.NullPointerException 
    at appModule.SignIn_Action.Execute(SignIn_Action.java:27) 
    at automationFramework.SignIn.signIn(SignIn.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:84) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 
    at org.testng.TestRunner.privateRun(TestRunner.java:767) 
    at org.testng.TestRunner.run(TestRunner.java:617) 
    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:1224) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) 
    at org.testng.TestNG.run(TestNG.java:1057) 
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) 
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) 
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) 


=============================================== 
    Default test 
    Tests run: 1, Failures: 1, Skips: 0 
    Configuration Failures: 1, Skips: 0 
=============================================== 


=============================================== 
Suite 
Total tests run: 1, Failures: 1, Skips: 0 
Configuration Failures: 1, Skips: 0 
=============================================== 

我這是如何試圖調用代碼:

public WebDriver driver; 



@BeforeMethod 
@Parameters("browser") 
public void SetUp(String browser) { 

    BrowserType.CallBrowser(browser); 
     } 
+0

您能否包含錯誤? –

+0

更新錯誤它拋出一個空指針,因爲我可能沒有正確傳遞參數和驅動程序。 – Elsid

回答

0

你的問題是,當你調用拆除你的驅動程序未初始化。你需要確保它在任何情況下都被初始化。我會用一個調試器檢查你的代碼,並檢查以確保當你點擊setup和teardown方法時,驅動程序實際上是在安裝時初始化的並且在拆卸時存在。事情運行時,你也有兩個司機在場。一個是你在你的代碼的第一部分聲明的靜態驅動程序,然後你有另一個非靜態驅動程序位於你的實際測試。我會解決這個問題,因爲它可能會導致問題。

解決您的問題的最簡單方法是確保驅動程序在安裝過程中始終進行初始化,即使字符串與任一選項都不匹配。

public void SetUp(String browser) { 

    if(browser.equalsIgnoreCase("firefox")) { 

      driver = new FirefoxDriver(); 

     // If browser is Chrome, then do this 

     }else { 

      System.setProperty("webdriver.chrome.driver","C:/Users/elsid/Desktop/Eclipse/Selenium/chromedriver.exe"); 
      driver = new ChromeDriver(); 

      { driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);} 
      {driver.manage().window().maximize();} 
      driver.get(Constant.URL); 
     } 
} 
+0

是的,有一些問題,但它真的很混亂,因爲我沒有太多的Java知識。我通過刪除靜態驅動程序並將其更改爲webdriver driver = new firefoxdriver()來部分工作。它在正確設置的情況下運行,但現在我不知道如何將該驅動程序傳遞給類的其他部分,例如test和aftermethod。 – Elsid

+0

@Elsid更新回答 –

+0

你能提供一個例子嗎?謝謝 – Elsid