Obteniendo la salida de console.log de Chrome con enlaces API de Selenium Python

Resuelto msridhar asked hace 10 años • 4 respuestas

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.logresultado 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 LoggingPreferencestipo de Java en la API de Python. ¿Hay alguna manera de lograr lo que necesito?

msridhar avatar Jan 03 '14 22:01 msridhar
Aceptado

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 sourcecampo es igual 'console-api'corresponden a mensajes de la consola y el mensaje en sí se almacena en el messagecampo.

A partir de chromedriver, 75.0.3770.8, debes usar goog:loggingPrefs en lugar de loggingPrefs:

d['goog:loggingPrefs'] = { 'browser':'ALL' }
msridhar avatar Jan 03 '2014 18:01 msridhar

Para completar la respuesta: a partir de chromedriver 75.0.3770.8, debes usar goog:loggingPrefsen 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

Perdu avatar Jun 25 '2019 11:06 Perdu

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")
ShoeLace avatar Aug 28 '2020 00:08 ShoeLace

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_2será 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.

Jortega avatar Jan 15 '2020 13:01 Jortega