Получение вывода console.log из Chrome с привязками Selenium Python API

Я использую Selenium для запуска тестов в Chrome через привязки Python API, и у меня возникают проблемы с выяснением, как настроить Chrome, чтобы сделать console.log выход из загруженного теста доступен. Я вижу, что есть get_log() а также log_types() методы объекта WebDriver, и я видел журнал консоли Get Chrome, который показывает, как работать в Java. Но я не вижу эквивалента Java LoggingPreferences введите в Python API. Есть ли способ сделать то, что мне нужно?

1 ответ

Решение

Ок, наконец-то разобрался

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 some site
driver.get('http://foo.com')
# print messages
for entry in driver.get_log('browser'):
    print entry

Записи чьи source поле равно 'console-api' соответствуют сообщениям консоли, а само сообщение хранится в message поле.

Для полноты ответа: начиная с chromedriver 75.0.3770.8 необходимо использовать goog:loggingPrefs вместо того loggingPrefs.

См. Журнал изменений Chromedriver: http://chromedriver.chromium.org/downloads или эту ошибку: https://bugs.chromium.org/p/chromedriver/issues/detail?id=2976

Если вы используете модуль ведения журнала python (а вы должны быть)... вот способ добавить журналы браузера selenium в систему ведения журнала python..

в get_browser_log_entries()функция получает журналы от драйвера, предоставленного eth, отправляет их в модуль ведения журнала Python как chrome. (например, chrome.console-api, chrome.network и т. д.) с использованием отметки времени из браузера (в случае задержки перед вызовом get_log)

это, вероятно, могло бы быть сделано с некоторой лучшей обработкой исключений (например, если бы журнал не включен) и т.д.. но он работает большую часть времени..

хмель

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")

Обратите внимание, что вызов driver.get_log('browser') приведет к тому, что следующий вызов ничего не вернет, пока в консоль не будут записаны новые журналы.

Я бы посоветовал сначала сохранить журналы в переменной. Например нижеlogs_2 будет равно [].

Если вам нужно что-то в консоли для тестирования, вы можете использовать:

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)

См. Ответ msridhar о том, что должно быть выше моего примера кода.

Другие вопросы по тегам