我正在和Jasmine一起为Protractor写作。我精通Java和浏览器测试,但我是JavaScript和Protractor的新手。
我正在努力将我的代码转移到使用异步的“新”样式,并等待在控制流程更改之前移动(如果我对此有所误解,我道歉)并且我正在运行在转换我的页面对象类时遇到的问题。起初我尝试在“Line A”中输入我的函数作为Promise,但是我得到了“type any []不能转换为ElementArrayFinder类型”的错误。根据建议我将其更改为当前存在的“Promise”编译,但无法在给定代码下面的错误中运行。在我的转换之前,我只是简单地传递ElementArrayFinder对象没有问题,我的代码工作,所以我以前工作的代码,我只需要弄清楚如何使它在这个新结构中工作。
// my po class
...
// Breadcrumb methods
async getBreadCrumbs(): Promise<any> { // Line A
return await element.all(by.css('bread-crumbs span'));
}
async getProjectNameBreadCrumbText() {
const breadCrumbs: ElementArrayFinder = await this.getBreadCrumbs();
return await breadCrumbs.get(2).getText();
}
async getProjectMapperBreadCrumbText() {
const breadCrumbs: ElementArrayFinder = await this.getBreadCrumbs();
return await breadCrumbs.get(3).getText();
}
似乎在Webstorm中编译没有IDE错误,但是当我运行它时我得到错误:
Failed: breadCrumbs.get is not a function
TypeError: breadCrumbs.get is not a function
如果这里的代码很重要,使用上面的PO类在运行时调用代码时导致失败:
it('test case', async function() {
...
await expect(mapperPage.getProjectMapperBreadCrumbText()).toEqual(mapperPage.MAPPER_BREADCRUMB);
...
});
我对如何编写这段代码持开放性的批评,我主要是通过拼凑代码位来实现它。
答案 0 :(得分:2)
由于您从 getBreadCrumbs()返回 element.all(by.css(&#39; bread-crumbs span&#39;)),您的其他功能实际上是接收 WebElement 而不是 ElementArrayFinder 的数组。所以你应该可以打电话
面包屑[n]的.getText()
在你的职能中
我个人的建议是让你离开返回选择器的函数,而不是将它们设置为页面对象类的属性:
public breadcrumbs = element.all(by.css(&#39; bread-crumbs span&#39;));
将 getProjectNameBreadCrumbText()简化为:
async getProjectNameBreadCrumbText(): Promise<string> {
return this.breadCrumbs.get(2).getText();
}
你的测试:
it('test case', async function() {
...
expect(await mapperPage.getProjectMapperBreadCrumbText())
.toEqual(mapperPage.MAPPER_BREADCRUMB);
...
});
如果您愿意,我很乐意为您提供页面对象,规范和配置的一般格式,我已经使用async / await并禁用了Promise Manager。
答案 1 :(得分:0)
因为element.all(by.css('bread-crumbs span'));
似乎会导致undefined
。
未定义匹配Typescript中的任何类型,除非您在tsconfig中将其关闭。 Typescript也转换为JavaScript,并且它在运行时不强制类型正确。因此,特别是如果您使用的是第三方脚本,请不要在不检查类型声明的情况下依赖它们。