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

Jam*_*unn 32 java selenium webdriver selenium-webdriver

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

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

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

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

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

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

Din*_*ent 20

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

>>> FirefoxDriver: firefox on XP (null))
Run Code Online (Sandbox Code Playgroud)

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

>>> FirefoxDriver: firefox on XP (9f897f52-3a13-40d4-800b-7dec26a0c84d)
Run Code Online (Sandbox Code Playgroud)

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

boolean hasQuit = driver.toString().contains("(null)");
Run Code Online (Sandbox Code Playgroud)

  • -1:你不应该依赖`toString()`来编程行为.如果你厌倦了深入研究这个函数,你会注意到`null`来自`sessionId`所以你真正需要的是检查`getSessionId()`是否返回`null`.但最终,[Sajan的答案](http://stackoverflow.com/a/18619506/14731)更可靠,因为无法保证所有实现都将`sessionId`设置为`null`但是你**是**保证将调用`stopClient()`. (6认同)

Jam*_*unn 13

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

情况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;
}
Run Code Online (Sandbox Code Playgroud)

对于95%的情况,这个答案应该是好的,因为你经常使用不实现RemoteWebDriver的WebDriver?(不经常.)

情况2:您CAN实事求是地扩展您的webdriver.

这种情况不太常见,但也许您要么:
    (a)使用设计良好且抽象化的框架,或
    (b)从头开始实施硒测试框架.

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

public interface CustomDriver extends WebDriver {

    boolean hasQuit();

}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样扩展标准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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Saj*_*ran 5

在调用quit(RemoteWebDriver Source)之后将调用StopClient方法,可能是您可以子类化您的实例RemoteWebDriver和覆盖stopClient方法,设置一些标志并检查标志以确定webdriver是否已关闭(quit).