[Setup] Appium 2.x + Robotframework + Windows 

# Outline

これまで何度もappium , robotframeworkのsetupのドキュメントを書いてきた。
ただ、mac中心であった。今回、windows 環境で android (iOSをテストしたい場合、Macにすべし）のテストを簡単に行いたかったので、そのセットアップを残す

# install

## Java

Javaをinstallする

https://www.oracle.com/jp/java/technologies/downloads/#jdk21-windows


install後、pathを設定する

| 環境変数 | 設定値 | 
|:-----------|:------------|
| JAVA_HOME       | C:\Program Files\Java\jdk-21        |
| Path | %JAVA_HOME%\bin |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/42f6089e-7220-c4ae-b627-284569c73fff.png)

pathの確認をする

```
java --version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/39883fa3-a79d-3c07-6012-516ea96a7051.png)



## Android Studio

Androidのtestに必要なコマンドを、Android Stduioで構築する。

https://developer.android.com/studio?hl=ja

また、以下appiumに必要なコマンドをSDK Managerでinstallする

- Android SDK Command-line Tools
- Android SDK Tools (Obsolete)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/3d1d67a9-aeb3-96ba-be8d-bdda062c88d0.png)


install後、pathを設定する

| 環境変数 | 設定値 | 
|:-----------|:------------|
| ANDROID_HOME       | %HOMEPATH%\AppData\Local\Android\Sdk        |
| Path | %ANDROID_HOME%\platform-tools |
| Path | %ANDROID_HOME%\cmdline-tools\latest\bin |


尚、環境によって異なる場合があるので、その場合はANDROID_HOMEはSettings -> Android SDK Location で確認することができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/ef2ab238-ea2e-a561-595e-5dc589ac81e7.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/d51a7646-0a80-357c-091d-890768b95608.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/807b363d-83b0-4a1c-4714-524e055bed47.png)

Pathが通っているかの確認

```
adb --version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/a1ae7b1e-cc98-6150-3e85-a48d4dce3ff2.png)






## NodeJS

appiumのinstallで、npmを使う。
そのため、nodejsをinstallする。windows版のinstallerを使うので簡単にセットアップできる。


https://nodejs.org/en/

install完了後、npmの動作確認をする

```
npm -v
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/ccb0ea04-c0d8-e3e5-2202-b9d453b8b107.png)


最後に初期化する

```
npm init
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/c64449e5-7dd4-d8a3-11c3-850c15d63d0d.png)



## Python

Pythonのinstall

https://www.python.org/

install完了後、npmの動作確認をする

```
python --version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/5d0e1bed-8ca6-0b80-b387-01e4e1c63362.png)


## appium

```
npm i --location=global appium
```

```
npm install appium-doctor -g
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/3e472c5a-a25e-131b-d6af-11587aaa7570.png)


これまでの構築がすべてうまくいっているかを検証する

```
appium-doctor
```

とりあえず、<B> ### Diagnostic for necessary dependencies completed, no fix needed. ### </B> になにも記載がなければも最低限動く。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/2586ed34-981c-bd73-e97e-c2cd4e2325c1.png)


## Appium Driver

chrome等のdriverをinstallする

```
npm install appium-chromedriver
```


```
appium driver install uiautomator2
```

```
appium driver install chromium
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/47168e60-b2c0-5cff-1f34-7fa6ec109c20.png)



### memo

install時に、下記エラーが発生するときがある。
これは証明書周りの問題で、セキュリティ上installを中断させている。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/0af18b28-1094-3d39-fd92-77dd1179044c.png)


これを強制的にskipしてinstallさせるには、以下環境変数を設定してinstallを再実行すると成功する（とおもう）

```
npm config set strict-ssl false
```
 
```
set NODE_TLS_REJECT_UNAUTHORIZED=0
```


reference

https://weekendprojects.dev/posts/fix-for-npm-error-code-self-signed-cert-in-chain/


## robotframework

pipを使ってインストールする

```
pip3 install robotframework
```

また、必要に応じてlibraryをinstallする

```
pip3 install robotframework-appiumlibrary
```

```
pip3 install robotframework-seleniumlibrary
```


※ 2024/03/27追記

https://pypi.org/project/Appium-Python-Client/4.0.0/

Appium-Python-Client==4.0.0 を使用すると、AppiumLibraryが正しく動かない

```
[ ERROR ] Error in file 'C:\Users\sadaaki.emura\Documents\script\robot\sp_hotel_login.robot' on line 2: Importing library 'AppiumLibrary' failed: ModuleNotFoundError: No module named 'appium.webdriver.common.touch_action'
Traceback (most recent call last):
  File "C:\Program Files\Python312\Lib\site-packages\AppiumLibrary\__init__.py", line 4, in <module>
    from AppiumLibrary.keywords import *
  File "C:\Program Files\Python312\Lib\site-packages\AppiumLibrary\keywords\__init__.py", line 9, in <module>
    from ._touch import _TouchKeywords
  File "C:\Program Files\Python312\Lib\site-packages\AppiumLibrary\keywords\_touch.py", line 3, in <module>
    from appium.webdriver.common.touch_action import TouchAction
