เรามักจะรู้ๆกันว่าเทส iOS ด้วย Appium นั่น มีปัญหาใหญ่ๆคือ รันเทสช้ามากกกกกx10 ซึ่งระยะเวลารันเทสเป็นสิ่งหนึ่งที่เราจำเป็นต้องระลึกไว้เสมอๆว่า เทสที่เราเขียนขึ้นมาจะถูกนำไปใช้ได้จริง หรือเปล่านั้น ระยะเวลาที่ใช้ในการรัน ก็เป็นปัจจัยแรกๆในการตัดสินใจเลยทีเดียว

แล้ว Locator ที่ใช้อยู่มีปัญหายังไง

ถ้า UI ที่ทีม Dev เขียนไว้มี id หรือ name ช่วยอยู่ตลอดก็คงไม่มีปัญหา แต่แน่นอนว่า เราคงคาดหวังอะไรแบบนั้นไม่ได้แน่ ซึ่งทำให้หลายๆครั้งจบลงด้วยการใช้งาน XPath นั่นเอง ซึ่งใช้งานได้ง่าย และคำสั่งไม่ซับซ้อน ทำให้จะเห็นใน test script มีการใช้งาน XPath อยู่เต็มไปหมดเลย

XPath ไม่ดียังไง

ปัญหาคือ การที่จะใช้ XPath ในการหา locator ของ iOS นั้น Appium จะต้องทำการแปลง UI ที่แสดงผลอยู่ของ iOS ให้ออกมาอยู่ในรูปของ XML ซะก่อน โดยขั้นตอนนี้นี่เองที่กินเวลา และทรัพยากรมหาศาล ทำให้เทสที่เราเขียนรันช้าอย่างไม่น่าให้อภัยเลย

มาทำความรู้จักกับ iOS Predicate กัน

Predicate Queries เป็น locator ที่รองรับจาก XCTest โดยตรงเลย หมายความว่า เราสามารถค้นหา element ที่เราต้องการโดยไม่จำเป็นต้องเป็นห่วงเลือก การแปลงจาก UI ไปเป็น XML อีกต่อไป
โดยการใช้งานจะต้องระบุ strategy type เป็น nsp มาดูตัวอย่างกัน

ถ้าใช้ XPath ปกติ

Click Element xpath=//XCUIElementTypeButton[@name="btnLogin"]

ใช้เวลารันไป: 00:00:01.336

ลองเปลี่ยนเป็น nsp

Click Element nsp=type == 'XCUIElementTypeButton' AND name == "Login"

ใช้เวลารันไป: 00:00:00.185

จะเห็นว่าเร้วขึ้นจากเดิมถึง 7 เท่า


แล้ว NSP มีรูปการค้นหายังไงบ้าง

Attributes ที่รองรับ

  1. name (เป็น string)
  2. value (เป็น string หรือ text ถ้าไม่ค่าจะเป็น Nil, ถ้าเป็น checkbox หรือ switch จะเป็น 1,0)
  3. label (เป็น string หรือ text ถ้าไม่ค่าจะเป็น Nil)
  4. rect (x, y, width, height โดยรับเป็น Dictionary variable นั่นเอง)
  5. type (XCUIElementTypeButton)
  6. enable (1/0)
  7. visible (1/0)
  8. accessible (1/0)
  9. accessibilityContainer (1/0)

ตัวอย่างการใช้งาน

# หาปุ่มที่ value ขึ้นต้อนด้วย Bla/bla/BLA และแสดงผลอยู่
type == 'XCUIElementTypeButton' AND value BEGINSWITH[c] 'bla' AND visible == 1

# หา icon หรือ รูป ที่แสดงผลอยู่
type IN {'XCUIElementTypeIcon','XCUIElementTypeImage'} AND visible == 1

# หา Cell ที่ความกว่างมากกว่า 100
type == 'XCUIElementTypeCell' AND rect.width > 100

# หา checkbox ที่แสดงผล หรือ enable อยู่
type == 'XCUIElementTypeCheckBox' AND (visible == 1 OR enabled == 1)

Reference: