appium での要素操作方法TIPS(Java)


要素の検索

画面外の要素

取れないらしい。そもそも取れないので「この要素までスクロール」もできない。私がやったときは適当にスワイプしたけど正しい(安定した)方法は不明。

ダイアログ

ちょっと前までふつーに findElement 系の関数で取得できたけど今はこれみたい

    appiumDriver.switchTo().alert().accept(); 
    // appiumDriver は AppiumDriver のインスタンス 

リトライ

Webview なんかで画面を表示していたりネットワークからの情報をもとに画面を表示させたりする場合、タイムアウトまでにロードが完了しない場合がある。普通にウエイトを入れてもいいけど何回かリトライさせるようにすると多少は時間の短縮が図れる。
けどふつーはなんでそんなに重いのか考えたほうが良い。


/*
 * sleepの例外を握りつぶしただけの関数
 */
  static public void sleep(int millis) {
    try {
      Thread.sleep(millis);
    } catch (Exception e) {
    // ただのウエイトなので例外はスタックトレースだけ出して適当に握りつぶす
      e.printStackTrace();
    }
  }

  /**
   * try find element /retry/ times.
   * @param by
   * @param retry
   * @return
   */
  public WebElement findElementByXPathSometime(final String by, final int retry){
    int count;
    RuntimeException ex=null;
    WebElement elem;
    for(count = 1;count<=retry;count++) {
      try {
        logger.debug("try to get element : " + by.toString());
        // log4jのロガー
        elem = appiumDriver.findElementByXPath(by);
        // appiumDriver は AppiumDriver のインスタンス
        return elem;
      }catch(RuntimeException e) {
        ex = e;
        logger.debug("failed to get element");
        sleep(5000);
      }
    }

要素のクリック

なんか WebElement#click() が反応してくれない要素がある。多分 Webview 内の要素には反応してくれないっぽいので以下のようにする。

    WebElement element = findElementByXPathSometime(AppElements.SETTING,20);
    new TouchAction(appiumDriver).tap(element).perform();
    // appiumDriver は AppiumDriver のインスタンス

テキストボックス

これはもう無理だった。何故か AppiumDriver#findElementByほげほげ() で要素がみつけられない。

    (new TouchAction(appiumDriver)).tap(123, 456).perform();
    // テキストボックスを強引にタップ
    sleep(1000);
    appiumDriver.getKeyboard().pressKey("nyuuryokusitaimoziretu");

なお、iOSシミュレータでハードキーボードが有効になっているとソフトキーボードがでてこないので AppiumDriver#getKeyboard() が失敗する。不便。