只是为了说明幕后发生的事情:我使用的是Web自动化框架WebdriverIO,但这个问题并不关乎它。这就是为什么我没有将其放入标签的原因
命令$("selector")
返回一个webElement。而且我可以在此元素上调用不同的WDIO命令(例如setValue
或click
)
“ $命令是按顺序调用findElement命令的一种简短方法 在页面上获取类似于$命令的单个元素 浏览器范围。”
我的目标是使我的MainPage
类看起来像这样:
import { searchInput, searchButton } from "./main.page.elements"
class MainPage {
searchFor(query: string) {
searchInput.setValue(query);
searchButton.click()
}
}
如您所见,我正在尝试建立一个模型,在该模型中我可以导入单个元素获取器并对其进行操作。 常见的“最佳做法”可能看起来像这样:
import { MainPageElements } from "./main.page.elements"
class MainPage {
searchFor(query: string) {
MainPageElements.searchInput.setValue(query);
MainPageElements.searchButton.click()
}
}
但是一段时间后,这导致大量重复代码和/或仅出于使用单个元素的需要而将整个PageElements
类相互导入
这是一个原始示例:
import { LoginFormElements } from "./login.form"
import { ConfirmDialog } from "./confirm.dialog"
import { MainPage } from "./main.page.elements"
// etc
// etc
class LoginPage {
login(username: string, password: string) {
LoginFormElements.loginInput.setValue(username)
LoginFormElements.passwordInput.setValue(password)
LoginFormElements.loginButton.click()
ConfirmDialog.confirmButton.click()
MainPage.header.waitForDisplayed()
// etc
// etc
}
}
我想要实现的是仅导入我需要的元素,而不是导入整个类。并且在此类上调用元素getter迫使我像上面写长链
现在让我们回到所需的最终结果:
import { searchInput, searchButton } from "./main.page.elements"
class MainPage {
searchFor(query: string) {
searchInput.setValue(query);
searchButton.click()
}
}
我的MainPageElements
班(./main.page.elements.ts
)
export class MainPageElements {
get searchInput() {
return $(".input-locator")
}
get searchButton() {
return $(".search-button-locator")
}
}
要了解的重要事项之一是我不能使用IIFE,因为在页面加载后应该在页面上执行命令$
我正在尝试做这样的事情:
class MainPageElements {
get _searchInput() {
return $(".input-locator")
}
get _searchButton() {
return $(".search-button-locator")
}
}
export function searchInput = new MainPageElements()._searchInput()
我可以成功导入此函数,但我需要用searchInput().setValue()
这样的括号来调用
我奇怪的是,我可以调用类的“ get”方法,例如MyClass.myMethod(不带括号),并且它将在我调用它时执行$命令。 当我尝试将此方法的结果存储到变量时,我不得不在存储结果(duh)之前调用该方法,这对我不起作用,因为这是在我启动代码时发生的,并且那时的特定元素不存在时间
如何导出此单一方法,以便我可以执行相同操作但没有MyClass.
?为了明确起见,MainPageClass不一定是一个类。它可能是一堆导出函数(我猜是吗?)。但是在我看来,使用class
是一种更合适的方法,而不是一个接一个地导出20个函数...
另外,get _searchInput()
可能不是get
方法。我之所以做成get
只是因为它可以不带括号而被调用,但这目前还不够。