2016-11-22 54 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/

相关问题