การทดสอบ Xcode UI - ความล้มเหลวในการทดสอบ UI - ไม่สามารถเลื่อนเพื่อมองเห็นได้ (โดยการกระทำของ AX) เมื่อแตะที่ช่องค้นหาปุ่ม "ยกเลิก"


85

ฉันพยายามปิดช่องค้นหาโดยแตะปุ่ม "ยกเลิก" ในแถบค้นหา

กรณีทดสอบไม่พบปุ่มยกเลิก มันทำงานได้ดีใน Xcode 7.0.1

ฉันได้เพิ่มเพรดิเคตเพื่อรอให้ปุ่มปรากฏ กรณีทดสอบล้มเหลวเมื่อเราแตะปุ่ม "ยกเลิก"

let button = app.buttons[“Cancel”]
let existsPredicate = NSPredicate(format: "exists == 1")

expectationForPredicate(existsPredicate, evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)

button.tap() // Failing here

บันทึก :

    t =     7.21s     Tap SearchField
t =     7.21s         Wait for app to idle
t =     7.29s         Find the SearchField
t =     7.29s             Snapshot accessibility hierarchy for com.test.mail
t =     7.49s             Find: Descendants matching type SearchField
t =     7.49s             Find: Element at index 0
t =     7.49s             Wait for app to idle
t =     7.55s         Synthesize event
t =     7.84s         Wait for app to idle
t =     8.97s     Type 'vinayak@xmd.net' into
t =     8.97s         Wait for app to idle
t =     9.03s         Find the "Search" SearchField
t =     9.03s             Snapshot accessibility hierarchy for com.test.mail
t =     9.35s             Find: Descendants matching type SearchField
t =     9.35s             Find: Element at index 0
t =     9.36s             Wait for app to idle
t =     9.42s         Synthesize event
t =    10.37s         Wait for app to idle
t =    10.44s     Check predicate `exists == 1` against object `"Cancel" Button`
t =    10.44s         Snapshot accessibility hierarchy for com.test.mail
t =    10.58s         Find: Descendants matching type Button
t =    10.58s         Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.58s     Tap "Cancel" Button
t =    10.58s         Wait for app to idle
t =    10.64s         Find the "Cancel" Button
t =    10.64s             Snapshot accessibility hierarchy for com.test.mail
t =    10.78s             Find: Descendants matching type Button
t =    10.78s             Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.79s             Wait for app to idle
t =    11.08s         Synthesize event
t =    11.13s             Scroll element to visible
t =    11.14s             Assertion Failure: UI Testing Failure - Failed to scroll to visible (by AX action) Button 0x7f7fcaebde40: traits: 8589934593, {{353.0, 26.0}, {53.0, 30.0}}, label: 'Cancel', error: Error -25204 performing AXAction 2003

@ Joe Masilotti ความคิดใด ๆ ?
Vinpai

เพียงแค่ตรวจสอบความสมบูรณ์ แต่ปุ่มยกเลิกอยู่บนหน้าจอหรือไม่หรือต้องเลื่อนไปที่? ฉันรู้ว่ายังมีปัญหาที่การเลื่อนไปยังองค์ประกอบไม่ได้ผลเสมอไป
Joe Masilotti

ปุ่มยกเลิก @JoeMasilotti อยู่บนหน้าจอ ปุ่มยกเลิกเป็นปุ่มเริ่มต้นของระบบซึ่งเป็นส่วนหนึ่งของ UISearchbar มันทำงานได้ดีใน Xcode 7.0.1 เมื่อฉันทำ [self.buttons [@ "Cancel"] tap];
Vinpai

1
@ Vinpai จะเกิดอะไรขึ้นเมื่อคุณเพิ่มapp.tables.cells.allElementsBoundByAccessibilityElement.countก่อนที่จะแตะปุ่มของคุณ? แค่อยากรู้อยากเห็น - สิ่งนี้ช่วย 'รีเฟรช' หน้าจอให้ฉันในบางครั้ง
cakes88

