XCUIApplication 的通用点击函数
Posted
技术标签:
【中文标题】XCUIApplication 的通用点击函数【英文标题】:generic tap function for XCUIApplication 【发布时间】:2016-09-02 15:31:08 【问题描述】:我们正在尝试从 UIAutomation 迁移到 XCUITests。 对于 UIAutomation,我们提出了一个方便的 'tapOnName' 函数,它只是爬过整个子元素树并点击第一个匹配的元素。
function log(msg)
UIALogger.logDebug(msg);
//recursive function crawling thru an elements hierarchy
//and tapping on the first match of accessibilityIdentifier
//or button text
function tapOnNameWithRoot(name,el)
if (el.name()==name && el.isVisible())
log("tap on itt!!!")
el.tap();
return true;
if (el.toString()=="[object UIAButton]" && el.label()==name)
log("tap on Button!!!")
el.tap();
return true;
var elements=el.elements();
if (elements===null || elements===undefined)
log("elements null or undefined for:"+el.toString());
return false;
for(var i=0,len=elements.length ;i<len;i++)
if (tapOnNameWithRoot(name,elements[i]))
return true;
return false;
var win = UIATarget.localTarget().frontMostApp().mainWindow();
//for ex taps on a button with the text "pushme" in the
//main UIWindow
tapOnNameWithRoot("pushme",win);
没有问题:是否可以使用 XCUIApplication 实现相同的功能?
【问题讨论】:
【参考方案1】:在 XCTest 中有对这个函数的简写支持。
要从任何元素中点击第一个匹配项,您可以获取所有元素并点击第一个:
let app = XCUIApplication()
let element = app.descendentsMatchingType(.Any)["someIdentifier"]
element.tap()
如果您知道它将是什么类型的元素,最好先按该类型进行过滤:
let app = XCUIApplication()
let element = app.buttons["someIdentifier"]
element.tap()
【讨论】:
速记很方便。我们将所有的 UI 元素命名为唯一的,因此我们永远不会有问题来确定这是一个按钮、TabBar 按钮等。 这很好,虽然就速度而言,如果按类型过滤会更快,因为用于检查与标识符匹配的字符串更少,并且如果您运行它也使调试更容易一些遇到问题,因为您不需要查看每个元素的列表。 :)【参考方案2】:你在寻找这样的东西吗:
func tapBasedOnAccessibilityIdentifier(elementType elementType: XCUIElementQuery, accessibilityIdentifier: String)
var isElementExist = false
for element in elementType.allElementsBoundByIndex
if element.label == accessibilityIdentifier
element.tap()
isElementExist = true
break
if !isElementExist
XCTFail("Failed to find element")
您在测试中调用方法的位置,例如:
tapBasedOnAccessibilityIdentifier(elementType: app.staticTexts, accessibilityIdentifier: "Accessibility Identifier")
您可以对其稍作调整,使其满足所有要求。
【讨论】:
以上是关于XCUIApplication 的通用点击函数的主要内容,如果未能解决你的问题,请参考以下文章
XCUIApplication().launch() 永远不会完成
无法从 XCTest 中的 XCUIApplication 访问 TextEditor
如何从 XCUIApplication 对象访问当前的 SceneDelegate?
XCUIApplication().textFields["hiddenTextField"].typeText("input") on UITextField