Node.js chromedevtools协议:switch';主动';框架
我使用的是Chrome无头和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远程接口
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中执行,但由于安全性的原因,不确定它是否可行。虽然这两种方法都不像在其他自动化工具中那样方便(即使它们可以工作)切换当前活动帧。您是否找到过解决此问题的方法?