为什么这样的typescript类结构在编译时会导致运行时错误?

时间:2018-05-22 19:49:30

标签: javascript angular typescript protractor automated-tests

我正在和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);
...
});

我对如何编写这段代码持开放性的批评,我主要是通过拼凑代码位来实现它。

2 个答案:

答案 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,并且它在运行时不强制类型正确。因此,特别是如果您使用的是第三方脚本,请不要在不检查类型声明的情况下依赖它们。