使用Selenium Python API绑定从Chrome获取console.log输出

时间:2014-01-03 15:34:26

标签: python google-chrome logging selenium

我正在使用Selenium通过Python API绑定在Chrome中运行测试,而我无法确定如何配置Chrome以使加载的测试中的console.log输出可用。我看到WebDriver对象上有get_log()log_types()个方法,我看到Get chrome's console log显示了如何用Java做事。但是我没有在Python API中看到Java的LoggingPreferences类型。有没有办法完成我需要的东西?

4 个答案:

答案 0 :(得分:75)

好的,终于明白了:

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)

source字段等于'console-api'的条目对应于控制台消息,消息本身存储在message字段中。

答案 1 :(得分:1)

要完成答案:从chromedriver 75.0.3770.8开始,您必须使用goog:loggingPrefs而不是loggingPrefs。

请参阅Chromedriver更新日志:http://chromedriver.chromium.org/downloads或以下错误:https://bugs.chromium.org/p/chromedriver/issues/detail?id=2976

答案 2 :(得分:1)

请注意,调用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的答案,以了解示例代码上方的内容。

答案 3 :(得分:0)

如果您正在使用python日志记录模块(应该这样做)...这是一种将硒浏览器日志添加到python日志记录系统的方法。

get_browser_log_entries()函数从eth提供的驱动程序中获取日志,并将它们作为chrome发送到python日志记录模块。 (例如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")