Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Selenium webdriver:修改navigator.webdriver标志以防止Selenium检测_Java_Selenium_Selenium Webdriver_Webdriver_Webdriver W3c Spec_Google Chrome Devtools_User Agent - Fatal编程技术网

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

Java Selenium webdriver:修改navigator.webdriver标志以防止Selenium检测,java,selenium,selenium-webdriver,webdriver,webdriver-w3c-spec,google-chrome-devtools,user-agent,Java,Selenium,Selenium Webdriver,Webdriver,Webdriver W3c Spec,Google Chrome Devtools,User Agent,我试图在一个使用selenium和chrome的网站中自动化一个非常基本的任务,但不知何故,该网站会检测到何时chrome由selenium驱动并阻止每个请求。我怀疑该网站依赖于一个公开的DOM变量,比如这个变量来检测selenium驱动的浏览器 我的问题是,有没有办法使navigator.webdriver标志为false?我愿意在修改后尝试重新编译selenium源代码,但我似乎在存储库中的任何地方都找不到NavigatorAutomationInformation源代码 非常感谢您的帮助

我试图在一个使用selenium和chrome的网站中自动化一个非常基本的任务,但不知何故,该网站会检测到何时chrome由selenium驱动并阻止每个请求。我怀疑该网站依赖于一个公开的DOM变量,比如这个变量来检测selenium驱动的浏览器

我的问题是,有没有办法使navigator.webdriver标志为false?我愿意在修改后尝试重新编译selenium源代码,但我似乎在存储库中的任何地方都找不到NavigatorAutomationInformation源代码

非常感谢您的帮助

附言:我也试过以下方法

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

首先更新1
:有了
execute\u cdp\u cmd(cmd,cmd\u args)
命令,现在您可以使用。使用此功能,您可以轻松修改
navigator.webdriver
,以防止检测到Selenium


防止侦测2 为了防止Selenium驱动的WebDriver被检测到,一种利基方法将包括以下任一/所有步骤:

  • 添加论点

您可以在中找到相关的详细讨论

  • 通过
    旋转执行\u cdp\u cmd()
    命令,如下所示:

    #Setting up Chrome/83.0.4103.53 as useragent
    driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
    
  • webdriver的
    导航器的属性值更改为未定义

    driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
    
  • 排除
    启用自动化
    开关的集合

    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    
  • 关闭
    使用AutomationExtension

    options.add_experimental_option('useAutomationExtension', False)
    

示例代码3 完成上述所有步骤,有效代码块将为:

from selenium import webdriver

options = webdriver.ChromeOptions() 
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
print(driver.execute_script("return navigator.userAgent;"))
driver.get('https://www.httpbin.org/headers')

历史 根据W3C编辑器的草案,当前实施严格提到:

当用户代理处于远程控制下时,
标志设置为
true
,该标志最初设置为
false

此外

Navigator includes NavigatorAutomationInformation;
需要注意的是:

导航器自动信息
界面不应暴露在WorkerNavigator

导航器自动信息接口定义为:

interface mixin NavigatorAutomationInformation {
    readonly attribute boolean webdriver;
};
如果设置了
webdriver active
标志,则返回
true
,否则返回false


最后,
navigator.webdriver
为合作用户代理定义了一种标准方式,告知文档它由webdriver控制,以便在自动化过程中触发备用代码路径

注意:更改/调整上述参数可能会阻止导航并检测到WebDriver实例


更新(2019年11月6日) 在当前的实现中,访问网页而不被检测到的理想方法是使用
ChromeOptions()
类添加几个参数:

  • 排除
    启用自动化
    开关的集合
  • 关闭
    使用AutomationExtension
通过
ChromeOptions
的实例,如下所示:

#Setting up Chrome/83.0.4103.53 as useragent
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
  • Java示例:

    System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
    options.setExperimentalOption("useAutomationExtension", false);
    WebDriver driver =  new ChromeDriver(options);
    driver.get("https://www.google.com/");
    
  • Python示例

    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\path\to\chromedriver.exe')
    driver.get("https://www.google.com/")
    

传说 1:仅适用于Selenium的Python客户端

2:仅适用于Selenium的Python客户端

3:仅适用于Selenium的Python客户端。

之前(在浏览器控制台窗口中):

变化(以硒计):

这不适用于ChromeDriver 79.0.3945.16及以上版本。请参阅发行说明


现在,您可以使用cdp命令来完成此任务:

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})

driver.get(some_url)

顺便说一句,如果您想返回
未定义的
false
是一个绝对免费的方法。

我想添加一个Java替代方法,以取代pguardiario

Map<String, Object> params = new HashMap<String, Object>();
params.put("source", "Object.defineProperty(navigator, 'webdriver', { get: () => undefined })");
driver.executeCdpCommand("Page.addScriptToEvaluateOnNewDocument", params);
Map params=newhashmap();
put(“source”、“Object.defineProperty(navigator,'webdriver',{get:()=>undefined})”;
driver.executecdp命令(“Page.addscripttoevaluationnewdocument”,params);
为了实现这一点,您需要使用
org.openqa.selenium.ChromiumDriver
包中的ChromiumDriver。据我所知,Selenium 3.141.59中没有包含该软件包,因此我使用了Selenium 4 alpha


此外,ExcludeSwitchs/useAutomationExtension实验选项似乎不再适用于ChromeDriver 79和Chrome 79。

ChromeDriver

终于找到了一个简单的解决方案,带有一个简单的标志!:)

navigator.webdriver=true将不再显示该标志集


对于可以禁用的内容列表,

最终解决了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);
ChromeOptions选项=新的ChromeOptions();
options.addArguments(“--disable blink features”);
options.addArguments(“--disable blink features=AutomationControlled”);
ChromeDriver驱动程序=新的ChromeDriver(选项);
Map params=新的HashMap();
put(“source”、“Object.defineProperty(navigator,'webdriver',{get:()=>undefined})”;
driver.executecdp命令(“Page.addscripttoevaluationnewdocument”,params);

从2020年4月起,排除2019年11月6日更新投票结果中提到的启用自动开关集合不再有效。相反,我得到了以下错误:

ERROR:broker_win.cc(55)] Error reading broker pipe: The pipe has been ended. (0x6D)
以下是截至2020年4月6日Chrome 80的运行情况

之前(在Chrome控制台窗口中):

Python示例:

options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")
    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)
之后(在Chrome控制台窗口中):


如果使用远程Webdriver,下面的代码将
navigator.Webdriver
设置为
undefined

C工作
--disable-blink-features=AutomationControlled
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);
ERROR:broker_win.cc(55)] Error reading broker pipe: The pipe has been ended. (0x6D)
> navigator.webdriver
true
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")
> navigator.webdriver
undefined
    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)
options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")
ChromeOptions options = new ChromeOptions();
options.addArguments("--incognito", "--disable-blink-features=AutomationControlled");
options = webdriver.ChromeOptions()    
options.add_argument("--disable-blink-features=AutomationControlled")