Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js chromedevtools协议:switch';主动';框架_Node.js_Google Chrome_Selenium_Google Chrome Devtools_Nightwatch.js - Fatal编程技术网

Node.js chromedevtools协议:switch';主动';框架

Node.js chromedevtools协议:switch';主动';框架,node.js,google-chrome,selenium,google-chrome-devtools,nightwatch.js,Node.js,Google Chrome,Selenium,Google Chrome Devtools,Nightwatch.js,我使用的是Chrome无头和Chrome远程接口npm软件包 const chromeLauncher = require('chrome-launcher') const CDP = require('chrome-remote-interface') const fs = require('fs') async function launchChrome() { return chromeLauncher.launch({ port: 9222, chromeFlags

我使用的是Chrome无头和
Chrome远程接口
npm软件包

const chromeLauncher = require('chrome-launcher')
const CDP = require('chrome-remote-interface')
const fs = require('fs')

async function launchChrome() {
  return chromeLauncher.launch({
    port: 9222,
    chromeFlags: ['--disable-gpu', '--headless']
  })
}

(async function () {
    const chrome = await launchChrome()
    const client = await CDP({port: 9222})
    const {Page} = client
    await Page.enable()
    await Page.navigate({url: 'http://...'})
    await Page.loadEventFired()
    const {data} = await Page.captureScreenshot()
    fs.writeFileSync('screenshot.png', Buffer.from(data, 'base64'))
    await protocol.close()
    await chrome.kill()
})()
但是我正在加载的页面包含一个iframe,我想在截图之前在其中执行一些操作(单击一些元素或通过DOM.querySelector访问它们)


是否可以通过Chrome DevTools协议以某种方式切换当前的“活动”帧?就像在Nightwatch.js/Selenium中一样:
browser.frame(frameIndex)

我自己也没有尝试过,但是现在我想说的是,通过DOM.querySelector获取iframe节点,然后使用iframe.contentDocument作为后续DOM的基础节点。querySelector.DOM.querySelector(All)只返回nodeId,因此,没有contentDocument。我试过这样的方法:
const-iframes=await-client.DOM.querySelectorAll({nodeId:root.root.nodeId,选择器:'iframe'});const buttons=wait client.DOM.querySelectorAll({nodeId:iframes.nodeIds[0],selector:'.some button'})
但它返回一个空数组您可能可以通过DOM.resolveNode或dig DOM.getDocument结果手动获取节点引用。我不确定是否确实需要JavaScript节点引用。我想要的是单击iframe中的一个按钮。我在考虑两种方法:1)获取按钮的nodeId(不知道如何),通过DOM.getBoxModel找到它的坐标,调用Input.DispatchMouseeEvent(x,y)2)另一种方法是通过Runtime.evaluate(someJS)从浏览器内部的JavaScript中执行,但由于安全性的原因,不确定它是否可行。虽然这两种方法都不像在其他自动化工具中那样方便(即使它们可以工作)切换当前活动帧。您是否找到过解决此问题的方法?