Obteniendo la salida de console.log de Chrome con enlaces API de Selenium Python
Estoy usando Selenium para ejecutar pruebas en Chrome a través de los enlaces de la API de Python y tengo problemas para descubrir cómo configurar Chrome para que el console.log
resultado de la prueba cargada esté disponible. Veo que hay get_log()
métodos log_types()
en el objeto WebDriver y he visto Obtener el registro de la consola de Chrome que muestra cómo hacer cosas en Java. Pero no veo un equivalente del LoggingPreferences
tipo de Java en la API de Python. ¿Hay alguna manera de lograr lo que necesito?
Ok, finalmente lo descubrí:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
# enable browser logging
d = DesiredCapabilities.CHROME
d['loggingPrefs'] = { 'browser':'ALL' }
driver = webdriver.Chrome(desired_capabilities=d)
# load the desired webpage
driver.get('http://foo.com')
# print messages
for entry in driver.get_log('browser'):
print(entry)
Las entradas cuyo source
campo es igual 'console-api'
corresponden a mensajes de la consola y el mensaje en sí se almacena en el message
campo.
A partir de chromedriver, 75.0.3770.8, debes usar goog:loggingPrefs en lugar de loggingPrefs:
d['goog:loggingPrefs'] = { 'browser':'ALL' }
Para completar la respuesta: a partir de chromedriver 75.0.3770.8, debes usar goog:loggingPrefs
en lugar de loggingPrefs
.
Consulte el registro de cambios de Chromedriver: http://chromedriver.chromium.org/downloads o este error: https://bugs.chromium.org/p/chromedriver/issues/detail?id=2976
Si está utilizando el módulo de registro de Python (y debería hacerlo)... aquí hay una manera de agregar los registros del navegador Selenium al sistema de registro de Python.
la get_browser_log_entries()
función toma los registros del controlador proporcionado por eth y los emite al módulo de registro de Python como Chrome. (es decir, chrome.console-api, chrome.network, etc.) utilizando la marca de tiempo del navegador (en caso de que haya un retraso antes de llamar a get_log)
Probablemente le vendría bien un mejor manejo de excepciones (como si el registro no está activado), etc., pero funciona la mayor parte del tiempo.
brincar
import logging
from selenium import webdriver
def get_browser_log_entries(driver):
"""get log entreies from selenium and add to python logger before returning"""
loglevels = { 'NOTSET':0 , 'DEBUG':10 ,'INFO': 20 , 'WARNING':30, 'ERROR':40, 'SEVERE':40, 'CRITICAL':50}
#initialise a logger
browserlog = logging.getLogger("chrome")
#get browser logs
slurped_logs = driver.get_log('browser')
for entry in slurped_logs:
#convert broswer log to python log format
rec = browserlog.makeRecord("%s.%s"%(browserlog.name,entry['source']),loglevels.get(entry['level']),'.',0,entry['message'],None,None)
rec.created = entry['timestamp'] /1000 # log using original timestamp.. us -> ms
try:
#add browser log to python log
browserlog.handle(rec)
except:
print(entry)
#and return logs incase you want them
return slurped_logs
def demo():
caps = webdriver.DesiredCapabilities.CHROME.copy()
caps['goog:loggingPrefs'] = { 'browser':'ALL' }
driver = webdriver.Chrome(desired_capabilities=caps )
driver.get("http://localhost")
consolemsgs = get_browser_log_entries(driver)
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s:%(levelname)7s:%(message)s')
logging.info("start")
demo()
logging.info("end")
Tenga en cuenta que la llamada driver.get_log('browser')
hará que la siguiente llamada no devuelva nada hasta que se escriban más registros en la consola.
Primero sugeriría guardar los registros en una variable. Por ejemplo, a continuación logs_2
será igual a []
.
Si necesita algo en la consola para probar, puede usar:
self.driver.execute_script("""
function myFunction() {
console.log("Window loaded")
}
if(window.attachEvent) {
window.attachEvent('onload', myFunction());
} else {
if(window.onload) {
var curronload = window.onload;
var newonload = function(evt) {
curronload(evt);
myFunction(evt);
};
window.onload = newonload;
} else {
window.onload = myFunction();
}
}
""")
logs_1 = driver.get_log('browser')
print("A::", logs_1 )
logs_2 = driver.get_log('browser')
print("B::", logs_2 )
for entry in logs_1:
print("Aa::",entry)
for entry in logs_2:
print("Bb::",entry)
Vea la respuesta de msridhar para saber qué debería ir encima de mi código de ejemplo.