在 InternJS 中切换框架后如何进行

How to proceed AFTER switching frames in InternJS

谁能告诉我如何在框架切换完成后继续在 iframe 中引用元素?我已经看过 How to switch iframes InternJS to no avail, and the information in intern Functional Testing with Frames 中提供的解决方案只是不适用(目前)。以下脚本 returns 错误 Cannot read property 'apply' of undefined type: TypeError:

return Remote
    .findAllByTagName('iframe')
    .then(function (frames) {
        return new Remote.constructor(Remote.session)
            .switchToFrame(frames[0])
            .getProperty('title')
            .then(function (result) {
                expect(result).to.equal('Rich text editor, rtDescAttach');
            });
    });

我看到脚本失败的唯一原因是框架位置不正确。页面上有两个,我需要第一个。完成此操作后,我真的很想将对框架的引用放在页面对象中(这是我认为它所属的位置),但我必须首先能够成功找到它,所以不要本末倒置。非常感谢建议和帮助。

您的示例实际上非常接近。主要问题是 getProperty('title') 不会按照它的使用方式工作。 getProperty 是一个元素方法,在调用它时上下文堆栈上没有有效元素。假设您正在尝试获取 iframe 页面的标题,您将需要使用 execute 回调,例如:

.switchToFrame(frames[0])
.execute(function () {
    return document.title;
})
.then(function (title) {
    // assert
})

Leadfoot 有一个 getPageTitle 回调,但它始终 return 是 top-level 文档的标题(标题在浏览器标题栏或选项卡中)。

另一个小问题是,在回调中访问远程的更规范的方法是通过 parent 属性,例如:

.then(function (frames) {
    return this.parent
        .switchToFrame(frames[0])
        // ...
})

如果您想访问 iframe 中的元素,您需要切换框架、重置搜索上下文,然后找到元素,例如:

.findAllByTagName('iframe')
.then(function (frames) {
    return this.parent
        // clear the search context in this callback
        .end(Infinity)
        // switch to the first frame
        .switchToFrame(frames[0])
        // find an element in the frame, examine its text content
        .findById('foo')
        .getVisibleText()
        .then(function (text) {
            assert.equal(text, 'expected content');
        })
        // switch back to the parent frame when finished
        .switchToParentFrame()
})
// continue testing in parent frame

有几点需要注意:

  1. 搜索上下文在命令链本地,因此基于 this.parent 的命令链上的更改不会保留在 parent 命令链上。基本上,不需要在回调中的命令链末尾调用 .end()
  2. 活动框架不是命令链的本地框架,因此如果您更改基于this.parent的链上的框架,则需要重新设置它如果你想return到回调后的parent帧。