```

理由がわからないので、Appium-Python-Clientのversionを下げて利用することをお勧めする


# DEMO

では、実際にandroid chromeを起動してみたら、失敗した！

```
appium 
```

```
[ WARN ] Keyword 'Capture Page Screenshot' could not be run on failure: No application is open
Test Case Open Chrome In Real Device                                  | FAIL |
WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: No Chromedriver found that can automate Chrome '74.0.3729'. You could also try to enable automated chromedrivers download as a possible workaround.
Stacktrace:
UnknownError: An unknown server-side error occurred while processing the command. Original error: No Chromedriver found that can automate Chrome '74.0.3729'. You could also try to enable automated chromedrivers download as a possible workaround.
    at getResponseForW3CError (C:\Users\sadaaki.emura\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\lib\protocol\errors.js:1118:9)
    at asyncHandler (C:\Users\sadaaki.emura\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\lib\protocol\protocol.js:491:57)
```

原因を調べてみると、今回実機で使っているchromeのversionに合ったchromedriver をdownloadできてないようだ

https://github.com/appium/appium/issues/18368


そこで、起動時のoptionを変えてみた。
すると、対象のchromedriverをdownloadして、chromeを起動することができる

```
appium server --allow-insecure chromedriver_autodownload
```


## sample script

シナリオは以下の通り

1. https://keiba.rakuten.co.jp/ にアクセスする
2. マイページログイン をクリックする
3. RakutenIDを入力し、”次へ”をクリックする
4. Passwordを入力し、”ログイン”をクリックする
5. MyPageの表示をverifyする

```
*** Settings ***

Library            AppiumLibrary

*** Variables ***
${APPIUM_SERVER}   http://localhost:4723
${BROWSER}            Chrome
${PLATFORM_NAME}      Android
${UDID}               XXXXXXXXXX # Android DeviceのUDID
${DEVICE_NAME}        XPERIA
${PLATFORM_VERSION}   9
${AUTOMATION_NAME}    UiAutomator2
${TIMEOUT}            30

*** Test Cases ***
Test Case Open Chrome In Real Device
  Open Android Browser       https://keiba.rakuten.co.jp/

Login
    Login RakutenID  RakutenID  Password

Close Mobile Browser
    Close_APP

*** Keywords ***
Open Android Browser
  [Documentation]     To open android browser and go to provided URL
  [Arguments]         ${url}
  Open Application    ${APPIUM_SERVER}  
    ...    platformName=${PLATFORM_NAME}
    ...    automationName=UiAutomator2
    ...    udid=${UDID}
    ...    deviceName=${DEVICE_NAME}
    ...    platformVersion=${PLATFORM_VERSION}
    ...    browserName=${BROWSER}
    ...    autoAcceptAlerts=false
    ...    autoGrantPermissions=true
    ...    autoWebView=true
    ...    shouldTerminateApp=true
  Go To URL  ${url}

Close_APP
    Close Application

Login RakutenID
    [Arguments]  ${uid}  ${pwd}
    ##Wait Until Element is Visible  xpath=//*[@id="commonBalanceBar"]/ul/li/a[text()='マイページログイン']  timeout=${TIMEOUT}
    Click Element  xpath=//*[@id="commonBalanceBar"]/ul/li/a[text()='マイページログイン']
    Wait Until Element is Visible  xpath=//*[@id="user_id"]  timeout=${TIMEOUT}
    Input Text  xpath=//*[@id="user_id"]  ${uid}
    Click Element  xpath=//*[@id="cta001"]/div/div[text()='次へ']
    Wait Until Element is Visible  xpath=//*[@id="password_current"]  timeout=${TIMEOUT}
    Input Text  xpath=//*[@id="password_current"]  ${pwd}
    Click Element  xpath=//*/div/div[text()='ログイン']
    Wait Until Element is Visible  xpath=//*[@id="commonBalanceBar"]/div[1]/div/div[1]/div[1]/a  timeout=${TIMEOUT}

```

Pointとして、chromeをopenするとき<B>Open Application</B>を使用する。capabilitiesとして、以下設定することで、android実機でchromeを操作することができる

platformName=Android
automationName=UiAutomator2
browserName=chrome