web-dev-qa-db-ja.com

XcodeUITestがXCUIElementのプロパティを見つけられないことがあります

私のUIテストでは、一部のXCUIElementのフレームプロパティが見つかりましたが、他のプロパティは見つかりませんでした。
以下で使用されるアクセシビリティ識別子はストーリーボードに設定され、appsetUp()XCUIApplication()として初期化されます。

ストーリーボードのレイアウトは次のとおりです。

enter image description here

テストで使用される2つのUI要素は、テキストフィールドボタンの追加です。

関連するコードは次のとおりです。

_func test() {
    // given
    let mainViewNavigationBar = app.navigationBars[„NavBar“]
    let navBarHeight = mainViewNavigationBar.frame.size.height
    print("navBarHeight: \(navBarHeight)") // is printed out correctly

    let addShoppingItemTextField = app.textFields["TextField"]
    let textFieldHeight = addShoppingItemTextField.frame.size.height // error breakpoint here
    print("textFieldHeight: \(textFieldHeight)")
}
_

テストは、最後から2番目の行のエラーブレークポイントで停止し、次のメッセージが表示されます。

_No matches found for Find: Descendants matching type TextField from input {(
    Application, 0x60000019f070, pid: 13114, label: ‚xxx‘
)}
_

すべてのframeに対して定義する必要があるXCUIElementプロパティが最初のケースで見つかったが、2番目のケースでは見つからなかった理由がわかりません。

[〜#〜]編集[〜#〜]

Olethaは、私の定数addShoppingItemTextFieldXCUIElementQueryであり、frametextFieldプロパティを読み取ろうとしたときに解決する必要があることを以下に指摘しました。
実際、プログラムがテストエラーブレークポイントで停止し、その説明を出力すると、次のようになります。

_Printing description of addShoppingItemTextField:
Query chain:
 →Find: Target Application 0x6080000a6ea0
  ↪︎Find: Descendants matching type TextField
    ↪︎Find: Elements matching predicate '"TextField" IN identifiers'  
_

ただし、アクセシビリティが有効になっていて、アクセシビリティ識別子がTextFieldに設定されていても、検索は失敗します。

enter image description here

私もアプリに挿入しました

_print(textField.accessibilityIdentifier!)
_

viewDidLoad()にあり、TextFieldを正しく出力しました。

回避策として、テストを記録に設定し、textFieldをタップしました。これにより、textFieldにアクセスするためのコードが作成されました。次に、let _addShoppingItemTextField = app.textFields["TextField"]_を(右側は記録によって生成された)に置き換えました。

_let addShoppingItemTextField = app.otherElements.containing(.navigationBar, identifier:"WatchNotOK")
.children(matching: .other).element.children(matching: .other).element
.children(matching: .other).element
_

そして今、コードはエラーなしで動作します。

したがって、textFieldのアクセシビリティ識別子のクエリが正しく機能していないように思われます。

編集2

私はあきらめます:ストーリーボードで何も変更せずに、テストは同じテストエラーで停止します(検索に一致するものが見つかりません:述語 '"WatchNotOK" IN識別子'に一致する要素)行_let navBarHeight = mainViewNavigationBar.frame.size.height_で。これは常に機能しました。
これは、XcodeUIテストが壊れていることを示しています。

5

私はAppleに連絡しました、そして彼らは私のバグを見つけました:
メインビューコントローラーのビューのaccessibilityプロパティがtrueに設定されていました。これは間違っていました。 itmustfalse

enter image description here

説明は docs to isAccessibilityElementにあります。

レシーバーが標準のUIKitコントロールでない限り、このプロパティのデフォルト値はfalseです。この場合、値はtrueです。
支援アプリケーションは、アクセシビリティ要素によって表されるオブジェクトに関する情報のみを取得できます。したがって、障害を持つユーザーがアクセスできるカスタムコントロールまたはビューを実装する場合は、このプロパティをtrueに設定します。この方法の唯一の例外は、アクセス可能である必要がある他のアイテムのコンテナとして機能するだけのビューです。このようなビューは、UIAccessibilityContainerプロトコルを実装し、このプロパティをfalseに設定する必要があります。

メインビューのアクセシビリティをfalseに設定するとすぐに、UIテストは成功しました。

18

上記の回答に加えて... 1点追加したいアクセスしているXCUIElementが画面に表示されないが原因で発生する可能性があります。ログイン画面のテストケースを実行していて、シミュレーターがログイン画面ではなくダッシュボードで起動しているとします。これは私の場合に起こります。ログアウトしてからテストケースを実行しようとしました。エラーが消える

0
pallavi

問題は、要素にframeプロパティが見つからないことではなく、要素自体が見つからなかったことです。

すべてのXCUIElementXCUIElementQueryから派生しています。クエリを解決する最初の試みは、ご想像のとおり、addShoppingItemTextFieldの値を割り当てたときではなく、existsのプロパティ(addShoppingItemTextField以外)に初めてアクセスしたときです。

したがって、frameオブジェクトのXCUIElementプロパティにアクセスしようとすると、その要素を見つけるためのクエリは解決されますが、要素は見つかりません-そのため、「一致するものが見つかりません...」というエラーが表示されます。 frameにアクセスします。これは少し誤解を招く可能性がありますが、発生している問題は、要素が見つからなかったことです。クエリを調整してみてください。

0
Oletha