Ошибка с необработанным значением для перечисления должна быть литералом - PullRequest
1 голос
/ 30 июня 2019

Я пытаюсь в кратчайшие сроки создать стратегию поиска элементов пользовательского интерфейса для наших XCUITests и испытываю проблемы с моим фрагментом кода. Эта стратегия будет использоваться во всех классах страниц и позволит уменьшить количество повторяющегося кода в наших тестах пользовательского интерфейса.

Мы пытаемся реализовать объектную модель страницы в наших тестах, чтобы у нас была четкая реализация структуры страницы и соответствующих действий на странице. У нас есть два разных приложения с одинаковой функциональностью, но идентификатор элемента может измениться на некоторых страницах.

Например, идентификатор кнопки входа в приложение А будет aLoginButton, а идентификатор приложения B будет кнопка bLogin.

Я подумал о реализации, которая показана ниже, но у меня мало проблем с ней.

  1. Необработанное значение для enum case должно быть литералом. Я понимаю, что возвращаемое значение перечисления должно быть строковым или целочисленным литералом, и это поднимает мой вопрос № 2.
  2. Я правильно делаю? Есть лучший способ сделать это ?

В приведенном ниже коде LocatorStrategy будет находиться в своем собственном файле и будет использоваться в отдельных расширениях страницы для хранения / возврата значений местоположения элемента пользовательского интерфейса

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()

Ожидается: регистр класса enum должен содержать два набора данных для элемента по мере необходимости, если идентификатор UIelement отличается в двух разных приложениях. Я не хочу создавать два отдельных элемента дела aMenuItemName и bMenuItemName для решения этой проблемы.

1 Ответ

0 голосов
/ 30 июня 2019

Один из способов сделать это - использовать директивы препроцессора.

Например,

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

И затем вы можете изменить, будет ли это QCOM или RCOM в ваших настройках сборки:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...