枚举大小写错误原始值必须是文字

时间:2019-06-30 08:18:17

标签: swift

我正在尝试为我们的XCUITests迅速构建UI元素定位器策略,并对我的代码段有麻烦。此策略将在所有页面类中使用,并将减少UI测试中的大量重复代码。

我们正在尝试在测试中实现页面对象模型,以便我们可以清晰地实现Page结构以及页面上的相应操作。我们有两个具有相同功能的不同应用程序,但元素ID可能在某些页面上更改。

例如,应用A的登录按钮的ID为aLoginButton,而应用B的ID为bLogin按钮。

我考虑过下面显示的实现,但是问题很少。

  1. 枚举大小写的原始值必须是文字。我了解枚举的返回值应为字符串或整数文字,这会引发我的问题编号2。
  2. 我做对了吗?有一个更好的方法吗 ?

在下面的代码中,LocatorStrategy将位于其自己的文件中,并将在各个页面扩展中使用以保存/返回UI元素位置值

P.S我是Swift的新手。

class BasePage {
    func qcom_rcom(qcomId: String , rcomId: String) -> String {
        if QCOM 
          return qcomId
        else 
          return rcomId
    }
}


class LoginPage : BasePage {
    override init() {
        super.init()
        print(Locators.menuItemName.identifier)
    }


}

extension LoginPage {
    enum Locators: String, LocatorStrategy {
        case menuItemName = qcom_rcom("aLoginButton", "bLoginButton") // getting error here
    }
}

public protocol LocatorStrategy {
    var identifier: String { get }
}

public extension LocatorStrategy where Self: RawRepresentable, Self.RawValue == String {

    var identifier: String {
        return rawValue
    }
}

LoginPage.init()

Expected:如果两个不同应用程序上的UIelement id不同,则枚举类需要根据需要为元素保留两组数据。我不想创建两个单独的案例项目aMenuItemName和bMenuItemName来解决此问题。

1 个答案:

答案 0 :(得分:0)

一种方法是使用预处理程序指令。

例如,

enum Locators: String, LocatorStrategy {
#if QCOM
    case menuItemName = "aLoginButton"
#elseif RCOM
    case menuItemName = "bLoginButton"
#endif
}

然后您可以在构建设置中更改它是QCOM还是RCOM:

enter image description here