有没有一种方法可以导入/导出类“ get”方法并避免使用括号

时间:2020-04-22 06:20:12

标签: typescript oop

只是为了说明幕后发生的事情:我使用的是Web自动化框架WebdriverIO,但这个问题并不关乎它。这就是为什么我没有将其放入标签的原因

命令$("selector")返回一个webElement。而且我可以在此元素上调用不同的WDIO命令(例如setValueclick

“ $命令是按顺序调用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只是因为它可以不带括号而被调用,但这目前还不够。

0 个答案:

没有答案
相关问题