【问题标题】:Browser.wait() until .getAttribute() returns trueBrowser.wait() 直到 .getAttribute() 返回 true
【发布时间】:2015-09-07 09:27:48
【问题描述】:

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

我正在测试 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 中。如果有人知道模拟滚动到“洋葱”元素的好方法,那也将不胜感激。

【问题讨论】:

    标签: javascript angularjs selenium testing protractor


    【解决方案1】:

    您在等待条件函数中缺少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();
    

    【讨论】:

    • 这似乎没有解决它。我仍然得到元素在点 (x, y) 错误处不可点击。我可以看到该按钮被单击,然后一个选择窗口开始弹出,但似乎它试图在该窗口完全加载之前单击。我正在测试this page 的披萨部分以供参考。
    • @WesThompson 明白了。你能分享你到目前为止的完整代码和你得到的错误的堆栈跟踪吗?谢谢。
    • @WesThompson 好的,感谢您的更新。请参阅答案中提供的另一个选项。希望对您有所帮助。
    • 只是出于好奇,如果我想等到元素不可见怎么办?有EC.visibilityOf()的反义词吗?
    • @WesThompson 是的,invisibilityOf :)
    【解决方案2】:

    我想你想要这样的东西:

    var toppingElem = by.id('#topping'); // or how ever you can designate this element
    
    browser.wait(function() {
      return ptor.isElementPresent(toppingElem);
    }, 5000);
    

    【讨论】:

    • 这似乎无法解决问题。我在对@alexce 的回答的评论中给出了更长的解释。
    【解决方案3】:

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

    如果你有同样的问题,最好使用小间隔的thread.sleep。

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

    【讨论】:

    • 这是一个很烦人的限制哈哈。
    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    相关资源
    最近更新 更多