【发布时间】:2015-03-19 18:58:47
【问题描述】:
似乎如果我使用element(by.css('#id')); protractor 有时会找到它,有时不会。取决于 DOM 是否安定下来。我已经走了一些:
getElementsByCss: function (cssVal) {
// return element.all((by.css(cssVal)));
return self.wait(function () {
return element.all((by.css(cssVal))).then(function (els) {
return els;
}, function () {
return false; // Don't fail, we want to retry
});
}, GET_ELEMENT_TIMEOUT, 'Elements not found by css: ' + cssVal);
},
它玩了一个游戏,在一段时间内重试获取元素。我们使用 5 秒。这似乎在大多数情况下都有效。在本地运行时,我们没有问题。
当我们在云(酱实验室)上运行时,它们的虚拟机速度非常慢。我们仍然会遇到随机问题。不幸的是,这些游戏必须在任何地方玩,例如:
getText: function (el) {
return self.wait(function () {
return el.getText();
}, 1000, 'Could not get element text.');
},
或
expectBulletin: function () {
var el, text;
return self.wait(function () {
// Find the bulleting element, make sure it's visible and grab its text.
// If any of those three fail, try all of them again.
return self.getElementByCss('.bulletin')
.then(function (elm) {
el = elm;
return self.isElementVisible(el);
}, function () {
return false;
})
.then(function () {
return self.getText(el).then(function (text) {
return text;
}, function () {
return false;
});
}, function () {
return false;
});
}, 10000, 'Count not get bulletin text.')
.then(function (result) {
text = result;
return self.executeScript('arguments[0].click();', el.getWebElement());
})
.then(function () {
return self.isElementNotVisible(el);
})
.then(function () {
return text;
});
},
所有的self.waits 只是一个 browser.driver.wait 包装器...
wait: function (fn, timeout, msg) {
return browser.driver.wait(fn, timeout, msg);
},
这感觉就像一大包创可贴,而且它始终无法正常工作。 expectBulletin 99% 的时间在本地运行,但在慢速虚拟机上远程运行时,它的运行时间约为 50%。有时文本会返回空白,或者出现关于单击不可见元素或只是找不到公告元素的问题。
有没有更好的方法来做到这一点?
【问题讨论】:
-
有时我们对远程测试的感觉真的是一样的——在等待和预期的条件下,有很多等待。如果您希望您的测试可靠,恐怕您必须这样做。这是一个有点疯狂的想法,但可能会产生影响,试试看:stackoverflow.com/a/27483971/771848。谢谢。
标签: protractor saucelabs