web-dev-qa-db-fra.com

En Java, le meilleur moyen de vérifier si Selenium WebDriver a quitté

J'ai besoin de vérifier une collection d'objets de page pour voir, pour chacun, si quit () a été appelé sur son WebDriver.

J'ai écrit la méthode suivante pour vérifier l'état d'un WebDriver:

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

Voici le problème: je n'aime pas devoir lancer et attraper une exception pour découvrir la vérité d'un booléen, mais il semble que je n'ai pas le choix depuis le API WebDriver ne fournit pas de méthode pour vérifier si le pilote a quitté.

Donc ma question est, existe-t-il un meilleur moyen de vérifier si un WebDriver a quitté?

J'ai trouvé une question similaire (et plus générale) ici, mais la question n'avait pas de code qui avait été essayé, et la seule réponse était de toujours définir le WebDriver sur null après avoir quitté (que je n'ai pas nécessairement le contrôle).

31
James Dunn

Si quit() a été appelée, driver.toString() renvoie null:

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

Sinon, il renvoie un hashcode de l'objet:

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

vous pouvez donc vérifier null lors de l'attribution d'un booléen:

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

Il existe essentiellement deux approches, selon votre situation.

Situation 1: étendre WebDriver n'est pas une option réaliste.

Il s'agit de la situation la plus courante. La plupart des développeurs travaillant avec Selenium dans des situations de travail réel qui veulent un moyen pratique de savoir si un WebDriver a quitté fonctionnent dans un cadre de test déjà établi et essaient de refactoriser le pour garantir que seules vos extensions personnalisées de WebDrivers sont utilisées est probablement plus problématique que cela ne vaut.

Dans ce cas, la réponse de Sajan et la recommandation de Gili de sa réponse ne seront pas utiles, car remplacer RemoteWebDriver#stopClient() n'est pas une option. (D'ailleurs, même si c'était le cas, la plupart des gens recherchent une réponse simple.)

Tant que vous n'utilisez que des implémentations standard de WebDriver fournies avec Selenium (FirefoxDriver, ChromeDriver, InternetExplorerDriver, SafariDriver, etc.), vous pouvez caster le WebDriver en RemoteWebDriver, puis vérifier si le sessionId est nul (Pat était à droite suivre, mais un appel direct à sessionId est mieux que d'utiliser toString()).

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

Cette réponse devrait être bonne pour 95% de tous les cas, car à quelle fréquence allez-vous utiliser un WebDriver qui n'implémente pas RemoteWebDriver? (Pas très souvent.)

Situation 2: vous POUVEZ étendre de manière réaliste votre WebDriver.

Cette situation est moins courante, mais vous êtes peut-être soit:
A) Travailler avec un cadre bien conçu et abstrait, ou
(B) Démarrage d'un framework de test Selenium à partir de zéro.

Dans ce cas, vous pouvez créer votre propre interface qui étend WebDriver:

public interface CustomDriver extends WebDriver {

    boolean hasQuit();

}

Et vous pouvez ensuite étendre les WebDrivers standard comme cela (dans cet exemple, 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;
    }
}
12
James Dunn

StopClient La méthode sera invoquée après l'appel de quit ( RemoteWebDriver Source ), peut-être pouvez-vous sous-classer votre instance de RemoteWebDriver et remplacer stopClient, définissez un indicateur et vérifiez l'indicateur pour déterminer si le pilote Web est fermé (quit).

5
Sajan Chandran