使用操纵符定位嵌套的iframe

时间:2018-08-29 09:52:59

标签: javascript excel office365 puppeteer

目前,我正在尝试创建一些E2E测试,这些测试需要在线登录Excel,然后上传扩展程序。

我能够登录,打开Excel并单击“上传插件”按钮,但是,我无法再继续了。

到目前为止,我已经发现有2个iframe,一个嵌套在另一个iframe中。

打开Excel后,我将访问第一个

let targetIFrame = await this.page.frames().find(f => f.name() === 'sdx_ow_iframe');

关于第二个问题的棘手部分是,它仅在我单击“上传插件”按钮后才出现在DOM中,并且嵌套在我上面访问的那个中。

我尝试了不同的延迟等,但是看起来木偶没有看到它。

1 个答案:

答案 0 :(得分:0)

根据我的研究,您可以构建实现以查找包含在父框架中的iframe。

请测试以下代码:

/**
* @return {!Promise<ElementHandle>}
*/
async ownerFrame() {
  if (!this._frame._parentFrame)
    throw new Error('No parent frame');

  const rootElementHandle = await this._frame.$('*');
  const rootElementDescriptionHandle = await this._client.send('DOM.describeNode', { objectId: rootElementHandle._remoteObject.objectId });

  const parentsIframes = await this._frame._parentFrame.$$('iframe');
  if (!parentsIframes.length)
    throw new Error('No iframe elements found in parent');

  return parentsIframes.find(async parentsIframe => {
    const iframeDescription = await this._client.send('DOM.describeNode', { objectId: parentsIframe._remoteObject.objectId, pierce: true, depth: 2 });
    const iframesRootDescription = iframeDescription.node.contentDocument.children[0];
    return iframesRootDescription.backendNodeId === rootElementDescriptionHandle.node.backendNodeId;
  });
}