在Java中,检查Selenium WebDriver是否已退出的最佳方法

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

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

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

问题是:我不喜欢必须抛出并捕获异常来发现布尔值的真实性,但似乎我别无选择,因为WebDriver API没有提供检查驱动程序是否已退出的方法。

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

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


答案 1

如果已被调用,则返回 null:quit()driver.toString()

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

否则,它将返回对象的哈希代码:

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

所以你可以在分配布尔值时检查空值:

boolean hasQuit = driver.toString().contains("(null)");

答案 2

基本上,您可以采取两种方法,具体取决于您的情况。

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

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

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

只要您只使用Selenium附带的WebDriver的标准实现(FirefoxDriver,ChromeDriver,InternetExplorerDriver,SafariDriver等),您就可以将WebDriver转换为RemoteWebDriver,然后检查sagementId是否为空(Pat在正确的轨道上,但直接调用specesitId比使用更好)。toString()

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

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

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

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

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

public interface CustomDriver extends WebDriver {

    boolean hasQuit();

}

然后你可以像这样扩展标准的WebDrivers(在这个例子中,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;
    }
}

推荐