【发布时间】:2018-01-20 02:19:00
【问题描述】:
需要完成:我需要模拟跨网站链的用户交互(旅程)。
问题:您对如何以编程方式控制因模拟点击而打开的标签页有什么技巧吗?
我的经验: 我正在使用 chrome-remote-interface npm 包。 我可以使用自定义 ChromeController 类来模拟点击,该类初始化 chrome-remote-interface 和这些方法:
async simulateClick(selector) {
return await this.evaluate(function (selector) {
document.querySelector(selector).click()
}, selector);
}
/**
* Shamelessly stolen from simple-headless-browser
*/
async evaluate (fn, ...args) {
const exp = args && args.length > 0 ? `(${String(fn)}).apply(null, ${JSON.stringify(args)})` : `(${String(fn)}).apply(null)`
const result = await this.client.Runtime.evaluate({
expression: exp,
returnByValue: true
})
return result
}
现在我想与最近打开的标签进行交互。我可以通过实验目标域(节点 cli 中的原型制作)获取新选项卡的 targetId:
var targets;
chromeController.client.Target.getTargets().then(t => targets = t);
结果:
{ targetInfos:
[ { targetId: '97556479-cdb6-415c-97a1-6efa4e00b281',
type: 'page',
title: 'xxx/preview/239402/',
url: 'xxx/preview/239402/' },
{ targetId: 'bbfe11d5-8e4a-4879-9081-10bb7234209c',
type: 'page',
title: 'Document',
url: 'xxx/preview/239402/teaser/0/' } ] }
我可以在标签之间切换:
chromeController.client.Target.activateTarget({targetId:'xxx'})
但是我无法与此进行任何交互,我找不到连接,如何将其加载到 Page 和 Runtime 对象中。
我在文档中进行了搜索,还尝试了谷歌搜索:'site:chromedevtools.github.io targetId' 这只会引导我到
> chromeController.client.Browser.getWindowForTarget({targetId: '97556479-cdb6-415c-97a1-6efa4e00b281'}).catch(e => console.log(e.message));
Promise { <pending> }
> 'Browser.getWindowForTarget' wasn't found
我也尝试过 Target.setDiscoverTargets({discover: true}) 并关闭原始标签。
感谢您的帮助!
【问题讨论】:
标签: node.js google-chrome-devtools