用Selenium从Firefox获取console.log输出

19 投票
2 回答
31082 浏览
提问于 2025-04-18 03:50

我想通过 Python 的 Selenium 库从 Firefox 浏览器获取网页的 console.log 输出。根据 Chrome 的代码 和一些 文档中的建议,我尝试了以下代码:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities   
d = DesiredCapabilities.FIREFOX
d['loggingPrefs'] = { 'browser':'ALL' }
fp = webdriver.FirefoxProfile()
fp.set_preference('webdriver.log.file', '/tmp/firefox_console')
driver = webdriver.Firefox(capabilities=d,firefox_profile=fp)
driver.set_window_size(1280,1024)
driver.get('http://foo.com')
try:
    WebDriverWait(driver,10).until(lambda driver: driver.execute_script("return document.readyState") == "complete")
    for entry in driver.get_log('browser'):
        print entry
finally:
    driver.quit()

但是,即使是一个简单的示例页面,里面调用了 console.log("foo"),我也没有在通过 API 返回的日志条目中看到 "foo",也没有在 /tmp/firefox_console 文件中找到。请问我是不是做错了什么?还是说这是 Selenium 的一个限制?

2 个回答

2

实现方式发生了一些变化。我之前也在使用:

d = DesiredCapabilities.FIREFOX
d['loggingPrefs'] = {'browser': 'ALL'}

但现在我使用的是Python3.8和Selenium 3.4,这个方法不再有效了。可以查看另一个StackOverflow上的问题,讨论了这个情况。

否则你会遇到这个错误: selenium.common.exceptions.WebDriverException: Message: loggingPrefs 不是一个已知的能力或扩展能力的名称

6

你的代码在 get_log 函数方面是正确的,只需要在最后加一个 print 语句,像这样:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

# enable browser logging
d = DesiredCapabilities.FIREFOX
d['loggingPrefs'] = {'browser': 'ALL'}
driver = webdriver.Firefox(capabilities=d)
# load some site
driver.get('http://foo.com')
# print messages
for entry in driver.get_log('browser'):
    print entry

print

driver.quit()

实际上:

print len(driver.get_log('browser'))

在我的例子中,这段代码返回了 53,这是列表中的一个示例条目:

{u'timestamp': 1407591650751, u'message': u"Expected ':' but found '}'.  Declaration dropped.", u'level': u'WARNING'}

看起来是个字符问题。至于为什么 /tmp/firefox_console 文件没有输出,我就不清楚了,记录器似乎抛出了一些webdriver的调试信息,但没有 console.log 的输出。

编辑:显然,上面的代码并没有从 console.log 返回数据。就我所知,这不是Selenium的错误,而是Firefox的问题。我通过安装 FirebugConsoleExport 插件来解决这个问题,然后把它指向某个日志服务器。有关如何通过Selenium程序化启用Firebug的详细信息,请参见 这个SO回答

更多细节请查看这个链接: https://gist.github.com/CGenie/fc63536a8467ae6ef945

撰写回答