example chrome java selenium webdriver selenium-webdriver

chrome - En Java, la mejor forma de comprobar si Selenium WebDriver se ha eliminado



selenium webdriver python (3)

Necesito verificar una colección de Objetos de Página para ver, para cada uno, si se ha llamado a salir () en su WebDriver.

He escrito el siguiente método para verificar el estado de un WebDriver:

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

Este es el problema: no me gusta tener que lanzar y atrapar una excepción para descubrir la verdad de un booleano, pero parece que no tengo otra opción, ya que la API de WebDriver no proporciona un método para verificar si el controlador se ha cerrado.

Entonces mi pregunta es, ¿hay una mejor manera de verificar si un WebDriver se ha cerrado?

Encontré una pregunta similar (y más general) here , pero la pregunta no tenía ningún código que se haya probado, y la única respuesta fue configurar siempre el WebDriver como nulo después de dejar de fumar (que no necesariamente tengo control) .


Básicamente hay dos enfoques que puede tomar, dependiendo de su situación.

Situación 1: extender WebDriver no es una opción realista.

Esta es la situación más común. La mayoría de los desarrolladores que trabajan con Selenium en situaciones de trabajo real que desean una forma práctica de saber si un WebDriver se ha retirado están trabajando en un marco de prueba ya establecido, y tratar de refactorizar el marco para asegurarse de que solo se usan sus extensiones personalizadas de WebDrivers es probable más problemas de los que vale la pena.

En este caso, la respuesta de Sajan y la recomendación de Gili de su respuesta no serán útiles, ya que la RemoteWebDriver#stopClient() no es una opción. (Además, incluso si lo fuera, la mayoría de la gente está buscando una respuesta simple).

Siempre que solo esté usando implementaciones estándar de WebDriver que vienen con Selenium (FirefoxDriver, ChromeDriver, InternetExplorerDriver, SafariDriver, etc.), puede convertir WebDriver a RemoteWebDriver y luego verificar si el sessionId es nulo (Pat estaba a la derecha) rastrear, pero una llamada directa a sessionId es mejor que usar toString() ).

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

Esta respuesta debería ser buena para el 95% de todos los casos, porque ¿con qué frecuencia usará un WebDriver que no implementa RemoteWebDriver? (No muy seguido.)

Situación 2: PUEDE extender de manera realista su WebDriver.

Esta situación es menos común, pero quizás usted sea:
(a) Trabajar con un marco bien diseñado y abstraído, o
(b) Iniciar un marco de prueba de selenio desde cero.

En este caso, puede crear su propia interfaz que amplíe WebDriver:

public interface CustomDriver extends WebDriver { boolean hasQuit(); }

Y luego puede extender WebDrivers estándar como tal (en este ejemplo, 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; } }


Si se ha llamado a driver.toString() , driver.toString() devuelve null:

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

De lo contrario, devuelve un código hash del objeto:

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

para que pueda verificar nulo al asignar un booleano:

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


StopClient método StopClient se invocará después de que se llame a quit ( RemoteWebDriver Source ), puede ser que usted pueda subclasificar su instancia de RemoteWebDriver y anular el método stopClient , establecer una bandera y verificar que la bandera determine si el webdriver está cerrado ( quit ).