Angular 7 使用 NGRX 和带有量角器的 e2e 测试问题
Anguar 7 used NGRX and problem with e2e test with protactor
我的应用程序有问题..
office.components.html
<div class="form-group" [class.text-danger]="form.name?.invalid && (form.name?.dirty || form.name?.touched)">
<label for="name">OFFICE</label>
<input name="name" type="text" class="form-control input-lg" value="" formControlName="name"
[class.border-danger]="form.name?.invalid && (form.name?.dirty || form.name?.touched)" required />
<div *ngIf="form.name?.errors && (form.name?.dirty || form.name?.touched)">
<div [hidden]="!form.name?.errors.required">Office required</div>
<div [hidden]="!form.name?.errors.minlength">Office is too short</div>
<div [hidden]="!form.name?.errors.maxlength">Office is too long</div>
</div>
</div>
office.components.ts
officeForm = this.formBuilder.group({
name: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(250)]],
});
ngOnInit() {
this.store.dispatch(new FetchOffice());
this.officeSubscription = this.store.select('office').subscribe((officeState: OfficeState) => {
this.officeForm.patchValue(officeState);
});
}
office.e2e-spec.ts
it('check error message for required input', () => {
const formNameElement = element(by.name('name'));
formNameElement.clear();
formNameElement.sendKeys(protractor.Key.TAB);
const formNameElementParent = formNameElement.element(by.xpath('..'));
const formNameElementError = formNameElementParent.element(by.xpath('div/div[1]'));
expect(formNameElementError.getText()).toEqual('Office required');
});
错误失败:使用定位器找不到元素:By(xpath, div/div[1])
但下面的测试有效
it('check error message for required input', () => {
const formNameElement = element(by.name('name'));
formNameElement.clear();
formNameElement.sendKeys('1');
formNameElement.sendKeys(protractor.Key.TAB);
const formNameElementParent = formNameElement.element(by.xpath('..'));
const formNameElementError = formNameElementParent.element(by.xpath('div/div[2]'));
expect(formNameElementError.getText()).toEqual('Office is too short');
});
当我删除
this.officeForm.patchValue(officeState);
全部测试有效
链接 xpath 定位器时,您需要在定位器前加上 ./
或 .//
语法前缀。这表明您想要找到一个与您正在链接的元素相关的元素。
虽然您的整个代码似乎可以通过使用 xpath axes 来识别那些相关元素来简化。
比如,原来不是你
const formNameElement = element(by.name('name'));
const formNameElementParent = formNameElement.element(by.xpath('..'));
const formNameElementError = formNameElementParent.element(by.xpath('div/div[2]'));
您可以使用父坐标轴实现相同的效果(更新后的兄弟姐妹)
const formNameElement = element(by.name('name'));
const formNameElementError = element(by.xpath('//[@name="name]/following-sibling::div[1]'));
我找到了解决方案。
我不得不更换:
formNameElement.clear();
formNameElement.sendKeys(protractor.Key.TAB);
在
formNameElement.clear();
formNameElement.sendKeys('1');
formNameElement.sendKeys(protractor.Key.BACK_SPACE);
formNameElement.sendKeys(protractor.Key.TAB);
我的应用程序有问题..
office.components.html
<div class="form-group" [class.text-danger]="form.name?.invalid && (form.name?.dirty || form.name?.touched)">
<label for="name">OFFICE</label>
<input name="name" type="text" class="form-control input-lg" value="" formControlName="name"
[class.border-danger]="form.name?.invalid && (form.name?.dirty || form.name?.touched)" required />
<div *ngIf="form.name?.errors && (form.name?.dirty || form.name?.touched)">
<div [hidden]="!form.name?.errors.required">Office required</div>
<div [hidden]="!form.name?.errors.minlength">Office is too short</div>
<div [hidden]="!form.name?.errors.maxlength">Office is too long</div>
</div>
</div>
office.components.ts
officeForm = this.formBuilder.group({
name: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(250)]],
});
ngOnInit() {
this.store.dispatch(new FetchOffice());
this.officeSubscription = this.store.select('office').subscribe((officeState: OfficeState) => {
this.officeForm.patchValue(officeState);
});
}
office.e2e-spec.ts
it('check error message for required input', () => {
const formNameElement = element(by.name('name'));
formNameElement.clear();
formNameElement.sendKeys(protractor.Key.TAB);
const formNameElementParent = formNameElement.element(by.xpath('..'));
const formNameElementError = formNameElementParent.element(by.xpath('div/div[1]'));
expect(formNameElementError.getText()).toEqual('Office required');
});
错误失败:使用定位器找不到元素:By(xpath, div/div[1])
但下面的测试有效
it('check error message for required input', () => {
const formNameElement = element(by.name('name'));
formNameElement.clear();
formNameElement.sendKeys('1');
formNameElement.sendKeys(protractor.Key.TAB);
const formNameElementParent = formNameElement.element(by.xpath('..'));
const formNameElementError = formNameElementParent.element(by.xpath('div/div[2]'));
expect(formNameElementError.getText()).toEqual('Office is too short');
});
当我删除
this.officeForm.patchValue(officeState);
全部测试有效
链接 xpath 定位器时,您需要在定位器前加上 ./
或 .//
语法前缀。这表明您想要找到一个与您正在链接的元素相关的元素。
虽然您的整个代码似乎可以通过使用 xpath axes 来识别那些相关元素来简化。
比如,原来不是你
const formNameElement = element(by.name('name'));
const formNameElementParent = formNameElement.element(by.xpath('..'));
const formNameElementError = formNameElementParent.element(by.xpath('div/div[2]'));
您可以使用父坐标轴实现相同的效果(更新后的兄弟姐妹)
const formNameElement = element(by.name('name'));
const formNameElementError = element(by.xpath('//[@name="name]/following-sibling::div[1]'));
我找到了解决方案。 我不得不更换:
formNameElement.clear();
formNameElement.sendKeys(protractor.Key.TAB);
在
formNameElement.clear();
formNameElement.sendKeys('1');
formNameElement.sendKeys(protractor.Key.BACK_SPACE);
formNameElement.sendKeys(protractor.Key.TAB);