调用quit()后无法使用WebDriver FirefoxDriver

时间:2013-12-09 18:18:34

标签: java webdriver selenium-webdriver

我在获取正确的驱动程序实例时遇到问题。 以下是我的设置

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"

我的设置/拆机出了什么问题..?

2 个答案:

答案 0 :(得分:1)

由于您的问题的评论已经提及,您的setUp()tearDown()方法以及WebDriver个实例 static 。所以一旦你致电driver.quit(),你的司机就不能再被使用了。需要获得一个新的驱动程序。

但是,您不使用JUnit的@Before@After注释,而是使用@BeforeClass@AfterClass。所以我猜你在Test2类中有多个测试,驱动程序在第一个测试之后退出,并且在第二个测试之前没有重新初始化。

最好使WebDriversetUp()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;
}