En el modelo de objetos de página, ¿todas las clases deben compartir una única instancia de controlador?
Puedo crear un archivo BaseTest.java y declarar el controlador WebDriver estático público; en eso. Entonces todas las clases pueden extender y usar la misma referencia de controlador.
Entonces todas mis clases de prueba pueden usar la misma instancia.
Puedo usar:
driver = new ChromeDriver();
en cada método de prueba o escenario de pepino. Estoy confundido, cómo usar el controlador. ¿El controlador es una sesión de ventana de Chrome?
Respuestas
¿El controlador es una sesión de ventana de Chrome?
No. Un ChromeDriver representa un servidor que controla un navegador Chrome que se ejecuta localmente. El servidor controlará el ciclo de vida del navegador, como las acciones de inicio, eliminación y control.
Para obtener más detalles, consulte los documentos.
¿Puedo crear driver = new ChromeDriver (); en cada método de prueba o escenario de pepino
Sí, pero dependerá de tu contexto. Si desea que varios navegadores se ejecuten de forma independiente en algunas acciones, puede crear un nuevo controlador.
Prima:
Puedo crear un archivo BaseTest.java y declarar el controlador WebDriver estático público; en eso. Entonces todas las clases pueden extender y usar la misma referencia de controlador.
Esto puede resultar peligroso. La herencia es la forma más fuerte de acoplamiento que puede hacer y tener una variable global puede causar cambios en los comportamientos muy difíciles de entender. Es posible que desee refactorizar su código para que las instancias del controlador se inyecten en sus objetos de página . De esta manera, no está acoplando los objetos de página a una variable global y puede crear fácilmente pruebas unitarias para ellos inyectando un doble de prueba para el controlador.
Qué es chromedriver:
chromedriver tiene un código que puede interactuar con el navegador. Estos comandos se exponen a través de una API (esto es lo que ve cuando chromedriver se inició en localhost: 14563). Desde el código accedemos a estos puntos finales de la API para decirle al controlador de Chrome que haga algo.
Por ejemplo, cuando dice elem.click (), selenium habla con la API y le dice a chromedriver que haga clic en el elemento especificado en el navegador. Y el controlador de Chrome lo hace y devuelve la respuesta del navegador y la devuelve al código

Por que necesitamos la clase base
Esto es para garantizar que las sesiones de controlador se pasen entre diferentes clases. De lo contrario, no podrás hacer algo como
page1.sendpassword()
page1.sendusername()
page1.submit()
page2.adduser()
Porque si tiene una sesión de controlador diferente para la página1 y la página2,
luego, una vez que inicie page2.adduser (), el controlador de Chrome se iniciará nuevamente y sus sesiones de inicio de sesión anteriores no estarán disponibles, por lo que debe iniciar sesión nuevamente
Además, no puede agregar capturas de pantalla o acciones específicas del controlador en clases de oyentes para informes
Puede leer más sobre la clase base en:
¿Cuál es el propósito de crear una clase BaseTest que declare un objeto WebDriver estático global en el marco POM?
La instancia de WebDriver en su código es un tipo de canal que usa para interactuar con una sola sesión de implementación del controlador web. Básicamente, lo que usa en su código es el llamado enlace de cliente .
Un WebDriver es un servidor HTTP que expone la API REST hacia los enlaces de su cliente (por ejemplo, bibliotecas Java) en un lado y puede controlar el navegador en el otro lado.
Por lo tanto, todo su código que se supone que funciona con la misma sesión de Chrome (conservando las cookies, etc.) tiene que compartir la misma instancia del controlador web.
Nada le impide crear una instancia más de un buceador en su código. A través de esa nueva instancia obtendrá el control de una sesión de navegador aislada paralela diferente.