EarlGreyでよく使っているメソッド

#EarlGreyよく使うメソッド

## grey_allOf(`[matcher]`) ```Matcher```
複数の条件で要素を探したい時に用います

例

```swift:
let matcher = grey_allOf([grey_kindOfClass(UIButton.self), 
                          grey_sufficientlyVisible(), 
                          grey_accessibilityID("hogeButton")])

EarlGrey.select(elementWithMatcher: matcher)
.perform(grey_tap())
```
注意:`allOf`メソッドは、配列の中にある`Matcher`を順番に評価していきます。
評価する順番に気をつけないと処理が遅くなり、Timeoutエラーが起こるので気をつけましょう。
例えばこんな、テストがあるとします。

```swift
EarlGrey.selectElement(with: grey_allOf([grey_sufficientlyVisible()
                                         grey_kindOfClass(HogeCell.self),
                                         grey_selected()]))
         .inRoot(grey_kindOfClass(UITableView.self))
         .usingSearch(grey_scrollInDirection(.down, 100),
                      onElementWith: grey_kindOfClass(UITableView.self))
         .atIndex(0)
         .assert(grey_notNil())
```

この場合は、最初に`grey_sufficientlyVisible()`が評価され、画面上に写っているもの全てが対象になり、`HogeCell`を探し、選択されているものを対象にしています。
画面上に写っているものを対象に入れると、無駄な処理が走るので、順番を変えましょう。

```swift
EarlGrey.selectElement(with: grey_allOf([grey_kindOfClass(HogeCell.self)
                                         grey_sufficientlyVisible(),
                                         grey_selected()]))
         .inRoot(grey_kindOfClass(UITableView.self))
         .usingSearch(grey_scrollInDirection(.down, 100),
                      onElementWith: grey_kindOfClass(UITableView.self))
         .atIndex(0)
         .assert(grey_notNil())
```

これだと、`HogeCell`で画面に写っているもので、選択されているものを対象にするので、動作が軽くなります

## .inRoot(`matcher`) ```Method```
特定したい要素のwrapperを指定します。

```swift:
EarlGrey.select(elementWithMatcher: grey_accessibilityID("hogeButton"))
.inRoot(grey_kindOfClass(UICollectionViewCell.self))
.perform(grey_tap())
```

## .atIndex(`UInt`) ```Method```
複数要素がある場合、このメソッドを用いてN番目の要素を選択することができます。

```swift:
EarlGrey.select(elementWithMatcher: grey_kindOfClass(UITableViewCell.self))
.inRoot(grey_kindOfClass(UITableView.self))
.assert(grey_notNil())
```

注意
UITableViewCellとUICollectionViewCellを取ろうとする時取得する順番が違うので注意してください。
UITableViewCell -> 一番最初に表示されているセル
UICollectionViewCell -> 一番最後に表示されているもの

## grey_sufficientlyVisible() ```Matcher```
要素が表示されている要素を探すときに使います。

```swift
let matcher = grey_allOf(grey_sufficientlyVisible(), 
                         grey_kindOfClass(UITableViewCell.self))

EarlGrey.select(elementWithMatcher: matcher)
.inRoot(grey_kindOfClass(UITableView.self))
.assert(grey_notNil())
```

注意
この```Matcher```は要素全体が表示されているかどうかを判定していますので、画面半分に写っているものはカウントしないのでご注意ください。

##grey_not(`Matcher`) `Matcher`
引数に`Matcher`を入れると、逆の結果のものを探します。　
画面上にあるUIButtonで、`isSelected`が`false`のものを探す時に便利だったりします。

```swift

let matcher = grey_allOf([grey_kindOfClass(UIButton.self), 
                          grey_not(grey_selected())])

EarlGrey.select(elementWithMatcher: matcher)
.inRoot(grey_kindOfClass(UIView.self))
.perform(grey_tap())

```

## GREYCondition
特定の値が変わるまで待ちたい時に使っています。

```swift

let ID: Uint? = nil

getRequest { (resultID) in
  ID = resultID
}

let success = GREYCondition(name: "wait to change id") { () -> Bool in

 return  ID != 0

}.wait(second: 5)


GREYAssertTrue(success, reason: "failed api")
```

※注意
GREYConditionはTimeoutするまで、クロージャの中身を繰り返し処理するのでクロージャの中身にAPIを呼び出すような処理はしない方が良さそうです。