chai-smoothie:to.eventually.be.displayed on a function不起作用?

时间:2017-02-09 15:45:15

标签: serenity-js

首先,感谢chai-smoothie!

我一直试图改进一些测试代码并更多地使用chai-smoothie,但我遇到了一些麻烦:

这就是以前的样子:

return expect(Promise.all([
    userMenuPage.userMenuItemIcon.isDisplayed(),
    userMenuPage.userMenuItemText().isDisplayed()
])).to.eventually.be.eql([true, true])

这就是我期望它在chai smoothie中工作的方式

expect(userMenuPage.userMenuItemIcon).to.eventually.be.displayed
expect(userMenuPage.userMenuItemText()).to.eventually.be.displayed

运行新代码时,收到以下错误:

   Step Definition: steps/userMenuSteps.js:23
   Message:
     TypeError: assertion._obj.locator is not a function
         at <repo>/tests/node_modules/chai-smoothie/lib/src/chai-smoothie.ts:42:65
         at <repo>/tests/node_modules/protractor/built/element.js:798:32
         at ManagedPromise.invokeCallback_ (<repo>/tests/node_modules/selenium-webdriver/lib/promise.js:1379:14)
         at TaskQueue.execute_ (<repo>/tests/node_modules/selenium-webdriver/lib/promise.js:2913:14)
         at TaskQueue.executeNext_ (<repo>/tests/node_modules/selenium-webdriver/lib/promise.js:2896:21)
         at asyncRun (<repo>/tests/node_modules/selenium-webdriver/lib/promise.js:2775:27)
         at <repo>/tests/node_modules/selenium-webdriver/lib/promise.js:639:7
         at process._tickCallback (internal/process/next_tick.js:103:7)

页面模型定义如下所示:

userMenuItemText: () => $('#desktop-menu #desktop-menu-classic span').getText(),
userMenuItemIcon: $('#desktop-menu #desktop-menu-classic .fa-fjunk'),

问题在于第二行&#34; userMenuPage.userMenuItemText()。isDisplayed()&#34;。如果我只使用&#34; userMenuPage.userMenuItemIcon.isDisplayed()&#34;,那么我没有问题,如果我只是使用&#34; userMenuPage.userMenuItemText()。isDisplayed()&#34 ;,那么我失败了。

你对如何克服这个问题有什么建议吗?仍然使用柴奶昔?

1 个答案:

答案 0 :(得分:0)

问题是由应用于元素文本的断言to.eventually.be.displayed引起的,而不是元素本身。

更新:从版本0.2.1开始,chai-smoothie可以使用。

希望这有帮助!

尽管如此,在元素上断言以验证其可见性以及在其文本上验证内容可能更为清晰:

所以而不是:

const userMenuPage = {
    userMenuItemText: () => $('#desktop-menu #desktop-menu-classic span').getText(),
    userMenuItemIcon: $('#desktop-menu #desktop-menu-classic .fa-fjunk')
}

也许试试:

const userMenuPage = {
    userMenuItem: $('#desktop-menu #desktop-menu-classic span'),
    userMenuItemIcon: $('#desktop-menu #desktop-menu-classic .fa-fjunk')
}

然后:

expect(userMenuPage.userMenuItem).to.eventually.be.displayed
expect(userMenuPage.userMenuItem.getText()).to.eventually.equal('expected text')

使用Serenity/JS,您还可以按如下方式定义页面对象:

class UserMenuPage {
    static Item      = Target.the('Menu item').located(by.css('#desktop-menu #desktop-menu-classic span');
    static Item_Text = Text.of(UserMenuPage.Item);

    static Item_Icon = Target.the('Menu icon').located(by.css('#desktop-menu #desktop-menu-classic .fa-fjunk');
}

允许您定义&#34;问题&#34;例如UserMenuPage.Item_Texttargets位于同一位置,避免在方案中调用.getText()