在Selenium / Python中清除Chrome浏览器日志

时间:2017-07-08 21:44:29

标签: javascript python google-chrome selenium

我有一个大型应用程序,我使用Headless Chrome,Selenium和Python来测试每个模块。我想浏览每个模块,并获取在特定模块内部生成的所有JS控制台错误。

但是,由于每个模块都位于不同的测试用例中,并且每个案例都在单独的会话中执行,因此脚本首先必须在每次测试时登录。登录过程本身会产生一些在控制台中显示的错误。在测试每个模块时,我不希望不相关的登录错误出现在日志中。

基本上,清除日志中的任何内容 - >去模块做一些事情 - >获取已添加到控制台的日志。

这不可能吗?我尝试了driver.execute_script("console.clear()"),但控制台中的消息未被删除,并且在执行某些操作并打印日志后仍然显示与登录相关的消息。

1 个答案:

答案 0 :(得分:4)

2017年和2018年末的州

日志API尚未成为官方Webdriver specification的一部分。

事实上,它是{2}规范的requested to be defined。在2017年中期,只有Chromedriver有一个无证的非标准实施该命令。

在消息来源中,没有关于清除日志的方法的痕迹:

可能的解决方法

返回的(原始)数据结构是一个如下所示的字典:

{
    u'source': u'console-api',
    u'message': u'http://localhost:7071/console.html 8:9 "error"',
    u'timestamp': 1499611688822,
    u'level': u'SEVERE'
}

它包含一个可以记住的时间戳,以便后续调用get_log()可以过滤更新的时间戳。

<强>门面

class WebdriverLogFacade(object):

    last_timestamp = 0

    def __init__(self, webdriver):
        self._webdriver = webdriver

    def get_log(self):
        last_timestamp = self.last_timestamp
        entries = self._webdriver.get_log("browser")
        filtered = []

        for entry in entries:
            # check the logged timestamp against the 
            # stored timestamp
            if entry["timestamp"] > self.last_timestamp:
                filtered.append(entry)

                # save the last timestamp only if newer 
                # in this set of logs
                if entry["timestamp"] > last_timestamp:
                    last_timestamp = entry["timestamp"]

        # store the very last timestamp
        self.last_timestamp = last_timestamp

        return filtered

<强>用法

log_facade = WebdriverLogFacade(driver)
logs = log_facade.get_log()

# more logs will be generated

logs = log_facade.get_log()
# newest log returned only