首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Selenium 4.x正确执行"Page.addScriptToEvaluateOnNewDocument“

Selenium 4.x正确执行"Page.addScriptToEvaluateOnNewDocument“
EN

Stack Overflow用户
提问于 2022-01-12 11:15:58
回答 1查看 714关注 0票数 2

我遇到了一个奇怪的问题,我真的找不到解决办法。我的生产网站需要一些测试,当然,机器人检查是启用的(不是命名它)。

在我使用"Page.addScriptToEvaluateOnNewDocument“之后的测试中,结果与我所期望的不一样。

  • 如果我直接访问铬当前选项卡中的网站,它不会通过bot检查;如果手动打开一个新选项卡并访问该网站,则
  • 将通过机器人检查。

一开始,我认为脚本没有在当前选项卡中执行,但是检查我覆盖的内容显示它们正在执行。

使用我从木偶师那里学到的这个小脚本,这两个选项卡都是通过的:

代码语言:javascript
复制
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“真的只有在一个新的选项卡中才能正确执行吗?

这对我来说是毫无意义的,为什么这是在一个新的标签中工作,而不是在当前的标签中。

当前设置和使用:

v85.0.4183.83

  • Selenium

  • Chrome +Chrome驱动程序:

  • 独立: 4.1.1

参数:

  • --no-first-run -不提供服务-自动运行-不默认-浏览器-检查-禁用-闪烁-功能=自动控制的--window-size=1280,1024

excludeSwitches:

  • allow-pre-commit-input禁用-后台-网络禁用-遮挡-windows禁用-客户端钓鱼-检测禁用-默认-应用程序禁用-挂起监视禁用-弹出屏蔽禁用-提示-重新禁用-同步启用-自动启用-闪存功能启用-登录密码-存储测试类型的use-mock-keychain

Preferences:

  • profile.default_content_setting_values.popups 1
  • profile.default_content_setting_values.cookies 1
  • profile.cookie_controls_mode 0

UseAutomationExtension:

请告诉我,我会非常感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-21 14:48:36

我已经找到解决办法了。这只是它的工作原理。赫雷。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70680610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档