如何用Selenium WebDriver+Python获取浏览器控制台错误?捕获失败求助
嘿,我来帮你排查这个问题!你现在用Selenium尝试抓取目标网站的控制台错误,但调用driver.get_log('browser')只拿到了同步XMLHttpRequest的弃用警告,driver.get_log('driver')还出现了DevTools连接断开的提示,完全没捕获到想要的控制台错误,对吧?
你当前的日志输出情况:
- 执行
driver.get_log('browser')得到:
[{u'source': u'deprecation', u'message': u"https://xxxxx/static/vendor/vendor.bundle.js?v=16 902 Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.", u'timestamp': 1515593047810, u'level': u'WARNING'}]
- 执行
driver.get_log('driver')得到:
[{u'timestamp': 1515593061561, u'message': u'Unable to evaluate script: disconnected: not connected to DevTools\n', u'level': u'WARNING'}, {u'timestamp': 1515593071847, u'message': u'Unable to evaluate script: disconnected: not connected to DevTools\n', u'level': u'WARNING'}]
你当前使用的代码:
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities capabilities = DesiredCapabilities.CHROME capabilities['loggingPrefs'] = { 'browser':'ALL' } driver = webdriver.Chrome(desired_capabilities=capabilities) driver.get('url') elem = driver.find_element_by_id('username') elem.send_keys('xxxx') elem1 = driver.find_element_by_name('password') elem1.send_keys('xxxx') elem2 = driver.find_element_by_class_name('btn-info') elem2.click() driver.get('url') for entry in driver.get_log('browser'): print entry的内容
解决方案:
我整理了几个关键点,你可以一步步排查:
1. 优先解决ChromeDriver与Chrome版本不匹配的问题
你看到的Unable to evaluate script: disconnected: not connected to DevTools警告,大概率是ChromeDriver和Chrome浏览器版本不兼容导致的。先检查你的Chrome浏览器版本(设置→关于Chrome),然后下载完全对应版本的ChromeDriver替换掉当前使用的版本,这是解决DevTools连接问题的核心。
2. 调整日志捕获策略,精准过滤错误级别
你当前设置loggingPrefs为'ALL'会捕获所有级别的日志,但可以尝试明确指定捕获ERROR级别的日志,或者后续在代码中过滤:
# 方式1:只捕获严重/错误级别的日志 capabilities['loggingPrefs'] = {'browser': 'SEVERE'} # 方式2:捕获所有日志后过滤出ERROR级别 browser_logs = driver.get_log('browser') error_logs = [log for log in browser_logs if log['level'] == 'ERROR'] for log in error_logs: print(f"时间戳: {log['timestamp']}, 来源: {log['source']}, 错误信息: {log['message']}")
3. 等待页面完全加载后再获取日志
你在点击登录后直接调用driver.get('url')然后立刻拿日志,很可能页面还没完全渲染、脚本还没执行完毕,导致错误日志还没生成。可以添加显式等待确保页面加载完成:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 点击登录后,等待页面核心元素加载完成(替换成你目标页面的元素ID/选择器) WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "page-main-content"))) # 或者等待页面状态为complete WebDriverWait(driver, 10).until(lambda d: d.execute_script('return document.readyState') == 'complete') # 之后再获取日志 browser_logs = driver.get_log('browser')
4. 检查错误是否来自iframe
如果目标网站的控制台错误是在iframe内部产生的,你需要先切换到对应的iframe再获取日志:
# 切换到目标iframe(可以用索引、ID或元素定位) driver.switch_to.frame(driver.find_element_by_id("iframe-id")) # 获取iframe内的日志 iframe_error_logs = [log for log in driver.get_log('browser') if log['level'] == 'ERROR'] # 切回主文档 driver.switch_to.default_content()
内容的提问来源于stack exchange,提问作者Anusha Konduru

