私のUIテストでは、一部のXCUIElement
のフレームプロパティが見つかりましたが、他のプロパティは見つかりませんでした。
以下で使用されるアクセシビリティ識別子はストーリーボードに設定され、app
はsetUp()
でXCUIApplication()
として初期化されます。
ストーリーボードのレイアウトは次のとおりです。
テストで使用される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は、私の定数addShoppingItemTextField
はXCUIElementQuery
であり、frame
のtextField
プロパティを読み取ろうとしたときに解決する必要があることを以下に指摘しました。
実際、プログラムがテストエラーブレークポイントで停止し、その説明を出力すると、次のようになります。
_Printing description of addShoppingItemTextField:
Query chain:
→Find: Target Application 0x6080000a6ea0
↪︎Find: Descendants matching type TextField
↪︎Find: Elements matching predicate '"TextField" IN identifiers'
_
ただし、アクセシビリティが有効になっていて、アクセシビリティ識別子がTextField
に設定されていても、検索は失敗します。
私もアプリに挿入しました
_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テストが壊れていることを示しています。
私はAppleに連絡しました、そして彼らは私のバグを見つけました:
メインビューコントローラーのビューのaccessibility
プロパティがtrue
に設定されていました。これは間違っていました。 itmustfalse
:
説明は docs to isAccessibilityElement
にあります。
レシーバーが標準のUIKitコントロールでない限り、このプロパティのデフォルト値はfalseです。この場合、値はtrueです。
支援アプリケーションは、アクセシビリティ要素によって表されるオブジェクトに関する情報のみを取得できます。したがって、障害を持つユーザーがアクセスできるカスタムコントロールまたはビューを実装する場合は、このプロパティをtrueに設定します。この方法の唯一の例外は、アクセス可能である必要がある他のアイテムのコンテナとして機能するだけのビューです。このようなビューは、UIAccessibilityContainerプロトコルを実装し、このプロパティをfalseに設定する必要があります。
メインビューのアクセシビリティをfalseに設定するとすぐに、UIテストは成功しました。
上記の回答に加えて... 1点追加したいアクセスしているXCUIElementが画面に表示されないが原因で発生する可能性があります。ログイン画面のテストケースを実行していて、シミュレーターがログイン画面ではなくダッシュボードで起動しているとします。これは私の場合に起こります。ログアウトしてからテストケースを実行しようとしました。エラーが消える
問題は、要素にframe
プロパティが見つからないことではなく、要素自体が見つからなかったことです。
すべてのXCUIElement
はXCUIElementQuery
から派生しています。クエリを解決する最初の試みは、ご想像のとおり、addShoppingItemTextField
の値を割り当てたときではなく、exists
のプロパティ(addShoppingItemTextField
以外)に初めてアクセスしたときです。
したがって、frame
オブジェクトのXCUIElement
プロパティにアクセスしようとすると、その要素を見つけるためのクエリは解決されますが、要素は見つかりません-そのため、「一致するものが見つかりません...」というエラーが表示されます。 frame
にアクセスします。これは少し誤解を招く可能性がありますが、発生している問題は、要素が見つからなかったことです。クエリを調整してみてください。