连续两次相同的量角器测试,第二次测试失败

时间:2017-05-04 12:48:34

标签: angularjs protractor

我在Angular 1.6.3网站上使用Protractor 4.0.14。

我执行两个相同的测试。第一个会成功但不会是第二个。有什么想法吗?

public class MyEditText extends EditText {
    private CustomMovementMethod customMovementMethod = new CustomMovementMethod();
    @Override 
    public MovementMethod getDefaultMovementMethod() {
        return customMovementMethod;
    }
}

private class CustomMovementMethod implements MovementMethod {

    @Override
    public boolean canSelectArbitrarily() {
        return false;
    }

    @Override
    public void initialize(TextView widget, Spannable text) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onGenericMotionEvent(TextView widget, Spannable text, MotionEvent event) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onKeyDown(TextView widget, Spannable text, int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onKeyOther(TextView view, Spannable text, KeyEvent event) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onKeyUp(TextView widget, Spannable text, int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onTakeFocus(TextView widget, Spannable text, int direction) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onTrackballEvent(TextView widget, Spannable text, MotionEvent event) {
        // TODO Auto-generated method stub
        return false;
    }

}

该字段提供的数量错误,因此在提交时会抛出一个toast-error。当我手动完成时,我得到了toast-error。使用量角器进行操作时,只会通过相同的第一个测试。另一方面,看起来烤面包从未真正快速启动或关闭。

我尝试了睡眠,忽略与浏览器等待的同步。我试图在处理错误吐司的服务中用$ interval替换$ timeout(尽管可能存在其他$ timeout)。它没有改变任何东西。

它实际上是第二个它失败的第一个期望,并且没有错误的实际帮助,它只是期望为false而不是true:

it('Should return a toast error on inferior amount', function () {
    $$('#purposeList input.amount').first().clear().sendKeys('4999');
    $$('button[type="submit"]').get(0).click();
    expect($('div.toast.toast-error').isPresent()).toBe(true);
    element.all(by.model('purpose.amount')).first().clear();
    $$('button.toast-close-button').each(function (item) {
        item.click();
    });
    expect($('button.toast-close-button').isPresent()).toBe(false);
});

it('Should return a toast error on inferior amount BIS', function () {
    $$('#purposeList input.amount').first().clear().sendKeys('4999');
    $$('button[type="submit"]').get(0).click();
    expect($('div.toast.toast-error').isPresent()).toBe(true);
    element.all(by.model('purpose.amount')).first().clear();
    $$('button.toast-close-button').each(function (item) {
        item.click();
    });
    expect($('button.toast-close-button').isPresent()).toBe(false);
});

编辑:

所以@LostJon,通过处理每一个承诺,你的意思是这样的:

Message:
Expected false to be true.

我试过了,结果相同。

编辑:

显然,这是一个ignoreSynchronization = true,它位于等待而不是之前。之前我没有弄清楚因为我还设置了browser.manage()。timeouts()。implicitlyWait(2000),所以没有同步,我们仍在等待元素,但它不准确。

2 个答案:

答案 0 :(得分:1)

所以,下面一行返回一个承诺。

$$('button[type="submit"]').get(0).click();

当您应该从click()处理承诺解决时,您的代码正在同步运行。实际上,调用clear()的行也会返回一个promise,因此也需要处理。

答案 1 :(得分:0)

这是一个ignoreSynchronization = true,它在wait而不是之前。之前我没有弄清楚因为我还设置了browser.manage()。timeouts()。implicitlyWait(2000),所以没有同步,我们仍在等待元素,但它不准确。