@Konnor ฉันลองใช้ API ที่คุณแนะนำแล้ว แต่มันล้มเหลวเมื่อฉันแตะที่ปุ่มยกเลิก เมื่อฉันค้นหา application.buttons ใน debugger มันจะแสดงปุ่มยกเลิก
Vinpai

คำตอบ:


140

ผมคิดว่าที่นี่ "ยกเลิก" ผลตอบแทนที่ปุ่มfalseสำหรับhittableคุณสมบัติที่ได้รับการป้องกันจากการแตะ

หากคุณเห็นtap()ในเอกสารระบุว่า

/*!
 * Sends a tap event to a hittable point computed for the element.
 */
- (void)tap;

ดูเหมือนว่าสิ่งต่าง ๆ จะเสียด้วย XCode 7.1 เพื่อไม่ให้ตัวเอง (และคุณด้วย;)) ถูกบล็อกจากปัญหาเหล่านี้ฉันได้เขียนส่วนขยายXCUIElementที่อนุญาตให้แตะที่องค์ประกอบแม้ว่าจะไม่สามารถตีได้ก็ตาม การติดตามสามารถช่วยคุณได้

/*Sends a tap event to a hittable/unhittable element.*/
extension XCUIElement {
    func forceTapElement() {
        if self.hittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0))
            coordinate.tap()
        }
    }
}

ตอนนี้คุณสามารถโทรเป็น

button.forceTapElement()

อัปเดต - สำหรับ swift 3 ให้ใช้ดังต่อไปนี้:

extension XCUIElement {
    func forceTapElement() {
        if self.isHittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: CGVector(dx:0.0, dy:0.0))
            coordinate.tap()
        }
    }
}

ขอบคุณสำหรับการแก้ไข ฉันพบปัญหาที่คล้ายกันcell.tap()และสิ่งนี้ได้รับการแก้ไขแล้ว ดูเหมือนจะมีการเปลี่ยนแปลงบางอย่างใน Xcode7.1 ทำให้องค์ประกอบบางอย่างไม่สามารถ
กดปุ่ม

ฉันมี navigationBar backButtonItem แบบกำหนดเองที่ไม่ 'hittable' ใน Xcode7.1 และวิธีนี้ใช้ได้กับฉันself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
Alex

ขอบคุณ - ทำงานสำหรับปัญหาเดียวกันของฉัน
Tache

7
ในกรณีของฉันมันใช้งานได้เมื่อแตะอยู่ตรงกลางมุมมอง เปลี่ยนค่าชดเชยเป็น (0.5, 0.5) let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Graham Perks

1
การทำงานที่ดี. ฉันเกือบจะเริ่มฆ่า macbook ก่อนที่จะเห็นสิ่งนี้
ChaosSpeeder

11

สำหรับฉันแล้วต้นเหตุมาจากวัตถุที่ฉันต้องการแตะ

  • ถูกตั้งค่าเป็นซ่อน (และย้อนกลับ)
  • ถูกถอดออกและติดใหม่

ในทั้งสองกรณีisAccessibilityElementทรัพย์สินคือfalseหลังจากนั้น การตั้งค่ากลับไปtrueแก้ไข


3
นี่คือปัญหาของฉัน น่าแปลกที่มันเริ่มเกิดขึ้นใน iOS 11 (ใช้งานได้ดีบน iOS 10)
Ricardo Sanchez-Saez

4

คำถามนี้อันดับดีสำหรับการค้นหาของ Google รอบระยะ"ไม่สามารถเลื่อนการมองเห็น (โดยการกระทำขวาน) ปุ่ม" เมื่อพิจารณาถึงอายุของคำถามฉันมีแนวโน้มที่จะคิดว่านี่ไม่ใช่ปัญหากับกรอบงาน XCUITest อีกต่อไปตามคำตอบที่ได้รับการยอมรับแนะนำ

