随着chrome版本的更新,原先的方法("excludeSwitches","enable-automation");已经失效
针对最新版本的Chrome,我们需要selenium调用CDP命令来覆盖webdriver的值,不能调用执行 js代码 ,因为当selenium执行的时候,网页已经加载完了, 也就意味着网站本身的js已经读取完了window.navigator.webdriver的值了,所以并没有用.
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.0.0-alpha-7</version> </dependency>
selenium的版本一定要用4.0以上的版本,要不然不支持的
public static void main(String[] args) throws Exception { System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe"); ChromeOptions options = new ChromeOptions(); Map<String, Object> prefs = new HashMap<>(); prefs.put("excludeSwitches","enable-automation"); prefs.put("useAutomationExtension",false); options.setExperimentalOption("prefs", prefs); ChromeDriver chromeDriver = new ChromeDriver(options); Map<String, Object> parameters = new HashMap<>(); parameters.put("source"," Object.defineProperty(navigator, 'webdriver', {\n" + " get: () => undefined\n" + " })"); chromeDriver.executeCdpCommand("Page.addScriptToEvaluateOnNewDocument",parameters); chromeDriver.get("https://www.baidu.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='./chromedriver') driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ }) driver.get('http://exercise.kingname.info')
最终结果:
原理:
我们可以通过这个命令来实现, 让Chrome在每打开一个页面,运行网站自身的js代码之前执行我们给定的js的代码,我们的代码就是覆盖window.navigator.webdriver的值为undefined.
2020-12-30
目前没法做到对新建的标签生效了, 只能对当前的标签有效!
参考文章:
还没有评论,来说两句吧...