Browser.wait() 直到 .getAttribute() returns 真

Browser.wait() until .getAttribute() returns true

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

我正在测试 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');

这给了我错误:

Element is not clickable at point (436, 693). Other element would receive the click: <md-backdrop class="md-select-backdrop md-click-catcher md-default-theme"></md-backdrop>

请注意,如果我将 browser.sleep(1000); 放在 topping.click() 之后和 browser.wait() 之前,那么测试将通过。所以我知道测试的其余部分不是失败的原因。由于某种原因,等待呼叫不起作用。

我认为这可能与以下事实有关:我尝试单击的选项在单击 topping 时在技术上不可见,因为它位于带有滚动元素的 ComboBox 中。如果有人知道模拟滚动到 "onion" 元素的好方法,也将不胜感激。

我想你想要这样的东西:

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

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

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

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

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

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