使用Python Selenium操作第三方支付页面触发JSON.stringify报错
问题
使用Python的Selenium库操作第三方支付页面时,无论是调用send_keys向信用卡安全码字段输入内容,还是执行获取current_url这类基础交互操作,都会触发相同错误。更换Chrome、Edge、Firefox浏览器驱动后问题依旧,错误在操作执行前就弹出。
代码示例
from selenium import webdriver browser = webdriver.Chrome(r"C:\Users\m234234\Downloads\chromedriver_win32.exe") ... ... Element3 = browser.find_element(By.ID, 'scp_cardPage_csc_input') Element3.send_keys('231')
目标元素代码
<input autocomplete="off" maxlength="4" type="text" class="scp_text_input" name="csc" aria-required="true" aria-label="Security Code" aria-describedby="scp_cardPage_csc_error" id="scp_cardPage_csc_input" value="" size="5" onkeypress="return checkNum(event)"></input>
完整错误信息
WebDriverException: unknown error: Runtime.callFunctionOn threw exception: TypeError: JSON.stringify is not a function at buildError (<anonymous>:323:18) (Session info: chrome=113.0.5672.126)
更新说明
脚本进入第三方支付页面后,任何页面交互操作(如获取current_url)都会触发相同错误。
解决思路与方案
这个错误的核心是页面环境中JSON.stringify方法被篡改或缺失,导致Selenium底层JS调用失败——第三方支付页面通常会通过重写原生JS方法来干扰自动化工具。
绕过自动化检测:使用Chrome专属启动参数,避免页面篡改原生JS方法:
修改启动代码:from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--disable-blink-features=AutomationControlled") browser = webdriver.Chrome(executable_path=r"C:\Users\m234234\Downloads\chromedriver_win32.exe", options=options)手动恢复原生方法:如果上述参数无效,进入支付页面后立即执行JS代码恢复
JSON.stringify:# 进入支付页面后执行 browser.execute_script(""" window.JSON.stringify = function(obj) { if (typeof obj === 'object' && obj !== null) { if (Array.isArray(obj)) { return '[' + obj.map(item => window.JSON.stringify(item)).join(',') + ']'; } return '{' + Object.keys(obj).map(key => `"${key}":${window.JSON.stringify(obj[key])}`).join(',') + '}'; } return JSON.stringify(obj); }; """)模拟人工输入节奏:用ActionChains分步输入字符,降低触发页面异常检测的概率:
from selenium.webdriver.common.action_chains import ActionChains element = browser.find_element(By.ID, 'scp_cardPage_csc_input') actions = ActionChains(browser) actions.move_to_element(element).click() for char in '231': actions.send_keys(char).pause(0.1) actions.perform()严格匹配驱动与浏览器版本:确认每个浏览器的驱动版本和浏览器版本完全对应(比如Chrome 113.x必须搭配同版本的chromedriver),版本不兼容也可能引发底层JS调用异常。
内容的提问来源于stack exchange,提问作者wwhitman
相关产品推荐
相关产品推荐

