webdriverio - 如何将 LI 文本放入数组

webdriverio - how to get a LI texts into an array

我今天早上开始将 webdriverio 与 cucumber 一起使用,一切都很顺利,直到我不得不检查元素列表 (ul > li) 是否包含特定文本。我开始玩:http://webdriver.io/api/protocol/elements.html

这是我目前拥有的:

@Then /^One error should be "([^"]*)"$/, (errorMessage, cb) ->
        that = @
        errors = []
        @client
            .elements '.ui .list > li', (err, res) ->
                _.forEach res.value, (item) ->
                    that.client
                        .elementIdText item.ELEMENT, (err, res) ->
                            errors.push(res.value)

我的想法是尝试将所有 li 的文本保存到一个数组中,我可以稍后查看,但是因为我有点不知道下一步该怎么做。

任何帮助将不胜感激..谢谢!

再拔几根头发后,我得出了这个解决方案:

    @Then /^One error should be "([^"]*)"$/, (errorMessage, cb) ->
        that = @
        @client
            .elements '.ui .list > li', (err, res) ->
                total = res.value.length
                errors = []

                for item in res.value
                    that.client
                        .elementIdText item.ELEMENT, (err, res1) ->
                            errors.push res1.value
                            if errors.length == total
                                if errors.indexOf(errorMessage) != -1
                                    cb(null, errors)
                                else
                                    cb("Expected error string: \"#{errorMessage}\" not found in: [#{errors}]")

我知道这不是最漂亮的解决方案,所以如果有人可以帮助我改进它,请告诉我。

谢谢

如果 属性 命令的选择器匹配多个元素,它 returns 一个结果数组而不是单个结果。因此,检查某个列表元素是否包含字符串的最简单解决方案是

client.getText('.ui .list>il', function(err, res) {
    var containsText = false;
    res.forEach(function(liText) {
        containsText |= liText.indexOf('some string') > -1;
    });
    containsText.toBe(true);
});

我在这里使用的是 jasmine 断言,因此如果您使用不同的断言库,则需要对其进行调整。