西门吹*_*门吹雪 2 java selenium google-chrome webdriver selenium-chromedriver
我正在使用 selenium chromeDriver 进行自动化测试。但我不能“隐藏”该window.navigator.webdriver
财产。当我通过驱动程序打开 chrome(v64-80.0.3987.100) 时,在控制台中查看时它总是返回 true。这是我的代码:
System.setProperty("webdriver.firefox.marionette", "false");
System.setProperty("webdriver.chrome.driver", webDriverPath);
ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox");
options.addArguments("--disable-extensions");
options.addArguments("--blink-settings=imagesEnabled=false");
options.addArguments("--disable-infobars");
options.addArguments("--disable-dev-shm-usage");
options.setExperimentalOption("useAutomationExtension", false);
options.addArguments("--incognito");
options.addArguments("--start-maximized");
options.setExperimentalOption("excludeSwitches", new String[]{"enable-automation"});
options.addArguments("--lang=zh-CN,zh,en");
options.addArguments("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36");
options.addArguments("--window-size=1920,1080");
ChromeDriver driver = new ChromeDriver(options);
driver.executeScript("Object.defineProperty(navigator, \"webdriver\", {\n" + " get() { return undefined; },\n" + " set(v) { return v; },\n" + " configurable: true,\n" + " enumerable: false\n" + "});");
driver.manage().timeouts().pageLoadTimeout(30L, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(5L, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)
如果我使用较低版本的 chrome(如 v64-76.0.3809.100),它会返回 undefined。谁能帮我?
W3C WebDriver 规范window.navigator.webdriver
要求该属性的存在。它既是一项安全功能,也是一项允许更好地测试网页的功能。如果您尝试使用 WebDriver 驱动的机器人自动化页面,并且您不拥有正在自动化的页面,并且您试图向页面所有者隐藏您正在使用机器人的事实,那正是这种情况财产打算公开的东西。
看起来 Chrome 和 chromedriver 的开发者现在已经关闭了他们在之前版本中允许的安全漏洞。我想您可以构建自己的浏览器和驱动程序的黑客版本,以便在使用 WebDriver 浏览网站时不设置该属性,但这将是唯一的方法。
作为社论评论,试图隐藏由 WebDriver 驱动的机器人的浏览通常是愚蠢的差事。有多种方法可以在navigator.webdriver
财产之外检测此类机器人,并且几乎不可能将它们全部屏蔽。即使它看起来工作了一段时间,最终,有问题的站点也会提出更多的检测机制。此外,此类活动很可能违反了几乎任何人们愿意尝试的站点的服务条款。找到另一种实现目标的机制会好得多。