python 3.x - ¿Cómo puedo volver a conectarme al navegador abierto por webdriver con selenio?
python-3.x selenium (3)
Sí , eso es bastante fácil de hacer.
Una sesión de selenio <-> webdriver está representada por una url de conexión y session_id, simplemente reconecta a una existente.
Descargo de responsabilidad : el enfoque está utilizando propiedades internas de selenio ("privadas", de alguna manera), que pueden cambiar en nuevas versiones; será mejor que no lo use para el código de producción; es mejor no usarlo contra SE remoto (su centro o proveedor como BrowserStack / Sauce Labs), debido a una advertencia / drenaje de recursos explicado al final.
Cuando se inicia una instancia de controlador web, debe obtener las propiedades mencionadas anteriormente; muestra:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(''https://www.google.com/'')
# now Google is opened, the browser is fully functional; print the two properties
# command_executor._url (it''s "private", not for a direct usage), and session_id
print(f''driver.command_executor._url: {driver.command_executor._url}'')
print(f''driver.session_id: {driver.session_id}'')
Con esas dos propiedades ahora conocidas, se puede conectar otra instancia;
el "truco" es iniciar un controlador
Remote
y proporcionar el
_url
anterior, por lo que se conectará a ese proceso de selenio en ejecución:
driver2 = webdriver.Remote(command_executor=the_known_url)
# when the started selenium is a local one, the url is in the form ''http://127.0.0.1:62526''
Cuando eso se ejecute, verá que se abre una nueva ventana del navegador.
Esto se debe a que al iniciar el controlador, la biblioteca de selenio inicia automáticamente una nueva sesión para él, y ahora tiene 1 proceso de controlador web con 2 sesiones (instancias de navegadores).
Si navega a una url, verá que se ejecuta en esa nueva instancia del navegador, no en la que quedó del inicio anterior, que no es el comportamiento deseado.
En este punto, se deben hacer dos cosas: a) cerrar la sesión SE actual ("la nueva") yb) cambiar esta instancia a la sesión anterior:
if driver2.session_id != the_known_session_id: # this is pretty much guaranteed to be the case
driver2.close() # this closes the session''s window - it is currently the only one, thus the session itself will be auto-killed, yet:
driver2.quit() # for remote connections (like ours), this deletes the session, but does not stop the SE server
# take the session that''s already running
driver2.session_id = the_known_session_id
# do something with the now hijacked session:
driver.get(''https://www.bing.com/'')
Y eso es todo: ahora está conectado a la sesión anterior / ya existente, con todas sus propiedades (cookies, LocalStorage, etc.).
Por cierto, no tiene que proporcionar las
desired_capabilities
al iniciar el nuevo controlador remoto: se almacenan y heredan de la sesión existente que asumió.
Advertencia : tener un proceso de SE en ejecución puede generar cierto drenaje de recursos en el sistema.
Cada vez que se inicia uno y luego no se cierra, como en la primera parte del código, permanecerá allí hasta que lo elimine manualmente.
Con esto quiero decir, en Windows, por ejemplo, verá un proceso "chromedriver.exe", que debe finalizar manualmente una vez que haya terminado con él.
No puede ser cerrado por un controlador que se haya conectado a él como a un proceso remoto de selenio.
La razón: cada vez que inicia una instancia de navegador local y luego llama a su método
quit()
, tiene 2 partes: la primera es eliminar la sesión de la instancia de Selenium (lo que se hace en la segunda parte del código) , y el otro es detener el servicio local (chrome / geckodriver), que generalmente funciona bien.
La cuestión es que, para las sesiones remotas, falta la segunda pieza: su máquina local no puede controlar un proceso remoto, ese es el trabajo del concentrador de ese control remoto.
Entonces, la segunda parte es, literalmente, una declaración de
pass
Python, un no-op.
Si inicia demasiados servicios de selenio en un concentrador remoto y no tiene control sobre él, eso conducirá al drenaje de recursos de ese servidor. Los proveedores de la nube como BrowserStack toman medidas contra esto: están cerrando servicios sin actividad durante los últimos 60 años, etc., sin embargo, esto es algo que no desea hacer.
Y en cuanto a los servicios SE locales, simplemente no olvides limpiar ocasionalmente el sistema operativo de los controladores de selenio huérfanos que olvidaste :)
Por algunas razones desconocidas, mi navegador abre las páginas de prueba de mi servidor remoto muy lentamente.
Así que estoy pensando si puedo volver a conectarme al navegador después de salir del script pero no ejecutar
webdriver.quit()
esto dejará el navegador abierto.
Probablemente sea una especie de GANCHO o controlador de webdriver.
He buscado el documento API de selenio pero no he encontrado ninguna función.
Estoy usando Chrome 62, x64, windows 7, selenium 3.8.0.
Seré muy apreciado si la pregunta se puede resolver o no.
Sin entrar en por qué crees que dejar una ventana de navegador abierta resolverá el problema de ser lento, realmente no necesitas un controlador para hacerlo.
Simplemente siga ejecutando las pruebas sin cerrar la sesión o, en otras palabras, sin llamar a
driver.quit()
como se ha mencionado a sí mismo.
¿La pregunta aquí es el marco que viene con su propio corredor?
Como el pepino?
En cualquier caso, debe tener un código de "configuración" y "limpieza". Entonces, lo que debe hacer es asegurarse durante la fase de "limpieza" de que el navegador vuelva a su estado inicial. Eso significa:
- Se muestra la página en blanco
- Las cookies se borran para la sesión.
No
, no puede volver a conectarse a la sesión anterior del
Web Browser
después de salir del script.
Incluso si puede extraer el
Session ID
, las
Cookies
y otros atributos de sesión de la
Browsing Session
anterior, no podrá pasar esos atributos como un GANCHO al
WebDriver
.
Una forma más limpia sería llamar a
webdriver.quit()
y luego abarcar una nueva
Browsing Session
.
Historia:
Anteriormente hubo algunas discusiones e intentos de volver a conectar
WebDriver
a una sesión de navegación en ejecución existente.
Puede encontrar las discusiones en estos QA: