Метод касания не работает в представлении сегодня при выполнении XCUITest

У меня есть приложение с виджетом, и мне нужно автоматизировать создание его скриншотов.

Однако мне сложно это сделать, так как я не могу нажать кнопку «Изменить» в представлении «Сегодня». Если виджеты не установлены, кнопка легко нажимается. Однако после сброса симулятора присутствуют виджеты (карты, напоминания, ярлыки и т. Д.), И кнопка больше не является активной. Что еще хуже, isHittable возвращает true :(

Код, который я пытаюсь запустить:

let app = XCUIApplication()
app.launch()
app.activate()

// Open Notification Center by swiping down
let bottomPoint = app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 2))
app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0)).press(forDuration: 0.1, thenDragTo: bottomPoint)
sleep(1)

// now swipe to reveal Today View (uses custom method)
let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
springboard.scrollViews.firstMatch.swipeRight()
sleep(1)

// To make sure Edit button is visible, swipeUP
springboard.scrollViews.firstMatch.swipeUp()
sleep(2)

// Now tap the edit button (DOESN"T WORK)
springboard.buttons["Edit"].press(forDuration: 1)
sleep(2)

Я создал простой проект для иллюстрации ошибки, которая находится здесь.

Чтобы убедиться в этом сами, откройте iPhone 11 Pro Max и добавьте следующие виджеты в представление «Сегодня»:

  1. Напоминания
  2. Календарь
  3. Направления на картах
  4. Ярлыки
  5. Новости

Затем попробуйте запустить testExample тест из XCUITestCrashUITests. Если это удастся, в конце должна щелкнуть кнопка «Редактировать», и вы должны увидеть экран «Редактировать». Однако на него никогда не нажимают :(

Если бы кто-нибудь мог помочь мне найти решение, это было бы здорово. Я уже перепробовал все, что мог придумать, но не работает ...


person Andriy Gordiychuk    schedule 15.06.2020    source источник
comment
Хорошо, что ты написал код. Я воспроизвел ошибку.   -  person Roman Zakharov    schedule 15.06.2020


Ответы (1)


Иногда tap() дает сбой или ничего не делает. Распространенное решение - нажимать координаты элемента, а не самого элемента.

extension XCUIElement {
    func tapUnhittable() {
        XCTContext.runActivity(named: "Tap \(self) by coordinate") { _ in
            coordinate(withNormalizedOffset: CGVector(dx: 0.0, dy: 0.0)).tap()
        }
    }
}

Вот код, который работает

import XCTest

class XCUITestCrashUITests: XCTestCase {
    func testExample() throws {
        let app = XCUIApplication()
        app.launch()
        let bottomPoint = app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 2))
        app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0)).press(forDuration: 0.1, thenDragTo: bottomPoint)

        let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
        springboard.swipeRight()
        springboard.swipeUp()
        springboard.buttons["Edit"].tapUnhittable()
    }
}
person Roman Zakharov    schedule 15.06.2020