Selenium调用get_cookies报错:JSON.stringify is not a function求助
环境信息
- Selenium版本:
4.10.0 - Chrome版本:114.0.5735.91(正式版,64位)
原运行代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By My_Link = "......" DRIVER_PATH = 'I://Decoded//chromedriver.exe' s=Service(DRIVER_PATH) browser = webdriver.Chrome(service=s) browser.get(My_Link) browser.find_element(By.NAME,"USER").send_keys(r) browser.find_element(By.NAME,"PASSWORD").send_keys(d) browser.find_element(By.CSS_SELECTOR,".ButtonSm").click() cookies= browser.get_cookies()
报错信息
WebDriverException Traceback (most recent call last) <ipython-input-10-b6bb484d2c6a> in <module> 1 2 ----> 3 cookies= browser.get_cookies() WebDriverException: Message: unknown error: Runtime.callFunctionOn threw exception: TypeError: JSON.stringify is not a function at buildError (<anonymous>:323:18) (Session info: chrome=114.0.5735.91) Stacktrace: Backtrace: GetHandleVerifier [0x010CA813+48355] (No symbol) [0x0105C4B1]
异常原因
这个错误的核心是目标页面的JavaScript代码修改了全局的JSON对象,覆盖或破坏了JSON.stringify方法。Selenium的get_cookies()方法底层依赖浏览器原生的JSON.stringify来序列化cookie数据,当这个方法被页面脚本篡改后,就会抛出TypeError异常,进而触发WebDriverException。换Edge浏览器问题依旧,说明不是浏览器本身的问题,而是目标网站的页面脚本存在这个篡改行为。
解决办法
方法1:恢复原生JSON.stringify方法
在调用get_cookies()之前,执行一段JavaScript代码,重新注入原生的JSON.stringify实现:
# 在点击登录后添加这段代码 browser.execute_script(""" window.JSON.stringify = (function(original) { return function(value) { return original.call(JSON, value); }; })(window.JSON.stringify || function(){}); """) # 再获取cookies cookies = browser.get_cookies()
方法2:直接通过JS获取cookie并解析
绕过Selenium的get_cookies(),直接用JavaScript获取document.cookie,然后自己解析成字典格式:
# 执行JS获取原始cookie字符串 cookie_str = browser.execute_script("return document.cookie;") # 解析成字典列表(模拟Selenium get_cookies的格式) cookies = [] for item in cookie_str.split('; '): if '=' in item: name, value = item.split('=', 1) cookies.append({'name': name, 'value': value})
如果需要更完整的cookie字段(如domain、expiry),可以调整JS代码:
cookies = browser.execute_script(""" return document.cookie.split('; ').map(cookie => { const [name, ...valueParts] = cookie.split('='); const value = valueParts.join('='); const cookieObj = {name, value}; // 尝试获取额外属性(浏览器支持度不同) try { const cookieDetails = document.cookie.match(new RegExp(`(^| )${name}=([^;]+)`)); if (cookieDetails) { // 可扩展添加domain、path等字段 } } catch(e) {} return cookieObj; }); """)
内容的提问来源于stack exchange,提问作者NayR MiMde
相关产品推荐
相关产品推荐

