[iOS] Appiumを使っての要素取得と操作についてまとめ（Ruby編）


Appiumをやっと起動してアプリを操作するまで実行することが出来ました。
ただ、起動出来ても要素の取得やタップなどの操作をさせないことにはなんのテストにもならないので、そのあたりのことをまとめていこうと思います。

ちなみに[起動までの道のり](http://qiita.com/edo_m18/items/fa79da3f30676336f8d5)は前の記事で書いています。

## サンプル

今回のサンプルを[Github](https://github.com/edom18/Appium-test)にあげているのでよかったら見てみてください。

## 要素の取得と操作

### 要素を検索する

要素を検索するには`find_element`、`find_elements`メソッドを使います。
どちらのメソッドも2つ引数を取り、第一引数はどんなタイプから検索するのか、第二引数は指定したタイプから具体的になにを検索するのかを指定します。

```sample.rb
element = @driver.find_element :id, "anyID" # labelでも大丈夫

element = @driver.find_element :name, "anyLabel" # idでも大丈夫

elements = @driver.find_elements :class_name, "UIAButton"
```

####メモ
`:id`と`:name`は`accesibilityIdentifier`、`accessibilityLabel`を検索するためのものです。

ちなみに現在のAppiumでは`UIView`はXPathでは取れないので、UIViewに対してなにか処理をしたい場合は`accesibilityLabel`を付けて`:id`か`:name`で直接アクセスしないとダメなようです。

#### XPathを使う

要素の取得には`XPath`を使うことも出来ます。
個人的にはこれが一番強力なのではないかなと。
ただ、上でも書いた通り`UIView`に関してはXPathでは取れないので注意が必要です。

**[追記]**
どうやらaccesibilityIdentifierなどを追加すると、UIViewも`//UIAElement`の取得対象となるようです。

##### サンプル

```xpath-sample.rb
# とあるボタンを取得する
button = @driver.find_element :xpath, "//UIAWindow//UIAButton"
```

以下のようにそれぞれのクラス（UIButtonなど）に対応する形で`UIAutomation`のクラスが割り当てられています。
`:class_name`と`:xpath`ではこの`UIAutomation`のクラス名を指定して要素を取得します。
そのため、`UIAButton`など`A`が増えているわけです。（最初なんで`A`が入ってるんだろうって思ってました）

ちなみに`UIView`に対応するのは`UIAElement`になります。
ただ、やはりXPathで`//UIAElement`と指定してもUIView自体は取れないみたいです。（UIAElementはUIView同様、Viewに関するベースクラスなのでUIAButtonなども取得できる）


### UIKitとUI Automationとの対応表

| UIKit | UI Automation |
|-------|---------------|
| UIApplication | UIAApplication |
| UIWindow | UIAWindow |
| UIActionSheet | UIAActionSheet |
| UIActivityIndicator | UIAActivityIndicator |
| UIAlertView | UIAAlert |
| UIApplication | UIAApplication |
| UIButton | UIAButton |
| UIView | UIAElement |
| UITextInputTraits | UIAKeyboard |
| UINavigationBar | UIANavigationBar |
| UIPageControl | UIAPageIndicator |
| UIPickerView | UIAPickerWheel |
| UIPopoverController | UIAPopover |
| UIProgressView | UIAProgressIndicator |
| UIScrollView | UIAScrollView |
| UISearchBar | UIASearchBar |
| UITextField | UIASecureTextField |
| UISegmentedControl | UIASegmentedControl |
| UISlider | UIASlider |
| UILabel | UIAStaticText |
| UISwitch | UIASwitch |
| UITabBar | UIATabBar |
| UITableViewCell | UIATableCell |
| UITableView | UIATableView |
| UITextField | UIATextField |
| UIToolbar | UIAToolbar |
| UIWebView | UIAWebView |
| UIWindow | UIAWindow |


## Appium Inspectorを使う

実はAppiumには **Appium Inspector** という非常に強力なツールがあります。
このツールは、Appium.appをインストールすると利用できます。
Appium.appは、nodeで使っているAppiumのGUIアプリ版です。

### Appium.app

![スクリーンショット 2014-04-27 19.58.20.png](https://qiita-image-store.s3.amazonaws.com/0/5616/b6abdcc2-82f5-2bb4-0129-c8447d2fbf57.png "スクリーンショット 2014-04-27 19.58.20.png")

### Appium Inspectorの起動

Appium Inspectorは、上記のアプリから起動します。
まず`App Path`となっているところに、コマンドラインからビルドしたアプリを指定します。
（キャプチャでは「Appium-test.app」となっているところ）

次に、右上の **Launch** ボタンを押してappiumサーバを起動します。
起動すると下半分の黒いところにコンソールと同様にメッセージが表示されます。
無事起動したら、(i)ボタンを押します。

すると、以下のウィンドウが起動します。
![スクリーンショット 2014-04-27 20.03.07.png](https://qiita-image-store.s3.amazonaws.com/0/5616/e685c688-348d-6030-c949-cf177f77bb5e.png "スクリーンショット 2014-04-27 20.03.07.png")

見てもらうと分かりますが、プレビュー画面と現在の階層構造を表示してくれます。
さらに、赤い **Record** ボタンを押してから操作するとその処理を記録し、その手順を下のドロワービューに書き出してくれます。

※操作はInspector上で行います。プレビュー画面上をクリックするとクリックした箇所がハイライトされ（サンプルでは赤いボーダーが表示されているところ）、画面下の方にある`Touch`や`Text`などのタブから実行したい処理を選択することで記録される仕組みです。

#### メモ
このInspectorの強力なところは、ビルドしたアプリを指定するだけ、という点です。
ビルド前になにがしかのライブラリを追加する必要はありませんし、事前準備もいりません。
ただビルドするだけです。

UIViewが取得できない点を除いては、現在の構造などを把握することもできるのでそれだけでも有用でしょう。
*（ちなみに、右下にある「Detail」の箇所にはXPathでどう指定したらいいかというのも表示されるので、うまく取得できないときは参考にしてみるといいでしょう）*


## 参考リンク

* [Module: Appium::Ios](http://rdoc.info/github/appium/ruby_lib/Appium/Ios)
* [Class: Selenium::WebDriver::Element](http://selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver/Element.html#to_json-instance_method)
* [Finding Elements](http://appium.wikia.com/wiki/Finding_Elements)
* [UI Automation JavaScript Reference](https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/_index.html#//apple_ref/doc/uid/TP40009771)