setFindTimeout和pollUntil with Intern表示在初始页面加载时不可见的元素

时间:2014-10-02 18:03:08

标签: javascript intern

我在让Intern 2等待元素存在时遇到问题。在Intern 1中,我使用wait()来设置页面的快速时间段,以便在某些用户操作之后等待元素出现。对于Intern 2,似乎setFindTimeout()应始终告诉find()方法等待元素存在。我已设置setFindTimeout()并尝试使用pollUntil来处理这些等待,但测试仍然失败,错误"元素不可见"。

以下是一个示例测试,它使用与我的实际测试相同的要求,并且正在查找在page加载后5秒出现的元素ID。

define([
'intern!object',
'intern/chai!assert',
'require',
'tests/util',
'intern/dojo/node!leadfoot/Command',
'intern/dojo/node!leadfoot/Session',
'intern/dojo/node!leadfoot/helpers/pollUntil'
], function (registerSuite, assert, require, util, Command, Session, pollUntil) {

registerSuite([   
    {
        name: 'testing_find_by_wait',

        test_create_form_on_web: function() {
            console.log('Create a form with account, number, number and formula fields')

            return this.remote
                .setFindTimeout(10000)
                .setWindowSize(1280, 960)
                .get("http://www.kgstew.com/waittest.html")
                .then(pollUntil('return document.getElementById("demo")', 10000))
                .findById('demo')
                    .click()
                    .end()

        }
    }
]);
});

2 个答案:

答案 0 :(得分:2)

该元素正在被发现。根据错误,元素上的click失败。发生这种情况是因为元素为空且没有样式,因此它的大小为零,并且在您尝试单击它时无法单击。您需要等待元素存在并且在您尝试单击它之前可见。

答案 1 :(得分:2)

感谢C Snover帮助您解决问题。

我误解了setFindTimeout()pollUntil的工作方式。它们都查找DOM中存在的元素(它们是),但如果在发出display:none命令时元素不可见(即样式为click()),则测试将失败。 / p>

我们想要做的是在某种用户操作之后等待元素出现。从C Snover那里得到了关于element.offsetWidth的观点,因为它大于0。

我们在测试套件中创建了以下实用程序。

element_visible_by_class: function(elem) {
    return function(elem) {
        elem = document.getElementsByClassName(elem);
        if (!elem || elem.length == 0) { return null; }
        elem = elem[0];
        return (elem.offsetWidth > 0 && elem.offsetHeight > 0) ? elem : null;
     }  
},

现在,我们可以通过任何测试调用.then(pollUntil(util.element_visible_by_class(), ['class_name'], 10000)),它会等到该元素在页面上可见。