首页 > 技术文章 > chrome检测到非法调试:修改Selenium中的 window.navigator.webdriver

Eliphaz 2020-10-10 14:51 原文

通过 Google 的Chrome Devtools-Protocol(Chrome 开发工具协议)简称CDP,给定一段 JavaScript 代码,让 Chrome 刚刚打开页面,还没有运行网站自带的 JavaScript代码时,执行给定的代码。

使用driver.execute_cdp_cmd:根据 Selenium 的官方文档,传入需要调用的 CDP 命令和参数即可

import time
from selenium import webdriver
from selenium.webdriver import ActionChains
url = "https://www.qcc.com/user_login?back=%2F"
option = webdriver.ChromeOptions()
PROXY = "proxy_host:proxy:port"
desired_capabilities = option.to_capabilities()
desired_capabilities['proxy'] = {
    "httpProxy": PROXY,
    "ftpProxy": PROXY,
    "sslProxy": PROXY,
    "noProxy": None,
    "proxyType": "MANUAL",
    "class": "org.openqa.selenium.Proxy",
    "autodetect": False
}
option.add_experimental_option('excludeSwitches', ['enable-automation'])  # webdriver防检测
option.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=option,desired_capabilities=desired_capabilities)
# CDP执行JavaScript 代码  重定义windows.navigator.webdriver的值
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})
driver.get(url)
time.sleep(2)
driver.find_element_by_id('normalLogin').click() # 点击密码登入
time.sleep(1)
#输入账号密码
driver.find_element_by_id('nameNormal').send_keys('1341632010')
driver.find_element_by_id('pwdNormal').send_keys('HEIYUN_320')
#获取滑块
button = driver.find_element_by_id('nc_1_n1z')
# 滑动滑块
ActionChains(driver).click_and_hold(button).perform()
ActionChains(driver).move_by_offset(xoffset=308, yoffset=0).perform()
ActionChains(driver).release().perform()
driver.find_element_by_xpath('//*[@id="user_login_normal"]/button').click()
time.sleep(1)
driver.quit()

完美隐藏window.navigator.webdriver。并且,关键语句只需要执行一次,之后只要你不关闭这个driver开启的窗口,无论你打开多少个网址,他都会自动提前在网站自带的所有 js 之前执行这个语句,隐藏window.navigator.webdriver。

推荐阅读