5

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サブビューもあることを示しています

これは、ストーリーボードファイルの基本的なエントリポイント部分を示しています

これが私の「マスター」ビューコントローラーのクラス拡張で、セグメント化されたコントロールと他の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オートメーションがコントロールが存在するとは考えていないことは私には意味がありません。とても奇妙。何か足りないものがあるはずですが、私のセットアップはとても基本的で、それが何であるか想像できません。

4

2 に答える 2

4

要素にaccessibilityLabelを設定してフラグを立てるとisAccessibilityElement = YES;、その要素のサブビューは非表示になります。自動化には、accessibilityLabelの代わりにaccessibilityIdentifierを使用して設定する必要がありますisAccessibilityElement = NO;

doctorCollectionViewがレンダリングされた後のObjectiveCコードで、ラベルとアクセシビリティフラグを削除し、代わりにこれを実行します。

physicianCollectionView.accessibilityIdentifier = @"PhysicianCollectionParentView";
physicianCollectionView.isAccessibilityElement = NO;

サブビューを持たない要素ツリーの最後の要素については、isAccessibilityElement = YES;

于 2014-03-14T00:52:44.193 に答える
1

まだ試していない場合は、スクリプトの先頭に遅延を追加してみてください。

UIATarget.localTarget().delay(3);

上記で投稿したlogElementTree()の前に、アプリのレンダリング/アニメーション化が完了していない可能性があると思います。自動テストスクリプトの最初と各アプリケーション遷移の間に遅延を追加して、画面のレンダリングが終了したことを確認します。

編集:テストアプリでセットアップをいじった後、問題は、セグメント化されたコントロールを含むUIViewでアクセシビリティを有効にしていることだと思います。UIViewでアクセシビリティを無効にすると、UISegmentedControlを要素ツリーに表示できますが、有効にすると、UIViewは子のないUIAElementとして表示を開始します。私の提案は、含まれているUIViewのアクセシビリティを無効にし、基本コントロール(ボタン、テーブルビューセル、セグメント化されたボタンコントロールなど)にのみアクセシビリティを使用することです。

于 2013-02-14T21:00:36.937 に答える