硒webdriver:修改navigator.webdriver标志以防止硒检测

时间:2018-10-29 05:57:08

标签: java selenium selenium-webdriver webdriver webdriver-w3c-spec

我正在尝试使用硒和铬自动化网站中的一项非常基本的任务,但是以某种方式,该网站会检测到铬是由硒驱动的,并阻止了每个请求。我怀疑该网站是否依赖诸如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,
  });

但是它仅在初始页面加载后更新属性。我认为网站会在执行脚本之前检测到该变量。

14 个答案:

答案 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)

顺便说一句,您想返回undefinedfalse是一个死胡同。

答案 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);