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

Wes*_*son 4 javascript testing selenium angularjs protractor

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

我正在测试这个网站的披萨选项.

完整代码:

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');
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

元素在点(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中.如果有人知道模拟滚动到"洋葱"元素的好方法,那么也会非常感激.

ale*_*cxe 6

你错过了return等待条件函数:

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

请注意,我还简化了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();
Run Code Online (Sandbox Code Playgroud)