类型“ {}”不可分配给类型“ WebElement”

时间:2019-09-26 13:34:42

标签: typescript selenium-webdriver promise protractor

上下文:我正在更新e2e测试以使用异步/等待。尝试将函数(返回类型为promise.Promise )更新为异步并从测试中调用它时,将导致TS错误。

当前实施:

export function waitUntilElementIsVisible(element: ElementFinder): promise.Promise<WebElement> {
    browser.wait(ExpectedConditions.presenceOf(element))

    return browser.wait(ExpectedConditions.visibilityOf(element))
}

尝试过的解决方案:

export async function waitUntilElementIsVisible(element: ElementFinder): Promise<WebElement> {
   await browser.wait(ExpectedConditions.presenceOf(element))

   return browser.wait(ExpectedConditions.visibilityOf(element))
} 

该函数的调用方式如下:

it('should wait until element is visible, async () =>
     await waitUntilElementIsVisible( error_page)
     expect(web element displayed)
})

我正面临以下问题:

Type '{}' is not assignable to type 'WebElement'.  Property 'getDriver' is missing in type '{}'.

我这样做正确吗?任何建议将不胜感激!

2 个答案:

答案 0 :(得分:0)

函数应如下所示:

export async function waitUntilElementIsVisible(element: ElementFinder): Promise<any> {
   await browser.wait(ExpectedConditions.visibilityOf(element))
}

首先,如果我们仔细观察visibilityOf code,我们会发现它本身会调用presenceOf,因此您不需要进行额外的检查。

第二,在这种情况下不需要返回任何内容,而且,browser.wait docs says会返回!webdriver.promise.Promise<T>,但我认为它可能不是WebElement,而是会返回ExpectedConditions.visibilityOf返回什么。

答案 1 :(得分:0)

不是答案,但需要比评论中更多的空间

我很困惑,您说您正在调用这样的函数

it('should wait until element is visible, async () =>
     await waitUntilElementIsVisible( error_page)
     expect(web element displayed)
})

那么你的对象是

class ErrorPage { 
  getErrorPage(): ElementFinder { 
    return $('.error-page') 
  } 
}

现在,我认为一切都很清楚,ErrorPage是对象({}),但是您需要一个elementFinder。所以您需要的是

ErrorPage.getErrorPage() // instead of error_page

但是在评论中,您说的是这种称呼方式

await waitUntilElementIsVisible(ErrorPage.getErrorPage())

那么您使用哪种方式? error_pageErrorPage.getErrorPage()