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

时间:2013-09-04 16:24:53

标签: java selenium webdriver selenium-webdriver

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

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

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

问题在于:我不喜欢抛出并捕获异常以发现布尔值的真相,但似乎我没有选择,因为 WebDriver API 没有提供一种方法来检查司机是否已退出。

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

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

3 个答案:

答案 0 :(得分:17)

如果调用了quit()driver.toString()将返回null:

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

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

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

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

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

答案 1 :(得分:12)

根据您的具体情况,您可以采取两种方法。

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

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

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

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

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

对于所有情况的95%,这个答案应该是好的,因为你多久会使用一个没有实现RemoteWebDriver的WebDriver? (不常见。)

情况2:您 CAN 实际扩展您的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;
    }
}

答案 2 :(得分:5)

调用quitStopClient)后将调用

RemoteWebDriver Source方法,您可以将RemoteWebDriver的实例子类化并覆盖stopClient方法,设置一些标志并检查标志以确定webdriver是否已关闭(quit)。