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
运算符始终返回给定类的新实例,并将调用构造函数。有关详细信息,请参阅。