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

Java 调用quit()后无法使用WeDriver FirefoxDriver,java,webdriver,selenium-webdriver,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.mana

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

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()抛出错误,说“调用quit()后无法使用FirefoxDriver”


我的设置/拆卸过程中是否出现任何问题?

当您使用
driver.quit()时关闭所有打开的浏览器并退出驱动程序。但是,
driver
未设置为
null
,但在
WebDriver
实例到
null
之间保持空白

为什么这很重要?因为当你调用
driver=newfirefoxdriver()时
构造函数正在“作弊”,并将旧的
WebDriver
实例交给您,该实例被认为是可行的,因为它没有看到
null
,而没有初始化新实例

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

public void tearDown() {
    driver.quit();
    driver = null;
}

正如对您问题的评论已经提到的,您的
setUp()
tearDown()
方法以及
WebDriver
实例都是
静态的
。因此,一旦调用
driver.quit()
,您的驱动程序就无法再使用了。需要获得一个新的驱动程序

但是,您不会在
之前和之后使用JUnit的
注释,而是在类之前和类之后使用
。因此,我猜您的
Test2
类中有多个测试,驱动程序在第一个测试之后退出,并且在第二个测试之前没有重新初始化


最好使
WebDriver
setUp()
tearDown
不是静态的,并在测试类中使用
。然后你的问题就会消失。

你在哪里实例化应用程序?另外,您是否必须使用静态实例?我建议在类级别上使用代码设置和分解每个类。可能使用基本测试类来停止复制我不确定
seleniumSetup()
seleniumTearDown()
应该是静态方法。您应该创建普通方法而不是静态方法,而且webdriver变量名应该不带static我对您正在编写驱动程序的Test1.class.quit()有一个建议因此,将其替换为driver.close(),它将正常工作。如果不使用driver.close(),则浏览器已关闭时将出错。如果尚未关闭,driver.quit()将关闭它。driver.close()设计用于多个窗口。这个答案不正确!构造函数不能欺骗。
new
运算符始终返回给定类的新实例,并将调用构造函数。有关详细信息,请参阅。