iOS 13 Xcode UI test Несоответствие типов автоматизации - PullRequest
0 голосов
/ 27 октября 2019

Мое приложение использует WKWebView, настроенный в коде (это сделано из-за этой ошибки в iOS 10):

final class HelpViewController: UIViewController {
  // …
    var webView: WKWebView! 

  override func viewDidLoad() {
    super.viewDidLoad()

        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(webView)
        let margins = view.layoutMarginsGuide
        webView.topAnchor.constraint(equalTo: self.back.bottomAnchor).isActive = true
        webView.rightAnchor.constraint(equalTo: margins.rightAnchor).isActive = true
        webView.leftAnchor.constraint(equalTo: margins.leftAnchor).isActive = true
        webView.bottomAnchor.constraint(equalTo: margins.bottomAnchor).isActive = true
        webView.navigationDelegate = self
  //…
}  

Мой тест пользовательского интерфейса выглядит следующим образом:

func test_helpButtonShowsHelpText() {
  //…
    let webView = shopEasyApp.webViews.element
    let webViewExists = webView.waitForExistence(timeout: kDefaultUITestTimeout)
    XCTAssert(webViewExists, "Web view does not exist")
    let webViewIsHittable = webView.isHittable  
  //…  
  }  

Этот тест без проблем запускается до iOS 12.

В iOS 13 он останавливается на тесте webView.isHittable со следующей ошибкой:

Failed to get matching snapshot: Multiple matching elements found for <XCUIElementQuery: 0x600000bdfbb0>.  

В журнале написано:

Assertion Failure: ShopEasyBasicUITests.swift:1100: Failed to get matching snapshot: Multiple matching elements found for <XCUIElementQuery: 0x600003efb4d0>.
Sparse tree of matches:
→Application, pid: 71038, label: 'Shop Easy!'
  ↳Window, {{0.0, 0.0}, {375.0, 812.0}}
    ↳Other, {{0.0, 0.0}, {375.0, 812.0}}
      ↳Other, {{0.0, 0.0}, {375.0, 812.0}}
        ↳WebView, {{16.0, 74.0}, {343.0, 704.0}}
          ↳WebView, {{16.0, 74.0}, {343.0, 704.0}}
            ↳WebView, {{16.0, 74.0}, {343.0, 704.0}}
Possibly caused by runtime issues:
Automation type mismatch: computed WebView from legacy attributes vs ScrollView from modern attribute. Input attributes and values: {
    "XC_kAXXCAttributeAutomationType" = 46;
    "XC_kAXXCAttributeElementBaseType" = UIScrollView;
    "XC_kAXXCAttributeElementType" = WKScrollView;
    "XC_kAXXCAttributeTraits" = 8589934592;
}
Automation type mismatch: computed Other from legacy attributes vs WebView from modern attribute. Input attributes and values: {
    "XC_kAXXCAttributeAutomationType" = 58;
    "XC_kAXXCAttributeElementBaseType" = UIView;
    "XC_kAXXCAttributeElementType" = WKWebView;
    "XC_kAXXCAttributeTraits" = 146028888064;
}
Automation type mismatch: computed Other from legacy attributes vs WebView from modern attribute. Input attributes and values: {
    "XC_kAXXCAttributeAutomationType" = 58;
    "XC_kAXXCAttributeElementBaseType" = UIView;
    "XC_kAXXCAttributeElementType" = WKContentView;
    "XC_kAXXCAttributeTraits" = 146028888064;
}  

Иерархия представлений следующая:
enter image description here

Мои вопросы:
Что не так с моим кодом и как это сделать правильно?

1 Ответ

3 голосов
/ 28 октября 2019

В игре есть три вида WebKit, которые XCTest может видеть:

  • WKScrollView
  • WKWebView
  • WKContentView

Похоже, они изменили способ, которым элементам присваивается свой тип в iOS 13, а это означает, что ваша иерархия представлений теперь содержит несколько элементов, которые разрешаются классифицироваться как WebView. Похоже, что WKWebView и WKContentView теперь оба разрешают быть элементами типа WebView, тогда как в iOS 12 только WKScrollView (который в iOS 13 больше не разрешается классифицировать как WebViewэлемент) был классифицирован как WebView.

Теперь для запроса:

shopEasyApp.webViews.element

В запросе используется element, который предполагается использовать только тогда, когда вы знаете запрос будет преобразован в один элемент. Поскольку теперь для shopEasyApp.webViews есть 2 результата, для element нет ни одного элемента для возврата. Вы можете проверить существование, потому что проверка свойства XCUIElement exists не требует успешного разрешения запроса. Однако все остальные свойства XCUIElement требуют разрешения запроса, поэтому при использовании isHittable механизм XCTest пытается разрешить запрос, обнаруживает, что запрос не разрешается ни к одному элементу, как ожидается, и выдает этоошибка.

Multiple matching elements found for <XCUIElementQuery: 0x600003efb4d0>

Чтобы решить эту проблему, я предлагаю вам изменить запрос, чтобы использовать первый соответствующий индекс вместо использования element:

shopEasyApp.webViews.elementBound(by: 0)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...