我正在尝试使用 selenium 和 chrome 在网站中自动执行一项非常基本的任务,但网站会以某种方式检测到 chrome 何时由 selenium 驱动并阻止每个请求。我怀疑该网站依赖于像这样的公开 DOM 变量 https://stackoverflow.com/a/41904453/648236 来检测硒驱动的浏览器。
我的问题是,有没有办法让 navigator.webdriver 标志为 false?我愿意在修改后尝试重新编译硒源,但我似乎无法在存储库 https://github.com/SeleniumHQ/selenium 的任何地方找到 NavigatorAutomationInformation 源
任何帮助深表感谢
PS:我还从 https://w3c.github.io/webdriver/#interface 尝试了以下内容
Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});
但它只在初始页面加载后更新属性。我认为该站点在我的脚本执行之前检测到变量。
原文由 Ajanth 发布,翻译遵循 CC BY-SA 4.0 许可协议
首先是更新1
execute_cdp_cmd()
:随着execute_cdp_cmd(cmd, cmd_args)
命令的可用性,您现在可以使用 Selenium 轻松执行 google-chrome-devtools 命令。使用此功能,您可以轻松修改navigator.webdriver
以防止检测到 Selenium。防止检测2
为了防止检测到 Selenium 驱动的 WebDriver ,一种利基方法将包括以下任一/所有步骤:
execute_cdp_cmd()
命令旋转 用户代理,如下所示:navigator
的 属性 值更改为 undefinedenable-automation
开关的集合useAutomationExtension
示例代码3
结合上述所有步骤和有效的代码块将是:
历史
根据 W3C Editor’s Draft ,当前的实现严格提到:
更远,
需要注意的是:
NavigatorAutomationInformation
接口 定义为:返回
true
如果设置webdriver-active
_标志_,否则返回 false。最后,
navigator.webdriver
定义了一种标准方式,用于协作用户代理通知文档它由 WebDriver 控制,以便在自动化期间可以触发备用代码路径。更新(2019 年 11 月 6 日)
在当前实现中,访问网页而不被检测到的理想方法是使用
ChromeOptions()
类添加几个参数:enable-automation
开关的集合useAutomationExtension
通过实例
ChromeOptions
如下:传说
1 :仅适用于 Selenium 的 Python 客户端。
2 :仅适用于 Selenium 的 Python 客户端。
3 :仅适用于 Selenium 的 Python 客户端。