如何通过Python+Selenium的execute_script获取JS控制台响应状态码?
如何通过Selenium验证fetch请求的403状态码
我用Selenium的execute_script()在Chrome控制台发送JS fetch请求,请求能正常执行,但想写个函数验证响应是403状态码。有没有内置的Selenium函数/库可以提取状态码或响应来做断言验证?
当前代码:
send_request = """ fetch(url, { method: 'POST', body: '', headers: headers, }) .then(res => { console.log(res.status) return res.json() }) .then( (result) => { console.log(result) }, (error) => { console.error(error) } )""" context.browser.execute_script(send_request)
Selenium没有直接提取fetch响应状态码的内置函数,但可以修改你注入的JS代码,让它返回响应的状态码,之后在Python代码里接收这个返回值并做断言验证。
修改方案
- 调整fetch的JS逻辑,去掉冗余的日志输出,在第一个
then回调里直接返回res.status;同时增加异常捕获,处理请求失败的情况。 - 执行脚本时接收返回的状态码,用断言验证是否符合预期。
修改后的完整代码
send_request = """ return fetch(url, { method: 'POST', body: '', headers: headers, }) .then(res => { return res.status; // 直接返回状态码供Selenium接收 }) .catch(error => { console.error(error); return -1; // 用特定值标记请求失败场景 }); """ # 执行脚本并获取返回的状态码 response_status = context.browser.execute_script(send_request) # 断言状态码为403 assert response_status == 403, f"预期状态码403,实际得到{response_status}"
额外说明
- 如果需要同时获取响应体和状态码,可以让JS返回一个包含两者的对象,注意要使用
async/await处理异步逻辑:return (async () => { try { const res = await fetch(url, { method: 'POST', body: '', headers: headers, }); return {status: res.status, body: await res.json()}; } catch (error) { console.error(error); return {status: -1, body: null}; } })(); - 异常捕获能避免因网络错误、跨域问题等场景导致断言逻辑直接报错,让测试更健壮。
内容的提问来源于stack exchange,提问作者Ashton Becher
相关产品推荐
相关产品推荐

