Browser.wait()直到.getAttribute()返回true

时间:2015-06-22 02:18:31

标签: javascript angularjs selenium testing protractor

我还在学习量角器,所以我不确定这是否是一个我没有得到的简单答案,但我只是想让浏览器等到属性I&I #39; m检索是真的。

我正在测试this site的披萨选项。

完整代码:

browser.get('https://material.angularjs.org/latest/#/demo/material.components.select');

var topping = element(by.model('topping'));

topping.click();

browser.wait(function() {
    return topping.getAttribute('aria-expanded').then(function(value) {
        return value == 'true';
    });
}, 5000);

var toppingOptions = element.all(by.css('[role="option"]'));

toppingOptions.get(5).click();

expect(topping.getText()).toBe('Onion');

这给了我错误:

  

元素在点(436,693)处无法点击。其他元素会收到点击:<md-backdrop class="md-select-backdrop md-click-catcher md-default-theme"></md-backdrop>

还有一点需要注意,如果我在browser.sleep(1000);之后和topping.click()之前放置browser.wait(),那么测试就会通过。所以我知道测试的其余部分并不是什么失败。由于某种原因,等待的呼吁不起作用。

我认为这可能与我尝试点击的选项在点击topping时在技术上不可见这一事实有关,因为它在ComboBox中用滚动元素。如果有人知道一个很好的方法来模拟滚动到&#34;洋葱&#34;我们也非常感激。

3 个答案:

答案 0 :(得分:6)

您错过了等待条件函数中的return

browser.wait(function() {
    return topping.getAttribute('aria-expanded').then(function(value) {
        return value == 'true';
    });
}, 5000);

请注意,我还简化了then回调中的比较逻辑。

或者,您也可以等待选项元素变为可见

var EC = protractor.ExpectedConditions;

var toppingOptions = element.all(by.repeater("topping in toppings"));
browser.wait(EC.visibilityOf(toppingOptions.first()), 5000);

toppingOptions.get(5).click();

答案 1 :(得分:0)

我想你想要这样的东西:

var toppingElem = by.id('#topping'); // or how ever you can designate this element

browser.wait(function() {
  return ptor.isElementPresent(toppingElem);
}, 5000);

答案 2 :(得分:0)

我在我的一个测试中遇到了类似的问题,其中Selenium点击了错误的坐标。实际上,Selenium能够在元素从顶部到中心移动得非常快时找到元素(以这种方式加载弹出窗口)。然后在点击元素时,它的位置发生了变化,点击了错误的位置,从而出现错误。正如所讨论的那样here似乎是对硒的限制。

如果您遇到同样的问题,最好小间隔​​地使用thread.sleep。

您可能还想访问该页面:Debugging "Element is not clickable at point" error