select_by_value - selenium webdriver python
Monitoreo de registros de protocolo de cables JSON (2)
Encontré una opción que casi se ajusta a mis necesidades.
Solo conectar el registrador al stdout
permite ver las solicitudes subyacentes que se realizan:
import logging
import sys
from selenium import webdriver
# pipe logs to stdout
logger = logging.getLogger()
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setLevel(logging.NOTSET)
# selenium specific code
driver = webdriver.Chrome()
driver.get(''http://google.com'')
driver.close()
Imprime:
POST http://127.0.0.1:56668/session {"desiredCapabilities": {"platform": "ANY", "browserName": "chrome", "version": "", "javascriptEnabled": true, "chromeOptions": {"args": [], "extensions": []}}}
Finished Request
POST http://127.0.0.1:56668/session/5b6875595143b0b9993ed4f66f1f19fc/url {"url": "http://google.com", "sessionId": "5b6875595143b0b9993ed4f66f1f19fc"}
Finished Request
DELETE http://127.0.0.1:56668/session/5b6875595143b0b9993ed4f66f1f19fc/window {"sessionId": "5b6875595143b0b9993ed4f66f1f19fc"}
Finished Request
No veo las respuestas, pero esto ya es un progreso.
De acuerdo con la documentación de selenio, las interacciones entre el cliente de webdriver y un navegador se realizan a través de JSON Wire Protocol . Básicamente, el cliente, escrito en python, ruby, java whatever, envía mensajes JSON al navegador web y el navegador web también responde con JSON.
¿Hay alguna manera de ver / capturar / registrar estos mensajes JSON mientras se ejecuta una prueba de selenio?
Por ejemplo (en Python):
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(''http://google.com'')
driver.close()
Quiero ver qué mensajes JSON están pasando entre el cliente de python selenium webdriver y un navegador cuando instancia el controlador (en este caso Chrome): webdriver.Chrome()
, cuando driver.get(''http://google.com'')
una página: driver.get(''http://google.com'')
y cuando lo estoy cerrando: driver.close()
.
FYI, en el tutorial #SFSE: Stripping Down Remote WebDriver , se realiza mediante la captura del tráfico de red entre la máquina local donde se ejecuta la secuencia de comandos y el servidor de selenio remoto .
Estoy etiquetando la pregunta como específico de Python
, pero realmente estaría contento con cualquier apuntador.
Cuando usas Chrome, puedes dirigir la instancia de chromedriver
que impulsará Chrome para registrar más información de la disponible a través del paquete de logging
. Esta información incluye los comandos enviados al navegador y las respuestas que recibe. Aquí hay un ejemplo:
from selenium import webdriver
driver = webdriver.Chrome(service_log_path="/tmp/log")
driver.get("http://www.google.com")
driver.find_element_by_css_selector("input")
driver.quit()
El código anterior dará salida al registro a /tmp/log
. La parte del registro que corresponde a la llamada find_element_...
ve así:
[2.389][INFO]: COMMAND FindElement {
"sessionId": "b6707ee92a3261e1dc33a53514490663",
"using": "css selector",
"value": "input"
}
[2.389][INFO]: Waiting for pending navigations...
[2.389][INFO]: Done waiting for pending navigations
[2.398][INFO]: Waiting for pending navigations...
[2.398][INFO]: Done waiting for pending navigations
[2.398][INFO]: RESPONSE FindElement {
"ELEMENT": "0.3367185448296368-1"
}
Hasta donde yo sé, los comandos y las respuestas representan fielmente lo que está sucediendo entre el cliente y el servidor. He enviado informes de fallas y correcciones al proyecto Selenium sobre la base de lo que vi en estos registros.