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?

XCTest UI 测试 - 拖放

XCUIApplication().textFields["hiddenTextField"].typeText("input") on UITextField

XCUIElement 点击不适用于自定义表格视图单元格