我遇到了一个奇怪的问题,我真的找不到解决方案。我的生产网站需要一些测试,当然机器人检查已经启用(没有命名(。
在我使用">Page.addScriptToEvaluateOnNewDocument";,结果不是我所期望的。
- 如果我直接访问Chromium当前选项卡中的网站,它将无法通过机器人程序检查
- 如果我手动打开一个新标签并访问网站,它就会通过机器人程序检查
起初我以为脚本没有在当前选项卡中执行,但检查我覆盖的内容会发现它们是。
使用我从木偶师那里得到的这个小脚本在两个选项卡中都是通过的:
async function test() {
const results = {}
async function test(name, fn) {
const detectionPassed = await fn()
if (detectionPassed) {
console.log(`WARNING: Chrome headless detected via ${name}`)
} else {
console.log(`PASS: Chrome headless NOT detected via ${name}`)
}
results[name] = detectionPassed
}
await test('userAgent', _ => {
return /HeadlessChrome/.test(window.navigator.userAgent)
})
// Detects the --enable-automation || --headless flags
// Will return true in headful if --enable-automation is provided
await test('navigator.webdriver present', _ => {
return 'webdriver' in navigator
})
await test('window.chrome missing', _ => {
return /Chrome/.test(window.navigator.userAgent) && !window.chrome
})
await test('permissions API', async _ => {
const permissionStatus = await navigator.permissions.query({
name: 'notifications'
})
// eslint-disable-next-line
return (
Notification.permission === 'denied' && // eslint-disable-line no-undef
permissionStatus.state === 'prompt'
)
})
await test('permissions API overriden', _ => {
const permissions = window.navigator.permissions
if (permissions.query.toString() !== 'function query() { [native code] }')
return true
if (
permissions.query.toString.toString() !==
'function toString() { [native code] }'
)
return true
if (
permissions.query.toString.hasOwnProperty('[[Handler]]') && // eslint-disable-line no-prototype-builtins
permissions.query.toString.hasOwnProperty('[[Target]]') && // eslint-disable-line no-prototype-builtins
permissions.query.toString.hasOwnProperty('[[IsRevoked]]') // eslint-disable-line no-prototype-builtins
)
return true
if (permissions.hasOwnProperty('query')) return true // eslint-disable-line no-prototype-builtins
})
await test('navigator.plugins empty', _ => {
return navigator.plugins.length === 0
})
await test('navigator.languages blank', _ => {
return navigator.languages === ''
})
await test('iFrame for fresh window object', _ => {
// evaluateOnNewDocument scripts don't apply within [srcdoc] (or [sandbox]) iframes
// https://github.com/GoogleChrome/puppeteer/issues/1106#issuecomment-359313898
const iframe = document.createElement('iframe')
iframe.srcdoc = 'page intentionally left blank'
document.body.appendChild(iframe)
// Here we would need to rerun all tests with `iframe.contentWindow` as `window`
// Example:
return iframe.contentWindow.navigator.plugins.length === 0
})
// This detects that a devtools protocol agent is attached.
// So it will also pass true in headful Chrome if the devtools window is attached
await test('toString', _ => {
let gotYou = 0
const spooky = /./
spooky.toString = function() {
gotYou++
return 'spooky'
}
console.debug(spooky)
return gotYou > 1
})
return results
};
test();
我的问题是Page.addScriptToEvaluateOnNewDocument;真的只在新的选项卡中正确执行吗?
为什么这在一个新的选项卡中而不是在当前的选项卡中工作,我真的没有道理。
当前设置和用法:
- Chrome+Chrome驱动程序:v85.0.4183.83
- 硒独立:4.1.1
参数:
- --无首次运行--无服务自动运行--无默认浏览器检查--禁用闪烁功能=自动控制--窗口大小=12801024
排除开关:
- 允许预提交输入禁用后台网络禁用背景遮挡的窗口禁用客户端网络钓鱼检测禁用默认应用禁用挂起监视器禁用弹出窗口阻止禁用转发提示禁用同步启用自动化启用闪烁功能启用日志记录密码存储测试类型使用mock密钥链
首选项:
- profile.default_conten_setting_values.Popup 1
- profile.default_content_setting_values.cookies 1
- profile.cookie_controls_mode 0
使用自动化扩展:错误
请告知,我将不胜感激。
我已经找到了解决方案。这就是它的工作原理。Hurray。