Selenium 将Puppeter中的window.navigator更改为绕过反机器人系统

Selenium 将Puppeter中的window.navigator更改为绕过反机器人系统,selenium,puppeteer,detection,Selenium,Puppeteer,Detection,我正试图让我的在线机器人无法检测。我读了很多关于如何做到这一点的文章,我把所有的技巧放在一起并加以利用。其中之一是更改window.navigator.webdriver 通过以下代码,我成功地在Puppeter中更改了window.navigator.webdriver: await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: ()

我正试图让我的在线机器人无法检测。我读了很多关于如何做到这一点的文章,我把所有的技巧放在一起并加以利用。其中之一是更改
window.navigator.webdriver

通过以下代码,我成功地在Puppeter中更改了
window.navigator.webdriver

await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
    });
});
我绕过了测试,很好:

然而,考试还是在嘲笑我:

为什么WEBDRIVER不一致?

试试这个

首先,删除该定义,如果您从原型中定义并删除,它将不起作用

Object.defineProperty(navigator, 'webdriver', ()=>{}) // <-- delete this part
结果:

它为什么有效? 直接删除只需删除对象的实例,而不是实际的定义。getter和setter仍然存在,所以浏览器可以找到它

但是,如果从实际原型中删除,它将不再存在于任何实例中

附加提示 你提到你想让你的应用程序不被检测到,有很多插件可以实现同样的效果,例如这个名为的包包含一些很酷的反机器人检测技术。有时候,只重用一些包比一遍又一遍地重新创建解决方案要好


PS:上面的解释我可能是错的,请随意指导我,这样我可以改进答案。

尝试
删除window.navigator.webdriver
,看看它是否有用。老实说,这更糟,因为
window.navigator
是只读的,
删除
甚至不会删除此对象。这就是为什么我要使用
Object.defineProperty
来覆盖它。当我删除
Object.defineProperty
并添加
delete window.navigator.webdriver时然后当我在Puppeter chromedriver中打开控制台并在控制台
窗口中写入.navigator.webdriver
时,我得到的是真的。因此,测试显然失败了。这很奇怪,但在我的环境中不起作用:你能在github/bitbucket上共享你的项目吗?这样我就可以匹配差异了?可以了,删除上面的“定义webdriver”部分。对,这是因为我多次重新定义navigator对象。非常感谢“其他提示”我不知道这个软件包的存在。还升级了
木偶特效插件隐身
delete navigator.__proto__.webdriver;