我在获取正确的驱动程序实例时遇到问题。 以下是我的设置
public class SeleniumBase{
public static WebDriver driver;
public static void setUp(url,browser,port){
driver = new FirefoxDriver();
}
public static void tearDown(){
driver.manage().deleteAllCookies();
driver.close();
driver.quit();
}
}
public class BuildTest extends SeleniumBase{
@BeforeClass
public static void seleniumSetup(){
try{
// read properties
url = prop.getProp("baseUrl");
browser = prop.getProp("browser");
port = prop.getProp("port");
}
SeleniumBase.setUp(url,browser,port);
waitForLoginPage();
App.login();
}
@AfterClass
public static void seleniumTearDown(){
App.logOut();
SeleniumBase.tearDown();
}
}
@RunWith(Suite.class)
@Suite.SuiteClasses(
{
Test1.class,
Test2.class
})
public class SmokeSuite {
}
现在,对于Test1.class,一切正常,但是当从套件调用Test2.class时,使用setUp方法创建新的驱动程序实例,但App.Login()抛出错误"The FirefoxDriver cannot be used after quit() was called"
我的设置/拆机出了什么问题..?
答案 0 :(得分:1)
由于您的问题的评论已经提及,您的setUp()
和tearDown()
方法以及WebDriver
个实例 static
。所以一旦你致电driver.quit()
,你的司机就不能再被使用了。需要获得一个新的驱动程序。
但是,您不使用JUnit的@Before
和@After
注释,而是使用@BeforeClass
和@AfterClass
。所以我猜你在Test2
类中有多个测试,驱动程序在第一个测试之后退出,并且在第二个测试之前没有重新初始化。
最好使WebDriver
,setUp()
和tearDown
不是静态的,并在测试类中使用@Before
和@After
。然后你的问题就会消失。
答案 1 :(得分:0)
当您使用driver.quit();
时,关闭所有打开的浏览器并退出驱动程序。但是,您的driver
未设置为null
,但仍位于WebDriver
实例与null
之间的空白处。
为什么这很重要?因为当你调用driver = new FirefoxDriver();
时,构造函数是“作弊”,并将旧的WebDriver
实例交给你,因为它看不到null
,而不是初始化新实例。 p>
在调用quit后分配null
可以解决问题。
public void tearDown() {
driver.quit();
driver = null;
}