使用Swift枚举组织XCUIElement

使用XCUITest框架自动化iOS应用程序可以确保从用户的角度来看,该应用程序可以按预期运行。 自Apple在WWDC 2015中推出UI测试支持以来,此框架在iOS开发人员中广受欢迎,因为他们现在可以在Swift和XCTest框架中编写与单元测​​试相同的UI测试。 在这篇简短的文章中,我们将看到如何更好地使用Swift枚举在屏幕上组织XCUIElements(即定位器)。 这是我一个聪明的同事在工作中分享的一个简短技巧。

在Selenium或Appium世界中,您可能听说过一些用于抽象或存储UI元素的模式,例如页面对象或屏幕播放。 我们可以将UI元素存储在单独的类或Struct中,然后可以在测试或步骤定义等中访问这些元素。在Swift中,我们可以利用Swift枚举来存储我们的UI元素(也称为XCUIElements)。 Swift枚举比类和结构好得多,因为我们可以根据需要向枚举添加函数。 使用枚举的另一个好处是,我们可以在整个UI目标上访问枚举,而无需创建对象或引用为静态值。

假设我们的iOS应用程序有一个主屏幕,其中包含3个按钮,2个静态文本。 我们可以很容易地用这6种情况编写一个枚举。

 导入XCTest 
枚举HomeScreen:字符串{
案例guestButton
案例寄存器按钮
案例loginButton
案例welcomeText
案例介绍
var元素:XCUIElement {
切换自我{
case .guestButton:
返回XCUIApplication()。buttons [“ Hello”]
案例.registerButton:
返回XCUIApplication()。buttons [“注册”]
案例.loginButton:
返回XCUIApplication()。buttons [“登录”]
案例.welcomeText:
返回XCUIApplication()。staticTexts [“ Welcome”]
案例.introText:
返回XCUIApplication()。staticTexts [“ app简介”]
}
}
}

现在,我们已经使用可以在UI测试目标中任何位置使用的Swift枚举定义了主屏幕中的所有元素。 这是我以前采用的一种方法,在我之前编写的BDD工具XCFit中也对此进行了说明。 这种方法没有错,因为我们可以根据需要独立访问所有这些元素。 但是,有一种更好的方法可以使用Swift枚举,这样我们可以节省很多代码并仍然达到相同的结果。

在前面提到的方法中,我们已经分别定义了所有元素,我们可以通过以下方式重构上面的枚举

  • 按类型对XCUIElement进行分组,例如按钮,静态文本
  • 将值分配给枚举案例,通常是元素的可访问性标识符

然后,我们可以在XCUIElements中使用案例的原始值。 因此,我们可以重构上面的枚举,如下所示。

 导入XCTest 
枚举HomeScreen:字符串{
case guestButton =“你好”
case registerButton =“注册”
case loginButton =“登录”
case welcomeText =“欢迎”
case introText =“应用程序简介”
var元素:XCUIElement {
切换自我{
case .guestButton,.registerButton,.loginButton:
返回XCUIApplication()。buttons [self.rawValue]
大小写.welcomeText,.introText:
返回XCUIApplication()。staticTexts [self.rawValue]
}
}
}

现在,我们已经将字符串值分配给枚举案例,并将案例分组为按钮和静态文本。 这使我们原来的枚举更加简短。

如果您想将类型分开,我们可以这样重写枚举:

 枚举HomeScreen:字符串{ 
case guestButton =“你好”
case registerButton =“注册”
case loginButton =“登录”
case welcomeText =“欢迎”
case introText =“应用程序简介”
var元素:XCUIElement {
如果buttonElements.contains(self){
返回XCUIApplication()。buttons [self.rawValue]
}
如果textElements.contains(self){
返回XCUIApplication()。staticTexts [self.rawValue]
}
fatalError(“找不到元素”)
}私人var buttonElements:[HomeScreen] {
返回[.guestButton,.registerButton,.loginButton]
} private var textElements:[HomeScreen] {
返回[.welcomeText,.introText]
}
}

现在,我们可以轻松地将元素类型分组,例如按钮,staticTexts,图像等。

您可以选择任何合适的方法。

通过使用Swift编程语言的一些强大功能,我们可以使我们的XCUITests更智能,更快和可扩展。 在这个例子中,我们已经看到了如何使用Swift枚举存储XCUIElement,稍后我将向专家分享更多的XCUITest技巧。 让我知道您是否有更好的方法在注释中存储XCUIElements。

注意:这篇文章最初发布在XCBlog上,请阅读原始文章以获得更好的图形,并且 此处 不会遗漏任何内容