0

複数のUIPickerViewを持つビューコントローラ用のXcode UIテストケースを開発する際、XCUITest内でピッカーを一意に識別できるようにするいくつかのバグがありました。XCUITest中に複数のUIPickerViewsにアクセシビリティ識別子を指定する方法

enter image description here

しかし、私は確認しても、これは、UIPickerViewのために全く動作しません:

何「はず」の仕事は、単にそのようにストーリーボードの中から、アクセス識別子、またはアクセシビリティラベルを設定することですUIPickerViewに対してaccessibilityLabelプロパティとaccessibilityIdentifierプロパティが設定されます。そして、はい、私はどちらか一方または両方でそれを試しました。私はプログラム的にどちらか一方または両方を設定しようと試みました。 XCUITestケース内の以下の行は関係なく、ピッカーを見つけるために失敗します。

XCUIElement *shippingMethodPicker = app.pickerWheels[@"Shipping method"]; 
[shippingMethodPicker adjustToPickerWheelValue:@"USPS Media Mail"]; 

既知の問題であり、解決策は、ビューコントローラもUIPickerViewAccessibilityDelegateを行い、実装するだろうということを思われます - (NSString *)pickerView:(UIPickerView *)pickerView accessibilityLabelForComponent:(NSInteger)コンポーネントデリゲートメソッド。

Apple API Documentationは、アクセシビリティラベルを各pickerWheelsコンポーネントに一意に適用するために必要なものを正確に記述しているようです。

しかし、これも盗聴され、pickerViewパラメータは、実際にUIPickerView *ないが、原因デリゲートメソッドで実装不良にこのstackoverflowのリンクUnable to get pickerView.tag in -pickerView:accessibilityLabelForComponent: method

に参照されるように、あなたはデリゲートがされUIPickerViewを決定することはできません複数のピッカーを持つビューでは役に立たないために呼び出されました。

ストーリーボードのアプローチがうまくいっていて、アクセシビリティデリゲートも迷惑をかけると、XCUITestテストケース内のビューコントローラで2つ以上のUIPickerViewを一意に識別する方法を見つけることができませんでした。

誰でも解決策がありますか?

答えて

0

前のstackoverflowのリンクのコメントに注目して、自分の要件に合った解決策を見つけました。

enter image description here

アクセシビリティデリゲートメソッド、

- (NSString *)pickerView:(UIPickerView *)pickerView accessibilityLabelForComponent:(NSInteger)component; 

非常に盗聴され、UIPickerView *を持っていませんが、むしろ:私たちは前のリンクを確認することができますデバッガから

は観察がコメントプライベートクラスUIAccessibilityPickerComponent *デバッガで注意できるように、プライベートクラスのプライベート _pickerプロパティに実際のUIPickerView *があります。

レーダーが開かれました。

これは内部テストの問題ですが、これはApp Storeのアプリには含まれていません。だから我々はこの問題を回避するためにプライベートインターフェイスを使うことができます。 UIテストを実行するときにのみこれをコンパイルします。

最初に、Testでのみ使用するXcodeで、Debugから複製された新しいビルド設定を作成します。その中に新しいプリプロセッサを作成して-DXCUITESTを定義し、この新しいビルド設定をあなたのスキームのTestに設定してください。次のように

その後アクセシビリティデリゲートを実装:

#pragma mark - UIPickerViewAccessibilityDelegate 

#ifdef XCUITEST 
- (NSString *)pickerView:(UIPickerView *)pickerView accessibilityLabelForComponent:(NSInteger)component { 

    NSString *label; 
    UIPickerView *realPickerView; 
    Ivar picker; 

    // we are going to work around a bug where the pickerView on this delegate is the wrong class by 
    // pulling the UIPickerView * that we need from the private property of the UIAccessibilityPickerComponent class 
    picker = class_getInstanceVariable([NSClassFromString(@"UIAccessibilityPickerComponent") class], "_picker"); 

    // check if the bug still exists and apply workaround only if necessary 
    if (![pickerView isKindOfClass:[UIPickerView class]]) 
     realPickerView = object_getIvar(pickerView, picker); 
    else 
     realPickerView = pickerView; 

    if (realPickerView == self.shippingMethod) 
     label = @"Shipping method"; 
    else if (realPickerView == self.someOtherPicker) 
     label = @"SomeOtherPicker"; 

    return label; 
} 
#endif 

この回避策でXCUITestはすべて一意に識別される単一のビュー上に2つ、さらには3 UIPickerViewsの期待、成功したテストの状況として実行ついにをテストケース。私の場合、これらは単輪ピッカーだったので、マルチホイールピッカーの問題を解決したい場合は、コンポーネントロジックをデリゲートに実装してください。

また、あなたのビューコントローラクラスファイルの先頭にこのヘッダを追加することを忘れないでください:

#ifdef XCUITEST 
#import <objc/runtime.h> 
#endif 
関連する問題