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

Javascript Browser.wait()直到.getAttribute()返回true,javascript,angularjs,selenium,testing,protractor,Javascript,Angularjs,Selenium,Testing,Protractor,我还在学习量角器,所以我不确定这是否是一个简单的答案,我没有得到,但我只是尝试让浏览器等待,直到我检索的属性为真 我正在测试比萨饼的选择 完整代码: browser.get('https://material.angularjs.org/latest/#/demo/material.components.select'); var topping = element(by.model('topping')); topping.click(); browser.wait(function()

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

我正在测试比萨饼的选择

完整代码:

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');
这给了我一个错误:

元素在点(436693)处不可单击。其他元素将收到单击:

如果我把
browser.sleep(1000)
top之后。单击()
浏览器之前。等待()
然后测试通过。所以我知道剩下的测试不是失败的。出于某种原因,呼叫等待不起作用


我想这可能与以下事实有关:当单击
topping
时,我尝试单击的选项在技术上不可见,因为它位于带有滚动元素的组合框中。如果有人知道一种模拟滚动到“洋葱”元素的好方法,我们也会非常感激。

我想你想要这样的东西:

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

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

您缺少等待条件函数中的
返回值

browser.wait(function() {
    return topping.getAttribute('aria-expanded').then(function(value) {
        return value == 'true';
    });
}, 5000);
注意,我还简化了
then
回调中的比较逻辑


或者,您也可以等待option元素变为可见:


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

如果您有相同的问题,最好使用thread.sleep,间隔较小


您也可以访问以下页面:

这似乎无法解决问题。我仍然得到元素在点(x,y)错误处不可拾取。我可以看到按钮被点击,然后一个选择窗口开始弹出,但它似乎试图在该窗口完全加载之前点击。我正在测试的比萨饼部分,以供参考。@WesThompson知道了。你能分享到目前为止你所拥有的完整代码和你所得到的错误的堆栈跟踪吗?谢谢。@WesThompson好的,谢谢你的更新。请参阅答案中提供的另一个选项。希望有帮助。只是出于好奇,如果我想等到元素不可见时再看呢?是否存在与
EC.visibilityOf()
?@WesThompson是的,
invisibilityOf
:)相反的问题?这似乎无法解决。我在评论中对@Alexe的回答做了更长的解释。这是一个相当恼人的限制哈哈。
var EC = protractor.ExpectedConditions;

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

toppingOptions.get(5).click();