使用Selenium发送JS POST请求提示XMLHttpRequest未定义问题求助
问题成因
- 核心原因是你执行了
js = js.replace(" ", "")操作,把JS代码里的所有空格都删除了,原本的new XMLHttpRequest()被拼接为newXMLHttpRequest(),浏览器会把这一整串识别为未定义的自定义变量,直接触发未定义报错。 - 小概率场景是调用
driver.execute_script时页面还未完成加载,浏览器上下文的全局XMLHttpRequest对象还未初始化完成。
解决办法
- 首先删除多余的全量空格替换逻辑,不需要对JS字符串做空格清洗,仅保留换行替换即可,原生多行JS代码可以直接在
execute_script中正常运行。 - 执行JS前可以增加页面加载状态判断,确保上下文初始化完成:可以增加
driver.implicitly_wait(3),或者先执行JS判断document.readyState == 'complete'后再发起请求。 - 更稳妥的替代方案是使用fetch发送请求,语法更简洁,也不会出现空格导致的语法异常,参考代码如下:
js = ''' return fetch('https://www.ti.com.cn/occservices/v2/ti/addtocart', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "cartRequestList": [{ "packageOption": null, "opnId": "%s", "quantity": "%d", "tiAddtoCartSource": "store-pdp", "dienCode": "", "year": "", "week": "", "batchCode": "", "pcrCode": "", "sparam": "" }], "currency": "CNY" }) }).then(res => res.text()) ''' % (product['opn'], product['num']) resp = driver.execute_script(js) return resp
内容的提问来源于stack exchange,提问作者Nana7mi
相关产品推荐
相关产品推荐

