Ошибка XCUITest.

Я пишу тесты для своего приложения и вам нужно найти кнопку "Посмотреть еще 2 предложения", на моей странице несколько кнопок, но я бы просто хотел нажать на нее. Когда я пытаюсь это сделать, возникает ошибка: "Найдено несколько совпадений" Итак, вопрос в том, каким образом я могу обойти это, поэтому мой тест будет искать и использовать только одну из кнопок "Просмотреть еще 2 предложения".

Вот мой текущий код

let accordianButton = self.app.buttons["View 2 more offers"]
    if accordianButton.exists {
        accordianButton.tap()
    }
    sleep(1)
}

Ответ 1

Вы должны использовать более продуманный способ запроса своей кнопки, так как есть несколько кнопок, которые соответствуют ей.

    // We fetch all buttons matching "View 2 more offers" (accordianButtonsQuery is a XCUIElementQuery)
    let accordianButtonsQuery = self.app.buttons.matchingIdentifier("View 2 more offers")
    // If there is at least one
    if accordianButtonsQuery.count > 0 {
        // We take the first one and tap it
        let firstButton = accordianButtonsQuery.elementBoundByIndex(0)
        firstButton.tap()
    }

Swift 4:

    let accordianButtonsQuery = self.app.buttons.matching(identifier: "View 2 more offers")
    if accordianButtonsQuery.count > 0 {
        let firstButton = accordianButtonsQuery.element(boundBy: 0)
        firstButton.tap()
    }

Ответ 2

Есть несколько способов решить эту проблему.

Абсолютная индексация

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

XCUIApplication().buttons.element(boundBy: 1)

Однако, в любое время, когда кнопка перемещается по экрану или добавляются другие кнопки, вам может потребоваться обновить запрос.

Обновление доступности

Если у вас есть доступ к производственному коду, вы можете изменить accessibilityTitle на кнопке. Измените его более конкретным, чем текст заголовка, а затем нажмите кнопку с помощью теста, используя новый заголовок. Это свойство отображается только для тестирования и не будет отображаться пользователю при чтении с экрана.

Более конкретный запрос

Если две кнопки вложены внутри других элементов пользовательского интерфейса, вы можете написать более конкретный запрос. Скажем, например, что каждая кнопка находится внутри ячейки таблицы. Вы можете добавить доступ к ячейкам таблицы, а затем запросить кнопку.

let app = XCUIApplication()
app.cells["First Cell"].buttons["View 2 more offers"].tap()
app.cells["Second Cell"].buttons["View 2 more offers"].tap()

Ответ 3

Xcode 9 представляет свойство firstMatch для решения этой проблемы:

app.staticTexts["View 2 more offers"].firstMatch.tap()

Ответ 4

Вы должны использовать matching, затем element, например

let predicate = NSPredicate(format: "identifier CONTAINS 'Cat'")
let image = app.images.matching(predicate).element(boundBy: 0)