ฉันพบว่าปัญหานี้เกิดจากสิ่งXCElementที่มีอยู่ แต่ถูกซ่อนอยู่หลังแป้นพิมพ์ซอฟต์แวร์ ข้อผิดพลาดถูกปล่อยออกมาจากกรอบงานเนื่องจากไม่สามารถเลื่อนมุมมองที่มีอยู่ในมุมมองเพื่อให้แตะได้ ในกรณีของปุ่มในคำถามอยู่เบื้องหลังแป้นพิมพ์ซอฟต์แวร์บางครั้ง

ฉันพบว่าแป้นพิมพ์ซอฟต์แวร์ของ iOS Simulator อาจถูกปิดใช้งานในบางกรณี (เช่น: บนเครื่องของคุณ) และเปิดใช้งานแบบอื่น (เช่นบน CI ของคุณ) ในกรณีของฉันฉันต้องปิดแป้นพิมพ์ซอฟต์แวร์ในเครื่องหนึ่งและโดยค่าเริ่มต้นจะเปิดใช้งานเครื่องอื่น

วิธีแก้ไข: ปิดแป้นพิมพ์ก่อนที่จะพยายามแตะปุ่มที่อาจอยู่ข้างหลัง

ฉันพบว่าการแตะที่ไหนสักแห่งที่ปิดแป้นพิมพ์อย่างชัดเจนก่อนที่จะแตะที่ปุ่มนั้นช่วยแก้ปัญหาของฉันได้ในทุกสภาพแวดล้อม

ฉันได้เพิ่มเพิ่มการดำเนินการบางอย่างเพื่อให้ผู้ตอบกลับปัจจุบันลาออกก่อนตอบกลับ มุมมองเบื้องหลังมุมมองข้อความของฉันจะบังคับให้ผู้ตอบคนแรกลาออกดังนั้นฉันจึงแตะที่ไหนสักแห่งที่อยู่ใต้พื้นที่ข้อความสุดท้าย

 /// The keyboard may be up, dismiss it by tapping just below the password field
let pointBelowPassword = passwordSecureTextField.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 1))
pointBelowPassword.press(forDuration: 0.1)

2

โปรดตรวจสอบลักษณะขององค์ประกอบฉันประสบปัญหาเดียวกันกับ TableViewSectionHeader ฉันพยายามแตะ แต่มันล้มเหลวในทุกจุด

ป้อนคำอธิบายภาพที่นี่


1

วิธีแก้ปัญหาของ Sandy ดูเหมือนจะช่วยได้ระยะหนึ่ง แต่ก็ไม่อีกต่อไป - จากนั้นฉันก็เปลี่ยนเป็นแบบนี้:

func waitAndForceTap(timeout: UInt32 = 5000) {
    XCTAssert(waitForElement(timeout: timeout))
    coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap()
}

ประเด็นหลักคือเนื่องจากปัญหาคือ isHittable check มีข้อยกเว้นฉันไม่ทำการตรวจสอบนี้เลยและไปหาพิกัดทันทีหลังจากพบองค์ประกอบ


0

ในกรณีของฉันมันมีองค์ประกอบ UI ที่เพิ่มโดยทางโปรแกรมครอบคลุมปุ่ม


0

หากคุณใช้โปรแกรมจำลอง AppCenter เพื่อเรียกใช้การทดสอบคุณควรตรวจสอบให้แน่ใจว่าคุณกำลังทำการทดสอบบนอุปกรณ์เวอร์ชันเดียวกันกับเครื่องจำลองในพื้นที่ของคุณ ฉันขาดงาน 3 วันเพราะเหตุนี้


0

ด้วยจิตวิญญาณของสิ่งที่สามารถครอบคลุมองค์ประกอบของคุณฉันมีดีบักเกอร์ RN บางส่วนซ้อนทับอยู่ที่ด้านบนของไอคอนของฉัน:

ป้อนคำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.