2016-11-22 47 views
0

如何在不同的測試類中共享相同的硒測試設置?我一直得到nullpointexception,並不知道如何解決它。我已經在這個問題的股票了一段時間,並搜查了幾個小時的問題,但仍然沒有解決它。請幫忙。在不同的測試類中共享TestNG設置 - Selenium Java

這是我的設置類

import static org.testng.Assert.fail; 

import java.util.concurrent.TimeUnit; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.chrome.ChromeOptions; 
import org.testng.annotations.AfterTest; 
import org.testng.annotations.BeforeTest; 

public class SettingsClass { 

WebDriver driver; 

@BeforeTest 
public void setUp() throws Exception { 
    System.setProperty("webdriver.chrome.driver", "chromeDriver_path"); 
    ChromeOptions options = new ChromeOptions(); 
    options.addArguments("--start-maximized", "chrome.switches", "--disable-extensions"); 
    WebDriver driver = new ChromeDriver(options); 
    driver.manage().deleteAllCookies(); // delete all cookies 
    driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS); 
    driver.manage().window().maximize(); 
} 

@AfterTest 
public void tearDown() throws Exception { 
    driver.quit(); 
} 

這裏是我的測試類

import org.openqa.selenium.By; 
import org.testng.annotations.Test; 

import com.Settings; 

public class ClassA extends SettingsClass { 

boolean acceptNextAlert = true; 
StringBuffer verificationErrors = new StringBuffer(); 

@Test 
public void test() throws Exception { 
    driver.get("http://www.fakeurl.com"); 
    driver.findElement(By.id("username")).sendKeys("admin"); 
    driver.findElement(By.id("password")).sendKeys("admin"); 
    driver.findElement(By.name("submit")).click(); 
} 

}


這裏是我不斷收到

java.lang.NullPointerException 
at com.ClassA.test(ClassA.java:15) 
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:85) 
at org.testng.internal.Invoker.invokeMethod(Invoker.java:659) 
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:845) 
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1153) 
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125) 
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108) 
at org.testng.TestRunner.privateRun(TestRunner.java:771) 
at org.testng.TestRunner.run(TestRunner.java:621) 
at org.testng.SuiteRunner.runTest(SuiteRunner.java:357) 
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352) 
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310) 
at org.testng.SuiteRunner.run(SuiteRunner.java:259) 
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1199) 
at org.testng.TestNG.runSuitesLocally(TestNG.java:1124) 
at org.testng.TestNG.run(TestNG.java:1032) 
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132) 
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:236) 
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:81) 
錯誤信息

任何意見和幫助將非常感激。先謝謝你!

+0

申報的webdriver爲公共和靜態的,並嘗試了一次,'公共靜態webdriver的驅動程序;'和'webdriver的驅動程序=新ChromeDriver(選項)刪除的webdriver decleration;'的'設置() '方法 –

+0

@jay在SettingClass中將驅動程序對象設爲公開 –

回答

0

嘗試,

public class SettingsClass { 

    public WebDriver driver; 

    @BeforeTest 
    public void setUp() throws Exception { 
     System.setProperty("webdriver.chrome.driver", "chromeDriver_path"); 
     ChromeOptions options = new ChromeOptions(); 
     options.addArguments("--start-maximized", "chrome.switches", "--disable-extensions"); 
     driver = new ChromeDriver(options); 
     driver.manage().deleteAllCookies(); // delete all cookies 
     driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS); 
     driver.manage().window().maximize(); 
    } 

    @AfterTest 
    public void tearDown() throws Exception { 
     driver.quit(); 
    } 
} 
+0

它工作的很好!謝謝。我試圖保護它,它也起作用。我應該將它保持爲公開還是將其更改爲受保護? – Jay

+0

實際改變是,你已經宣佈了'WebDriver'兩次(在'setUp()'方法內第二次)。我已將其刪除。如果它工作PLZ接受答案。 –

0

還有與依靠@BeforeTest的這種方法的問題來實例WebDriver例如在一個基類,擁有所有的測試類在這種情況下,擴展這個基類(SettingsClass ),因爲默認情況下,@BeforeTest方法被設計爲僅在套件xml文件中每<test>涉及一次。所以,如果你有這個基類的兩個或多個這樣的子類(SettingsClass在這種情況下)你會最終看到在您的測試,即在同一NullPointerException

你會看到相同的NullPointerException如果你以下:

  • 創建一個名爲ClassB新的類,它也延伸SettingsClass(和)
  • 在套房的XML文件包含在同<test>標籤ClassAClassB

而應該考慮可能移動到成ThreadLocal模型,該模型將通過以下機制之一進行初始化:

  • 通過@BeforeMethod標註的方法
  • 通過TestNG的聽者如IInvokedMethodListener#beforeInvocation
  • 通過執行org.testng.IHookable接口。

您可以參考我創建的博客文章,其中討論瞭如何使用TestNG監聽器和ThreadLocal變量來管理併發webdriver實例。請看看是否有幫助。

博客鏈接:https://rationaleemotions.wordpress.com/2013/07/31/parallel-webdriver-executions-using-testng/

相關問題