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

aei*_*n83 5 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 {


}
Run Code Online (Sandbox Code Playgroud)

现在,对于Test1.class,一切正常,但是当从套件调用Test2.class时,使用setUp方法创建新的驱动程序实例,但App.Login()抛出错误说 "The FirefoxDriver cannot be used after quit() was called"

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

Guy*_*Guy 0

使用时driver.quit();,请关闭所有打开的浏览器并退出驱动程序。但是,您的driver未设置为,但仍处于实例 到null之间的空白中。WebDrivernull

为什么这很重要?因为当您调用driver = new FirefoxDriver();构造函数时,它会“作弊”并交给您旧WebDriver实例,该实例被认为是可行的,因为它看不到null,而不是初始化新实例。

调用 quit 后分配null应该可以解决问题。

public void tearDown() {
    driver.quit();
    driver = null;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是错误的!构造函数不能_作弊_。“new”运算符**总是**返回给定类的新实例,并且将调用构造函数。有关详细信息,请参阅[java 规范](http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5)。 (2认同)