chrome检测到非法调试:修改Selenium中的 window.navigator.webdriver
通过 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。