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

Swift 枚举大小写的错误原始值必须是文字,swift,Swift,我正在尝试为swift中的XUITEST构建一个UI元素定位器策略,但我的代码片段有问题。此策略将用于所有页面类,并将减少UI测试中的大量重复代码 我们试图在测试中实现一个页面对象模型,这样我们就可以清楚地实现页面结构和页面上的相应操作。我们有两个具有相同功能的不同应用程序,但元素ID可能会在某些页面上更改 e、 g,应用程序A的登录按钮id将是aLoginButton,应用程序B的id将是BloginButton 我曾经考虑过一个如下所示的实现,但它没有什么问题 枚举大小写的原始值必须是文字。

我正在尝试为swift中的XUITEST构建一个UI元素定位器策略,但我的代码片段有问题。此策略将用于所有页面类,并将减少UI测试中的大量重复代码

我们试图在测试中实现一个页面对象模型,这样我们就可以清楚地实现页面结构和页面上的相应操作。我们有两个具有相同功能的不同应用程序,但元素ID可能会在某些页面上更改

e、 g,应用程序A的登录按钮id将是aLoginButton,应用程序B的id将是BloginButton

我曾经考虑过一个如下所示的实现,但它没有什么问题

  • 枚举大小写的原始值必须是文字。我知道枚举返回值应该是字符串或整数文本,这引发了我的问题2
  • 我做得对吗?有更好的方法吗 在下面的代码中,LocatorStrategy将位于它自己的文件中,并将在各个页面扩展名中使用,以保存/返回UI元素位置值

    另外,我对斯威夫特还不熟悉

    类基本页{
    func qcom_rcom(qcomId:String,rcomId:String)->String{
    如果是QCOM
    返回qcomId
    其他的
    返回rcomId
    }
    }
    类登录页面:BasePage{
    重写init(){
    super.init()
    打印(Locators.menuItemName.identifier)
    }
    }
    扩展登录页{
    枚举定位器:字符串,定位器策略{
    case menuItemName=qcom_rcom(“aLoginButton”、“bLoginButton”)//此处获取错误
    }
    }
    公共协议定位策略{
    变量标识符:字符串{get}
    }
    公共扩展定位器策略,其中Self:RawRepresentable,Self.RawValue==String{
    变量标识符:字符串{
    返回原始值
    }
    }
    LoginPage.init()
    

    预期:如果UIelement id在两个不同的应用程序上不同,则enum类案例需要根据需要保存元素的两组数据。我不想创建两个单独的case项aMenuItemName和bMenuItemName来解决此问题。

    一种方法是使用预处理器指令

    比如说,

    enum Locators: String, LocatorStrategy {
    #if QCOM
        case menuItemName = "aLoginButton"
    #elseif RCOM
        case menuItemName = "bLoginButton"
    #endif
    }
    
    然后,您可以在生成设置中更改它是QCOM还是RCOM:


    什么是
    QCOM
    ?它是编译时常量吗?这个错误消息有什么不清楚的地方
    qcom\u rcom
    是一个函数,而不是一个文本。例如,
    “aLoginButton”
    是一个文本。由于您是Swift新手,请遵守命名约定,即函数和变量是camelCased而不是snake_cased@sweeperyes QCOM是一个编译时常量,用于查看正在测试的应用程序,并将相应地返回id。我知道这是一个函数,但正如我提到的,有时我需要返回一个字符串文字或其他基于正在测试的应用程序。我想在case中调用一个方法,它将为我完成这项工作,这样我就可以使用单个case项本身。我将用camelCase更新我的代码谢谢:)