我在让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()
}
}
]);
});
答案 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))
,它会等到该元素在页面上可见。