我在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),所以没有同步,我们仍在等待元素,但它不准确。
答案 0 :(得分:1)
所以,下面一行返回一个承诺。
$$('button[type="submit"]').get(0).click();
当您应该从click()
处理承诺解决时,您的代码正在同步运行。实际上,调用clear()
的行也会返回一个promise,因此也需要处理。
答案 1 :(得分:0)
这是一个ignoreSynchronization = true,它在wait而不是之前。之前我没有弄清楚因为我还设置了browser.manage()。timeouts()。implicitlyWait(2000),所以没有同步,我们仍在等待元素,但它不准确。