34

我需要检查页面对象的集合,以查看每个页面对象是否已在其 WebDriver 上调用了 quit()。

我编写了以下方法来检查 WebDriver 的状态:

public static boolean hasQuit(WebDriver driver) {
        try {
            driver.getTitle();
            return false;
        } catch (SessionNotFoundException e) {
            return true;
        }
}

这就是问题所在:我不喜欢通过抛出和捕获异常来发现布尔值的真相,但似乎我别无选择,因为WebDriver API没有提供检查驱动程序是否退出的方法。

所以我的问题是,有没有更好的方法来检查 WebDriver 是否已退出?

我在这里找到了一个类似的(更一般的)问题,但该问题没有任何代码已尝试过,唯一的答案是在退出后始终将 WebDriver 设置为 null (我不一定可以控制) .

4

3 回答 3

24

If quit() has been called, driver.toString() returns null:

>>> FirefoxDriver: firefox on XP (null))

Otherwise, it returns a hashcode of the object:

>>> FirefoxDriver: firefox on XP (9f897f52-3a13-40d4-800b-7dec26a0c84d)

so you could check for null when assigning a boolean:

boolean hasQuit = driver.toString().contains("(null)");
于 2013-09-04T19:49:53.657 回答
15

根据您的情况,您基本上可以采取两种方法。

情况 1:扩展 WebDriver 不是一个现实的选择。

这是最常见的情况。 大多数在实际工作环境中使用 Selenium 的开发人员想要一种方便的方式来判断 WebDriver 是否已退出,他们都在已经建立的测试框架中工作,并尝试重构框架以确保仅使用您的 WebDriver 的自定义扩展。麻烦多于其价值。

在这种情况下,Sajan 的答案和 Gili 对他的答案的推荐将没有用,因为覆盖 RemoteWebDriver#stopClient()不是一种选择。(此外,即使是这样,大多数人都在寻找一个简单的答案。)

只要您只使用 Selenium 附带的 WebDriver 的标准实现(FirefoxDriver、ChromeDriver、InternetExplorerDriver、SafariDriver 等),您就可以将 WebDriver 转换为 RemoteWebDriver,然后检查 sessionId 是否为空(Pat 在右边跟踪,但直接调用 sessionId 比使用toString()) 更好。

public static boolean hasQuit(WebDriver driver) {
    return ((RemoteWebDriver)driver).getSessionId() == null;
}

这个答案应该适用于所有情况的 95%,因为您打算多久使用一次不实现 RemoteWebDriver 的 WebDriver?(不经常。)

情况 2:您可以实际扩展您的 WebDriver

这种情况不太常见,但也许您是:
    (a)使用精心设计和抽象的框架,或者
    (b)从头开始一个 selenium 测试框架。

在这种情况下,您可以创建自己的扩展 WebDriver 的接口:

public interface CustomDriver extends WebDriver {

    boolean hasQuit();

}

然后您可以像这样扩展标准 WebDriver(在本例中为 ChromeDriver):

public class CustomChromeDriver extends ChromeDriver implements CustomDriver {

    boolean hasQuit = false;

    @Override
    public boolean hasQuit() {
        return hasQuit;
    }

    @Override
    public void stopClient() {
        super.stopClient();
        hasQuit = true;
    }
}
于 2014-12-18T06:54:15.337 回答
5

StopClient方法将在quitRemoteWebDriver Source)被调用后被调用,可能你可以继承你的实例RemoteWebDriver并覆盖stopClient方法,设置一些标志并检查标志以确定 webdriver 是否关闭(quit)。

于 2013-09-04T16:45:54.860 回答