【问题标题】:Though I instantiated driver after calling quit(), still I am getting the following The FirefoxDriver cannot be used after quit() was called虽然我在调用 quit() 后实例化了驱动程序,但我仍然收到以下内容 The FirefoxDriver cannot be used after quit() was called
【发布时间】:2016-03-24 16:19:34
【问题描述】:

我面临“调用 quit() 后无法使用 FirefoxDriver”问题。请帮助。

在我的框架中,我将 WebDriver 驱动程序变量用作静态变量。在每个测试用例结束时,我执行了 driver.quit() 方法。 在下一个测试用例开始时,我再次使用 firefoxdriver() 的新实例更新了驱动程序变量。但如果我尝试使用驱动程序变量来查找任何 web 元素,驱动程序变量将返回 null。这是我的代码的简化版本。

public class Frame
{
    private static WebDriver driver;

    public static WebDriver openUrl(String URL)
    {
        driver = new FirefoxDriver();
        driver.get(URL);
        return driver;
    }

    public static WebDriver returnWebDriverInstance()
    {
        System.out.println("I am called");
        return driver;
    }
}

public class javaCheck2
{
    private static WebDriver driver = Frame.returnWebDriverInstance();

    static
    {
        // driver = Frame.returnWebDriverInstance();
        System.out.println(driver + " in static");
    }

    public static void pageMaxim()
    {
        System.out.println(driver + " in page maxim");
        driver.manage().window().maximize();
    }

    public static void pagesource()
    {
        System.out.println(driver + " in page source");
        driver.getPageSource();
    }
}

@Test
public class TestCase1
{
    public void TC01()
    {
        WebDriver driver = Frame.openUrl("https://www.google.com");
        javaCheck2.pagesource();
        driver.quit();

        // driver.close();
    }
}

@Test
public class TestCase2
{
    public void TC02()
    {
        WebDriver driver = Frame.openUrl("https://www.gmail.com");
        javaCheck2.pageMaxim();
        driver.quit();
        // driver.close();
    }
}

控制台输出:

I am called
FirefoxDriver: firefox on MAC (6df8103b-673f-954f-b20d-72fa4b9181b8) in static
FirefoxDriver: firefox on MAC (6df8103b-673f-954f-b20d-72fa4b9181b8) in page source
FirefoxDriver: firefox on MAC (null) in page maxim

===============================================

Suite

Total tests run: 2, Failures: 1, Skips: 0

===============================================

请帮忙

【问题讨论】:

  • 不确定到底是什么,但我认为这是一些范围隐藏问题。我有 99% 的把握将代码重构为更易读的代码会解决问题(这是 2 个简单的测试,但需要一段时间才能解开其中的一半)。如果您有一个“全局”驱动程序变量,则无需在方法中创建本地副本 - 另一方面,如果您确实需要它,请将其命名为其他名称,例如 localDriver 或 driver2 或其他任何名称。
  • 在 Frame 类中,静态 WebDriver 驱动程序是私有的。所以我必须在方法中获取此私有静态的副本,因为我无法从类外部直接访问驱动程序成员变量。

标签: selenium selenium-webdriver


【解决方案1】:

问题是javaCheck2 的静态driver 实例被设置一次(在静态初始化块中)并且永​​远不会重置,所以一旦你调用quit(),底层会话(虽然不是null)就变得无效.它永远不会被重置,这就是为什么您尝试再次使用驱动程序实例时会失败的原因。

让它工作的最简单的解决方法(没有大的重构)是:

public class javaCheck2 {
    public static void pageMaxim() {
        Frame.returnWebDriverInstance().manage().window().maximize();
    }

    public static void pagesource() {
        Frame.returnWebDriverInstance().getPageSource();
    }
}

【讨论】:

  • 在 TestCase2 类中调用 quit() 后,我正在执行给定的命令。 WebDriver driver = Frame.openUrl("gmail.com"); 因此框架类中的静态驱动变量有一个新的实例。但是JavaCheck2中的驱动变量没有再次启动,因为以下命令在代码中只执行了一次。 private static WebDriver driver = Frame.returnWebDriverInstance();
  • 在 TestCase2 类中调用 quit() 后,我正在执行给定的命令。 WebDriver driver = Frame.openUrl("gmail.com"); 因此框架类中的静态驱动变量有一个新的实例。但是JavaCheck2中的驱动变量没有再次启动,因为以下命令在代码中只执行了一次。 private static WebDriver driver = Frame.returnWebDriverInstance(); //在 TC02 执行过程中不执行。这就是为什么 javaCheck2 的驱动程序仍然引用旧会话。这就是你要解释的,对吧?
  • 我不得不读了几次才能检查,但是是的,没错。如果你想重构,我建议尽可能多地删除静态的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2018-06-05
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多