これは私がUIAlertController
を作成して画面に表示する方法です。
private class func showAlertWithTitle(title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
//alert.accessibilityLabel = "my string here" //doesnt work
let action = UIAlertAction(title: "OK", style: .Default) { action in
alert.dismissViewControllerAnimated(true, completion: nil)
}
alert.addAction(action)
UIStoryboard.topViewController()?.presentViewController(alert, animated: true, completion: nil)
}
これがITestsでアクセスする方法です。
emailAlert = app.alerts["First Name"] //for title "First Name"
しかし、私はそこにカスタム識別子を設定して、次のようにfirstName
でこれにアクセスしたいと思います。
emailAlert = app.alerts["firstName"]
出来ますか?
これは古いスレッドですが、誰かがこれを使用する可能性があります。
私はこのようにアクセシビリティ識別子を設定することができました:
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
alert.view.accessibilityIdentifier = "custom_alert"
alert.view.accessibilityValue = "\(title)-\(message)"
alert.addAction(
UIAlertAction(
title: "ALERT_BUTTON_OK".localized,
style: .default,
handler: handler
)
)
present(alert, animated: true)
そうすれば、アクセシビリティーIDでアラートにアクセスし、その内容をアクセシビリティー値で確認できます。
もちろん完璧ではありませんが、少なくともAppiumを使用したテストでは機能します。
これを行うために私が考え出した唯一の方法は、AppleのプライベートAPIを使用することでした。 valueForKey
オブジェクトでUIAlertAction
を呼び出し、この超秘密鍵:_"__representer"
_を使用して、__UIAlertControllerActionView
_と呼ばれるものを取得します。
_ let alertView = UIAlertController(title: "This is Alert!", message: "This is a message!", preferredStyle: .Alert)
let okAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
alertView.addAction(okAction)
self.presentViewController(alertView, animated: true, completion: {
let alertButton = action.valueForKey("__representer")
let view = alertButton as? UIView
view?.accessibilityIdentifier = "okAction_AID"
})
_
その__UIAlertControllerActionView
_はビューが表示されるまで存在しないため、これは完了ハンドラーで行う必要があります。私のプロジェクトの補足として、以下の拡張機能を使用して物事をより簡単に/読みやすくしました:
_extension UIAlertController {
func applyAccessibilityIdentifiers()
{
for action in actions
{
let label = action.valueForKey("__representer")
let view = label as? UIView
view?.accessibilityIdentifier = action.getAcAccessibilityIdentifier()
}
}
}
extension UIAlertAction
{
private struct AssociatedKeys {
static var AccessabilityIdentifier = "nsh_AccesabilityIdentifier"
}
func setAccessibilityIdentifier(accessabilityIdentifier: String)
{
objc_setAssociatedObject(self, &AssociatedKeys.AccessabilityIdentifier, accessabilityIdentifier, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
func getAcAccessibilityIdentifier() -> String?
{
return objc_getAssociatedObject(self, &AssociatedKeys.AccessabilityIdentifier) as? String
}
}
_
したがって、上記のコードは書き換えられます。
_ let alertView = UIAlertController(title: NSLocalizedString("NMN_LOGINPAGECONTROLLER_ERROR_TITLE", comment: ""), message: message as String, preferredStyle:.Alert)
let okAction = UIAlertAction(title: NSLocalizedString("NMN_OK", comment: ""), style: .Default, handler: nil)
okAction.setAccessibilityIdentifier(InvalidLoginAlertView_AID)
alertView.addAction(okAction)
self.presentViewController(alertView, animated: true, completion: {
alertView.applyAccessibilityIdentifiers()
})
_
私の最初の試みはビュー階層をナビゲートしようとすることを含みましたが、UIAlertControllerActionView
がパブリックAPIの一部ではなかったため、それは困難になりました。とにかく、私はおそらくアプリストアに提出されたビルドのためにvalueForKey("__representer")
をifdefしようとするでしょう、またはAppleはあなたに平手打ちを与えるかもしれません。
現在、UIAlertAction
という名前のaddCamera
があり、次のようにしています。
_addCamera.accessibilityLabel = "camera-autocomplete-action-photo"
_
これにより、UIテストで次のようにタップできます。
app.sheets.buttons["camera-autocomplete-action-photo"].firstMatch.tap()
Apple docs ...から.
アラートビューにアクセスできるようにする
アラートビューにはデフォルトでアクセスできます。アラートビューのアクセシビリティは、アラートタイトル、アラートメッセージ、およびボタンタイトルに関連しています。 VoiceOverがアクティブになっている場合、アラートが表示されたときに「アラート」という単語が読み上げられ、設定されている場合は、タイトルに続いてメッセージが読み上げられます。ユーザーがボタンをタップすると、VoiceOverはそのタイトルとWordの「ボタン」を読み上げます。ユーザーがテキストフィールドをタップすると、VoiceOverはその値と「テキストフィールド」または「安全なテキストフィールド」を読み上げます。