【问题标题】:Getting console.log output from Chrome with Selenium Python API bindings使用 Selenium Python API 绑定从 Chrome 获取 console.log 输出
【发布时间】:2014-01-21 07:57:06
【问题描述】:

我正在使用 Selenium 通过 Python API 绑定在 Chrome 中运行测试,但我无法弄清楚如何配置 Chrome 以使加载的测试中的 console.log 输出可用。我看到 WebDriver 对象上有 get_log()log_types() 方法,并且我看到了 Get chrome's console log 它展示了如何在 Java 中做事。但我在 Python API 中没有看到与 Java 的 LoggingPreferences 类型等效的东西。有什么方法可以完成我需要的吗?

【问题讨论】:

    标签: python google-chrome logging selenium


    【解决方案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 the desired webpage
    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:

    d['goog:loggingPrefs'] = { 'browser':'ALL' }
    

    【讨论】:

    • 嗯。在尝试并获得后研究如何使用 chrome_options 执行此操作:/usr/lib/python2.6/site-packages/selenium/webdriver/chrome/webdriver.py:54: DeprecationWarning: Desired Capabilities has been deprecated, please user chrome_options. warnings.warn("Desired Capabilities has been deprecated, please user chrome_options.", DeprecationWarning)
    • 我使用webdriver.RemotebrowserName="chrome" 来实例化我的驱动程序,它一直告诉我AttributeError: 'WebDriver' object has no attribute 'get_log'。当我找到源代码时,我很难找到这个可爱答案中使用的get_log 实现。我怀疑我已经严重误入歧途了……某个地方。希望我知道在哪里! selenium.googlecode.com/svn/trunk/docs/api/py/…
    • @kiminoa 我在使用 selenium 2.33.0 时遇到了这个问题,升级到 2.45.0 已解决。
    • 看起来我可以注释掉d['loggingPrefs'] = { 'browser':'ALL' } 并获得相同的结果。此外,控制台日志的任何方式不仅仅是'level':'SEVERE'
    • @Shane 你需要用time.sleep(5) 等待几秒钟,否则你的浏览器将在没有执行console.log 的情况下退出。这是我的情况。
    【解决方案2】:

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

    查看 Chromedriver 更新日志:http://chromedriver.chromium.org/downloads 或此错误:https://bugs.chromium.org/p/chromedriver/issues/detail?id=2976

    【讨论】:

    • 谢谢!想要使用包含此说明的附加句子来编辑主要答案?
    【解决方案3】:

    如果您正在使用 python 日志记录模块(并且应该使用)...这是一种将 selenium 浏览器日志添加到 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")
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-06-07
        • 2023-03-12
        • 2023-02-26
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多