Тест интерфейса возвращает неверное количество других элементов

У меня есть тест пользовательского интерфейса, который проверяет, отображается ли аннотация на MKMapView,
Поскольку аннотации доступны как otherElements Я использую следующий код:

    let actualPinsShown = shopEasyApp.otherElements.matching(identifier: kLocationPin)
    let actualNrOfPinsShown = actualPinsShown.count
    XCTAssert(actualNrOfPinsShown == 1, "\(actualNrOfPinsShown) pins shown instead of 1")

Обычно это работает нормально, но иногда XCTAssert не удается, потому что actualNrOfPinsShown это 0.
Тем не менее mapView показывает только 1-контактный вид аннотации, и когда я печатаю actualNrOfPinsShown в отладчике я получаю

    t =    28.97s Get number of matches for: Elements matching predicate '"LocationPin" IN identifiers'
    t =   466.00s Snapshot accessibility hierarchy for app with pid 87746
    t =   466.37s Find: Descendants matching type Other
    t =   466.37s Find: Elements matching predicate '"LocationPin" IN identifiers'
    t =   466.37s Snapshot accessibility hierarchy for app with pid 87746
    t =   466.37s Find: Descendants matching type Other
    t =   466.37s Find: Elements matching predicate '"LocationPin" IN identifiers'
    t =   466.38s Snapshot accessibility hierarchy for app with pid 87746
    t =   466.38s Find: Descendants matching type Other
    t =   466.38s Snapshot accessibility hierarchy for app with pid 87746

Printing description of actualPinsShown:
Find: Target Application 0x6040002c5be0
  Output: {
    Application, 0x608000393660, pid: 87746, {{0.0, 0.0}, {375.0, 812.0}}, label: 'Shop Easy!'
  }
  ↪︎Find: Descendants matching type Other
    Output: {
      Other, 0x600000392070, traits: 8589934592, {{0.0, 0.0}, {375.0, 812.0}}
      Other, 0x600000391780, traits: 8589934592, {{0.0, 0.0}, {375.0, 812.0}}
      Other, 0x600000392d70, traits: 8589934592, {{0.0, 0.0}, {375.0, 812.0}}
      Other, 0x600000391370, traits: 8589934592, {{0.0, 812.0}, {375.0, 233.0}}
      Other, 0x600000391510, {{0.0, 0.0}, {375.0, 44.0}}
      Other, 0x6000003815f0, traits: 8590000128, {{125.7, 55.7}, {124.0, 20.3}}, label: 'Grapefruit juice'
      Other, 0x6000003926f0, traits: 8589934592, {{0.0, 0.0}, {375.0, 812.0}}
      Other, 0x6000003911d0, {{0.0, 0.0}, {375.0, 44.0}}
      Other, 0x600000390b50, {{8.7, 24.7}, {81.3, 13.3}}
      Other, 0x600000393180, traits: 8589934592, {{0.0, 0.0}, {375.0, 812.0}}
      Other, 0x6000003912a0, {{14.7, 0.0}, {170.7, 28.3}}
      Other, 0x6000003909b0, {{190.0, 0.0}, {170.3, 28.3}}
      Other, 0x600000390f60, {{14.7, 10.3}, {66.7, 18.0}}
      Other, 0x600000391030, {{21.7, 8.7}, {54.7, 21.3}}
      Other, 0x600000390cf0, {{293.7, 10.3}, {66.7, 18.0}}
      Other, 0x600000390c20, {{293.7, 10.3}, {66.7, 18.0}}
      Other, 0x6000003923b0, traits: 8589934592, {{16.0, 60.0}, {343.0, 710.0}}
      Other, 0x600000390e90, traits: 288230376160100352, {{293.7, 17.7}, {17.0, 10.7}}, label: 'No signal'
      Other, 0x600000390dc0, traits: 288230376160100352, {{315.7, 17.3}, {15.3, 11.0}}, label: '3 of 3 Wi-Fi bars', value: SSID
      Other, 0x600000390a80, traits: 288230376160100864, {{336.0, 17.3}, {24.3, 11.3}}, label: '100% battery power', value: Not charging
      Other, 0x6000003922e0, traits: 8590000128, {{170.0, 11.7}, {35.3, 20.3}}, label: 'Title'
      Other, 0x60000038d680, traits: 8589934592, {{16.0, 60.0}, {343.0, 710.0}}
      Other, 0x600000391920, traits: 8589934592, {{16.0, 60.0}, {343.0, 710.0}}
      Other, 0x600000392140, traits: 8589934592, {{77.1, 401.1}, {30.0, 30.0}}, label: 'Apfel'
      Other, 0x600000391e00, traits: 8589934592, {{294.8, 409.0}, {30.0, 30.0}}, label: 'Feuerwehrmuseum Berlin'
      Other, 0x600000391fa0, traits: 8589934592, {{288.5, 459.8}, {30.0, 30.0}}, label: 'cyber-Wear Heidelberg'
      Other, 0x600000391ed0, traits: 8589934592, {{175.7, 531.8}, {30.0, 30.0}}, label: 'G-f-C Ges. für Catering'
      Other, 0x600000392480, traits: 8589934592, {{182.5, 558.9}, {30.0, 30.0}}, label: 'KM Autowäsche GmbH & Co'
      Other, 0x600000391b90, traits: 8589934592, {{316.8, 619.1}, {30.0, 30.0}}, label: 'Bischof, Harald Fahrzeuglackierer'
      Other, 0x600000391c60, traits: 8589934592, {{242.9, 658.3}, {30.0, 30.0}}, label: 'Squash-In'
      Other, 0x600000391850, traits: 8589934592, {{278.6, 694.3}, {30.0, 30.0}}, label: 'Edmund Böhler'
      Other, 0x600000391ac0, traits: 70377334112256, {{179.3, 419.3}, {32.0, 39.0}}, identifier: 'LocationPin', label: 'AED118DF-488F-4616-BD7D-E29361EBA90C'
    }
    ↪︎Find: Elements matching predicate '"LocationPin" IN identifiers'
      Output: {
        Other, 0x600000391ac0, traits: 70377334112256, {{179.3, 419.3}, {32.0, 39.0}}, identifier: 'LocationPin', label: 'AED118DF-488F-4616-BD7D-E29361EBA90C'
      }

Таким образом, он находит 1-контактный вид аннотации.

Мой вопрос:

Как это может случиться, что actualNrOfPinsShown == 0?

1 ответ

Это связано с тем, что XCTest тесты библиотеки и пользовательского интерфейса не идеальны.

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

Вы можете улучшить свой тест:

let actualPinsShown = shopEasyApp.otherElements.matching(identifier: kLocationPin)

if actualPinsShown.element(boundBy: 0).waitForExistence(5) {
let actualNrOfPinsShown = actualPinsShown.count
XCTAssert(actualNrOfPinsShown == 1, "\(actualNrOfPinsShown) pins shown instead of 1")
} else {
//you can add test fail here, since no elements are visible
}

Код выше будет ждать 5 секунд для первого элемента из элементов, которые вы рассчитываете.

Другие вопросы по тегам