所以我遇到了一个超级奇怪的问题,虽然我已经解决了,但我不太确定为什么会发生这种情况:
我有一个所有其他页面对象都继承自的基本页面对象。它非常简单,看起来像这样:
import { Page, expect } from "@playwright/test";
export abstract class BasePage {
constructor(public readonly page: Page) {}
/**
* navigates to url
* @param path - url path
*/
async open(path: string) {
await this.page.goto(path);
}
}
在我的网站中,我有一个无处不在的导航栏,所以我想我应该在其中放置一个函数来处理注销:
import { Page, expect } from "@playwright/test";
export abstract class BasePage {
constructor(public readonly page: Page) {}
public readonly navDropdownLink = this.page.locator("#navbarDropdown");
public readonly logOffButton = this.page.locator("#logOffButton")
async logOff() {
await this.navDropdownLink.click()
await this.logOffButton.click()
}
/**
* navigates to url
* @param path - url path
*/
async open(path: string) {
await this.page.goto(path);
}
}
到目前为止非常简单的事情。我还有一个继承基本页面对象功能的仪表板页面对象。所以我想我可以从子类中调用父/基页面对象
logOff
函数:
const dashboard = new DashboardPage(page)
dashboard.logOff()
看起来应该可以工作,但是当调用它时,它似乎只是传递了该函数,而不是
await
正确地导致它失败。
但是!如果我将相同的
logOff
函数放入我的子页面对象类中,它就可以正常工作。我不太确定这里发生了什么,因为 DashboardPage
类应该可以访问 logOff
函数......并且我没有收到任何错误,但几乎就像它跳过了它一样? (或者只是忽略函数 async)。正如我在 Playwright 调试模式中看到的,它正在执行该功能,但不等待。
我假设这是某种继承问题?或者也许因为它是一个抽象类? (我对它们不是很熟悉,但我看到很多人使用
Abstract
作为基类)
问题最终是
BasePage
是一个abstract class
。我不太清楚为什么它的行为方式如此,但根据我的理解,我们无法实例化父抽象类,并且由于我没有在基类中声明它,所以导致了上述问题。