基于一个需要声明How can I check if an element is require using Protractor in angular2?表单字段的示例,我尝试了两种在下面起作用的方式对其进行编码。
it('should add a THING name required', function() {
var foo = element(by.model('THING.name'));
expect((foo).getAttribute("required")).toBe("true");
});
或
expect(element(by.model('THING.name')).getAttribute("required")).toBe(true);
除非那样做,否则还会破坏首先使用页面对象的目的。 从页面目标文件:
var THINGNameField = element(by.model('THING.name'));
this.addTHINGName = function (THINGName) {
THINGNameField.sendKeys(THINGName);
};
对于该对象,此代码在spec / test文件中起作用以添加名称: THINGEditor.addTHINGName(“测试事物标题”);
但是我尝试验证名称的所有操作都是必需的,或者导致无法读取未定义的属性'getAttribute'或错误消息“ ______未定义”
其他尝试提供帮助的人说,似乎页面对象文件中未正确返回某些内容,因此我将其更改为在类中获取/设置,并实例化了页面对象文件中的新对象。经过改进的东西可以使上面的断言解析为null,但是仍然不能提供理想的结果,并且我正在测试的应用程序具有许多必填字段,因此我需要能够验证某些字段(每个表单几个)是必需的,而不仅仅是页面上存在通用的“ required”。 我现在想知道是否应该只是将其废弃并断言该字段在表单上显示“ Name *”,然后进行测试以确保该特定表单的保存按钮不可单击。 确实,我需要验证填写表单的人是否具有视觉上的指示,表明该表单是必需的,而且该表单实际上是强制执行该要求的,这可能是两件事。 大家通常如何在使用页面对象时验证是否需要字段?
答案 0 :(得分:1)
如果要对页面对象执行此操作,则应创建一个类,要求/导入该类,然后创建一个新类。可能正在发生的事情是是否正确导出了被命名和引用的var,从而导致其未定义。下面的示例在TypeScript中。
import {by, element, ElementFinder} from 'protractor';
export class FooPageObject {
foo: ElementFinder = element(by.model('THING.name'));
/**
* Adds a name by sending the keys to the foo object.
* @param keys The string representing the name
* @return a promise
*/
addName(keys: string): Promise<void> {
return foo.sendKeys(keys);
}
/**
* Gets the required attribute for the input box.
* @return a promise to the boolean value
*/
getRequired(): Promise<boolean> {
return foo.getAttribute('required');
}
}
在测试中,您应该使用async / await。这是通过在配置中将SELENIUM_PROMISE_MANAGER设置为false来完成的:
import {FooPageObject} from './path/to/foo';
describe('foo page object', () => {
it('should add a name and check if it is required', async () => {
const fooPageObject = new FooPageObject();
await fooPageObject.addName('my name');
expect(await fooPageObject.getRequired()).toBe(true);
});
});