提问人:angus_thermopylae 提问时间:10/25/2023 最后编辑:angus_thermopylae 更新时间:10/28/2023 访问量:53
Chrome Devtools 协议:Runtime.evaluate 执行问题
Chrome Devtools Protocol: Runtime.evaluate execution problem
问:
我正在维护一个测试框架,我们一直在使用它来评估我们的 Web UI,它基于 MasterDevs C# 库的一个分支。为了赶上一些安全修复程序,我不得不将我们的无头 chrome 可执行文件更新到最新版本。
在完成参数更改和可用的更新选项之后,我还有最后一个我无法弄清楚的问题:当我尝试运行一个简单的 JS 表达式时,例如我总是得到相同的响应:document.body.outerHTML
{
"id": 13,
"error": {
"code": -32000,
"message": "Execution was terminated"
}
}
我总是在尝试运行它之前执行它,并且我已经指定了执行上下文 id、帧 id 值并附加到目标,并尝试了各种建议的选项组合。Runtime.enable
最后,我安装了 Selenium 以运行相同的设置并使用 Wireshark 进行窃听,并注意到 Selenium 很早就从响应中获取会话 ID,并几乎每个命令都发送了会话 ID。我尝试做同样的事情,现在唯一的区别是我得到了 sessionId 回显(就像在 Selenium 中一样),如下所示:Target.attachToTarget
{
"id": 13,
"error": {
"code": -32000,
"message": "Execution was terminated"
},
"sessionId": "086FCC1BC3D0825D2B2C1A08742190CD"
}
我还仔细研究了我能找到的所有命令行开关和选项(以防有一些我不知道的安全设置),但无济于事。为了彻底起见,这是我在 Linux 上用来运行下载的 chrome 包的脚本:
#!/bin/bash
./chrome-linux/chrome --remote-debugging-port=9720 --disable-gpu --bwsi --no-first-run --enable-automation --disable-notifications --remote-allow-origins=* --disable-client-side-phishing-detection --disable-sync --disable-features=ChromeWhatsNewUI
除了挖掘 Chromium 源代码的演出和演出之外,我不知所措。“执行已终止”和“-32000”似乎都没有通过论坛或网络搜索与CDP一起出现在任何地方。
提前致谢, 大卫
答:
所以,万一其他人遇到这个问题,我的一位同事帮我弄清楚了核心问题。
在这种情况下,问题与协议没有直接关系,而是与 Runtime.evaluate 请求的序列化有关。
基本上,生成器没有正确处理 Runtime.evaluate 命令中的可选属性,因此它在后台发送了零超时(即使我们从未设置过该属性)。timeout
我本来想发送(并以为我正在发送)
{
"command":"Runtime.evaluate",
"params": {
"expression": "document.body.outerHTML"
}
}
但相反,我正在发送
{
"command":"Runtime.evaluate",
"params": {
"expression": "document.body.outerHTML",
"timeout": 0
}
}
这(并非不合理)意味着立即停止等待完成(“执行已终止”)。
我把属性改成了
public double? Timeout {get; set;}
这修复了它。
希望这能为其他人节省解决此类问题的时间。
评论