iOSアプリのUIオートメーションを始めたばかりで、すでに問題が発生しています。スクリーンショットを添付できないので、シナリオを説明するために最善を尽くします。
iOS 6.0用にビルドしていて、ストーリーボードを使用しています。アプリは、ナビゲーションコントローラーを備えた画面で起動します。ルートビューコントローラーには、画面の下部60%を占める1つのUIViewサブビューと、そのサブビューの上にあるセグメント化されたコントロールを持つメインビューが含まれています。メインビュー(「mainview」というラベル)のアクセシビリティを構成できました。その後、テストでこの要素を問題なく見つけることができます。ただし、セグメント化されたコントローラーを見つけるのに問題があります。そこで、「mainview」要素から「elements()」と「segementedControls()」の長さをログアウトすることにしました。各配列の長さは0です。したがって、テストの実行中に、サブがないと言っているのです。 -メインビューの要素。
もう1つ注意すべき点は、セグメント化されたコントロールのストーリーボードエディターのIDインスペクターにアクセシビリティセクションが見つからなかったことです。ただし、一時的にメインビューにボタンを追加し、ユーザー補助ラベルを使用して構成しました。これは、elements()またはbuttons()の呼び出しが、テストの実行時にメインビューの要素を後で表示するかどうかをテストするためですが、これらの配列は引き続き使用されていました。ボタンを使用しても、空として返されます。
これが私のスクリプトです:
var target = UIATarget.localTarget();
var app = target.frontMostApp();
function selectListView() {
var testName = "selectListView";
UIALogger.logStart(testName);
var view = app.mainWindow().elements()["mainview"];
if (!view.isValid()) {
UIALogger.logFail("Could not locate main view");
}
UIALogger.logMessage("Number of elements for sub element: " + view.elements().length);
var segmentedControl = view.segmentedControls()[0];
if (!segmentedControl.isValid()) {
UIALogger.logFail("Could not locate segmented control on physician collection parent view");
}
var listButton = segmentedControl.buttons()[1];
if (!listButton.isValid()) {
UIALogger.logFail("Could not locate list button on segemented controller on physician collection parent view");
}
UIALogger.logMessage("Tapping List button on physician collection view's segmented control");
listButton.tap();
UIALogger.logPass(testName);
}
selectListView();
どんな助けでも大歓迎です。
編集:これをスクリプトに追加して、メインウィンドウからビュー階層全体を検索し、initWithCoderでセグメント化されたコントロールのアクセシビリティラベル値を設定しました(セグメント化されたコントロールのストーリーボードエディターで設定できないため、前に述べたように)、それでも要素を見つけることができませんでした-画面上にあり、正常に機能しているにもかかわらず、ビュー階層にないかのようです:
function traverse(root, name) {
if (root.name() == name) {
return root;
}
var elements = root.elements();
for (var i = 0; i < elements.length; i++) {
var e = elements[i];
var result = traverse(e, name);
if(result != null) {
return result;
}
}
return null;
}
function selectListView() {
var testName = "selectListView";
var segmentedControl = traverse(UIATarget.localTarget().frontMostApp().mainWindow(), "mysegementedcontrol");
if (segmentedControl == null) {
UIALogger.logMessage("Still could not find it");
}
....
}
編集:app.logElementTree()への呼び出しを追加しましたが、セグメント化されたコントロールはまだ表示されていません( "PhysicianCollectionParentView"は私の"メインビュー"です-ご覧のとおり、サブ要素はありません):
編集:ここにいくつかのスクリーンショットがあります。最初は私の「マスター」ビューコントローラーを示しています。次は、セグメント化されたコントロールに加えて、UIViewサブビューもあることを示しています。3つ目は、ストーリーボード内のアプリの基本的なエントリポイントを示しています。
これが私の「マスター」ビューコントローラーのクラス拡張で、セグメント化されたコントロールと他のUIViewサブビューのアウトレットを示しています。
@interface PhysicianCollectionMasterViewController ()
@property (strong, nonatomic) IBOutlet UISegmentedControl *viewSelectionControl;
@property (strong, nonatomic) IBOutlet UIView *physicianCollectionView;
@end
編集:これは非常に興味深いものです-楽器内で作成されたまったく新しいスクリプトを使用して、レコード機能を利用することにしました。セグメント化されたコントロールをクリックすると、セグメント化されたコントロールのボタンの1つにどのようにアクセスしたかを示すJavaScriptが作成されました。
var target = UIATarget.localTarget();
target.frontMostApp().mainWindow().elements()["PhysicianCollectionParentView"].tapWithOptions({tapOffset:{x:0.45, y:0.04}});
したがって、最悪の場合、このようなものを使用できると思いますが、UIオートメーションがコントロールが存在するとは考えていないことは私には意味がありません。とても奇妙。何か足りないものがあるはずですが、私のセットアップはとても基本的で、それが何であるか想像できません。