0

首先,感谢柴冰沙!

我一直在尝试完善一些测试代码并更多地使用 chai-smoothie,但我遇到了一些麻烦:

这是之前的样子:

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

这就是我期望它在柴冰沙中起作用的方式

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'),

问题在于第二行“userMenuPage.userMenuItemText().isDisplayed()”。如果我只使用“userMenuPage.userMenuItemIcon.isDisplayed()”,那么我没有问题,如果我只使用“userMenuPage.userMenuItemText().isDisplayed()”,那么我会失败。

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

4

1 回答 1

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');
}

UserMenuPage.Item_Text它允许您在相同的地方定义“问题” ,targets并避免.getText()在场景中调用。

于 2017-02-12T17:56:24.447 回答