我正在尝试使用硒和铬自动化网站中的一项非常基本的任务,但是以某种方式,该网站会检测到铬是由硒驱动的,并阻止了每个请求。我怀疑该网站是否依赖诸如https://stackoverflow.com/a/41904453/648236这样的公开DOM变量来检测硒驱动的浏览器。
我的问题是,有没有办法使navigator.webdriver标志为假?我愿意尝试修改后重新尝试编译硒源,但是似乎无法在存储库https://github.com/SeleniumHQ/selenium
中的任何地方找到NavigatorAutomationInformation源。非常感谢您的帮助
P.S:我还尝试了https://w3c.github.io/webdriver/#interface
中的以下内容Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});
但是它仅在初始页面加载后更新属性。我认为网站会在执行脚本之前检测到该变量。
答案 0 :(得分:38)
ChromeDriver :
最后通过一个简单的标志找到了简单的解决方案! :)
--disable-blink-features=AutomationControlled
navigator.webdriver = true 将不再显示带有该标志的设置。
有关您可以禁用的功能的列表,check them out here
答案 1 :(得分:19)
请勿使用cdp命令更改webdriver的值,因为这将导致不一致,以后可用于检测webdriver。使用以下代码,这将删除任何webdriver痕迹。
options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")
答案 2 :(得分:13)
要排除在2019年11月6日更新的投票最多的答案中提到的启用自动化开关的集合,从2020年4月起不再起作用。相反,我遇到了以下错误:
ERROR:broker_win.cc(55)] Error reading broker pipe: The pipe has been ended. (0x6D)
这是截至2020年4月6日使用Chrome 80的功能。
之前(在Chrome控制台窗口中):
> navigator.webdriver
true
Python示例:
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")
之后(在Chrome控制台窗口中):
> navigator.webdriver
undefined
答案 3 :(得分:5)
您看对了。您所提到的答案指出了在最近两年中不断发展的 2017年 W3C编辑器草案状态。当前的实现严格地说:
用户代理中,
webdriver-active
标志设置为true
处于远程控制之下,该控件最初设置为false
。
进一步
Navigator includes NavigatorAutomationInformation;
请注意:
NavigatorAutomationInformation
界面不应在 WorkerNavigator 上公开。
NavigatorAutomationInformation
界面定义为:
interface mixin NavigatorAutomationInformation {
readonly attribute boolean webdriver;
};
如果设置了webdriver-active
flag ,则返回 true ,否则返回false。
最后, navigator.webdriver
定义了一种标准方法,用于使用户代理合作通知文档它由 WebDriver 控制,以便使用备用代码路径可以在自动化过程中触发。
更改任何这些参数都可能阻止导航并获取检测到的 WebDriver 实例。
答案 4 :(得分:4)
最后,这解决了ChromeDriver(Chrome大于v79)的问题。
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-blink-features");
options.addArguments("--disable-blink-features=AutomationControlled");
ChromeDriver driver = new ChromeDriver(options);
Map<String, Object> params = new HashMap<String, Object>();
params.put("source", "Object.defineProperty(navigator, 'webdriver', { get: () => undefined })");
driver.executeCdpCommand("Page.addScriptToEvaluateOnNewDocument", params);
答案 5 :(得分:3)
python 的简单破解:
./gradlew clean
答案 6 :(得分:1)
我想为 pguardiario
提到的cdp命令方法添加Java替代方法Map<String, Object> params = new HashMap<String, Object>();
params.put("source", "Object.defineProperty(navigator, 'webdriver', { get: () => undefined })");
driver.executeCdpCommand("Page.addScriptToEvaluateOnNewDocument", params);
为此,您需要使用org.openqa.selenium.chromium.ChromiumDriver
软件包中的ChromiumDriver。据我所知,该软件包不包含在Selenium 3.141.59中,因此我使用了Selenium 4 alpha。
此外,对于ChromeDriver 79和Chrome 79,excludeSwitches / useAutomationExtension实验选项似乎不再适用于我。
答案 7 :(得分:0)
之前(在浏览器控制台窗口中):
> navigator.webdriver
true
更改(硒C#中):
var options = new ChromeOptions();
options.AddExcludedArguments(new List<string>() { "enable-automation" });
之后(在浏览器控制台窗口中):
> navigator.webdriver
undefined
答案 8 :(得分:0)
如今,您可以使用cdp命令完成此操作:
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
driver.get(some_url)
顺便说一句,您想返回undefined
,false
是一个死胡同。
答案 9 :(得分:0)
如果使用远程Web驱动程序,则下面的代码会将navigator.webdriver
设置为undefined
。
用于 ChromeDriver 81.0.4044.122
的工作Python示例:
options = webdriver.ChromeOptions()
# options.add_argument("--headless")
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
driver = webdriver.Remote(
'localhost:9515', desired_capabilities=options.to_capabilities())
script = '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
'''
driver.execute_script(script)
答案 10 :(得分:0)
如上面的评论所述-https://stackoverflow.com/a/60403652/2923098,以下选项对我来说完全有效(在Java中为 )-
ChromeOptions options = new ChromeOptions();
options.addArguments("--incognito", "--disable-blink-features=AutomationControlled");
答案 11 :(得分:0)
对于那些尝试过这些技巧的人,请确保还检查您使用的用户代理是否是与您的搜寻器所针对的平台(移动/台式机/平板电脑)相对应的用户代理。仿真。我花了一段时间才意识到那是我的致命弱点;)
答案 12 :(得分:0)
使用 --disable-blink-features=AutomationControlled
禁用 navigator.webdriver
答案 13 :(得分:-1)
尝试更改用户代理
类似的东西:
ChromeOptions options = new ChromeOptions();
options.addArguments("user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.50 Safari/537.36");
ChromeDriver driver = new ChromeDriver(options);