- ここにあるものとその方法を理解する第1章
- 作業に必要なすべてのインストールと構成に関する第2章
- 第3章では、Appium GUIについて説明します。
- モバイルアプリケーションの要素をローカライズする方法に関する第4章
- 第5章、最終的にアプリケーションを自動化しますが、これまではエミュレーターのみでした
この章では:
- Androidデバイスでのダイヤルの自動化
- Androidで登録フォームを自動化する
- Chromeを使用して、Gmailにログインします
- iOS ボディマスインデックス(BMI)の自動化
- iOSデバイスでハイブリッドアプリを自動化する
- iOS Webアプリケーションの自動化
始める前に
開始する前に、すべてが設定されていることをもう一度確認してください。
Android要件 | IOS要件 |
Java(バージョン7以降) | Mac OS(バージョン10.7以降) |
Android SDK API、バージョン17以降 | Xcode(バージョン4.6.3以降、5.1を推奨) |
Androidデバイス | IOSプロファイル[これらおよびその他のあいまいな単語については、以下で説明します] |
デバイス上のChromeブラウザー | IOSデバイス |
Eclipse [またはIdea] | SafariLauncherアプリ |
Testng | ios-webkit-debug-proxy |
Appiumサーバー | Java(バージョン7以降) |
Appiumクライアントライブラリ(Javaはまだあります) | Eclipse [またはIdea] |
Selenium ServerおよびWebDriver Javaライブラリ | Testng |
APK情報アプリ | Selenium ServerおよびWebDriver Javaライブラリ |
Appiumサーバー | |
Appiumクライアントライブラリ(Javaはまだあります) |
Androidデバイスが開発者モードであり、USBデバッグが有効になっていることを確認してください。
デバイスが接続されていることを確認するには、コマンドラインに入力します
adb devices
Androidデバイスのリストが表示されます。 そうでない場合は、adbサーバーを再起動してください。
adb kill-server adb start-server
ネイティブおよびハイブリッドアプリケーション用のAndroidに必要な機能
第1章では、オプションとは何か、なぜオプションなのかについて説明しました。 それでは、コードに直行しましょう。
まず、パッケージをインポートします。
import java.io.File; import org.openqa.selenium.remote.DesiredCapabilities; import io.appium.java_client.remote.MobileCapabilityType;
今DC:
DesiredCapabilities caps = new DesiredCapabilities(); File app=new File("path of the apk");// apk caps.setCapability(MobileCapabilityType.APP,app);// , caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");// Android caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");// OS caps.setCapability(MobileCapabilityType.DEVICE_NAME, "Moto X");// caps.setCapability(MobileCapabilityType.APP_PACKAGE, " ( , apk info app)"); caps.setCapability(MobileCapabilityType.APP_ACTIVITY, ", ( apk info app)");
Webアプリケーション用のAndroidに必要な機能
Webアプリケーションを使用する場合、ブラウザを使用するため、上記のオプションの一部(APP、APPパッケージ、およびAPP ACTIVITY)は必要ありません。
まず、パッケージをインポートします。
import java.io.File; import org.openqa.selenium.remote.DesiredCapabilities; import io.appium.java_client.remote.MobileCapabilityType;
今DC:
DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");// Android caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");// OS caps.setCapability(MobileCapabilityType.DEVICE_NAME, "Moto X");// caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome"); // Chrome
構成は完了しました。これで、ドライバーを初期化できます。
インポート:
import io.appium.java_client.android.AndroidDriver; import java.net.URL;
初期化:
AndroidDriver driver = new AndroidDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps);// , Appium-
すべてがAndroidデバイスで動作する準備ができました。
暫定プロファイル、SafariLauncher、ios-webkit-debug-proxyを理解する
iOS用のドライバーを構成する前に、いくつかの手順に従う必要があります。
暫定プロファイル
iOSデバイスにアプリケーションをインストールするには、プロファイルが必要です。 これを行うには、 iOS Developer Programに参加してください
登録後、 このページにアクセスしてプロファイルを生成してください。
このプロファイルをデバイスにインストールする必要があります。
- 生成されたプロファイルをダウンロードする
- iOSデバイスをMacに接続します
- Xcode(バージョン6)を開き、ウィンドウ->デバイスに移動します
- 接続されたデバイスのコンテキストメニューを呼び出し、[暫定プロファイルを表示...]をクリックします。
- [+]をクリックして、ダウンロードしたプロファイルを選択し、[完了]をクリックします
SafariLauncherアプリとios-webkit-debug-proxy
SafariLauncherは、デバイスでSafariブラウザーを起動するために使用されます。 Safariブラウザを使用するには、SafariLauncherをビルドしてiOSデバイスに展開する必要があります。
- ソースをダウンロード
- Xcodeを起動し、SafariLauncherプロジェクトを開きます
- 展開するデバイスを選択し、ビルドをクリックします
- 次に、Appium.dmgのSafariLauncherを置き換える必要があります。 これには以下が必要です。
- Appium.dmgのコンテキストメニューを呼び出す
- [パッケージの内容を表示]をクリックして、目次/リソース/ node_modules / appium / build / SafariLauncherに移動します
- SafariLauncher.zipを解凍します
- サブモジュール/ SafariLauncher / build / Release-iphoneosに移動し、SafariLauncherアプリケーションを自分のものに置き換えます。
- サブモジュールを圧縮し、SafariLauncher.zipに名前を変更します
次に、Macにios-webkit-debug-proxyをインストールして、接続を確立し、Webビューにアクセスする必要があります。 プロキシを配置するには、brewを使用してコマンドを実行します
brew install ios-webkit-debug-proxy
ネイティブおよびハイブリッドアプリケーション用のiOSに必要な機能
第1章では、オプションとは何か、なぜオプションなのかについて説明しました。 それでは、コードに直行しましょう。
まず、パッケージをインポートします。
import java.io.File; import org.openqa.selenium.remote.DesiredCapabilities; import io.appium.java_client.remote.MobileCapabilityType;
今DC:
DesiredCapabilities caps = new DesiredCapabilities(); File app=new File("path of the .app"); caps.setCapability(MobileCapabilityType.APP,app); caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1"); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");// caps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPad");// caps.setCapability("udid","Id ");//UDID
Webアプリケーション用のiOSに必要な機能
必要のないオプションもあります。 これらのオプションには、APP、APPパッケージ、およびAPPアクティビティが含まれます。 ここまでがポイントです。
まず、パッケージをインポートします。
import java.io.File; import org.openqa.selenium.remote.DesiredCapabilities; import io.appium.java_client.remote.MobileCapabilityType;
今DC:
DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1"); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS"); caps.setCapability(MobileCapabilityType.DEVICE_NAME,"iPad"); caps.setCapability("udid","UDID "); caps.setCapability(MobileCapabilityType.BROWSER_NAME,"Safari"); // Safari
構成は完了しました。これで、ドライバーを初期化できます。 インポート:
import io.appium.java_client.ios.IOSDriver; import java.net.URL;
初期化:
IOSDriver driver = new IOSDriver (new URL("http://127.0.0.1:4723/wd/hub"),caps); //, Appium-
すべてがiOSデバイスで動作する準備ができています。
これで、TestNGを追加して、すべてを一緒に実行できます。
import io.appium.java_client.ios.IOSDriver; import io.appium.java_client.remote.MobileCapabilityType; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.TimeUnit; import org.openqa.selenium.remote.DesiredCapabilities; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class TestAppIication { IOSDriver driver; @BeforeClass // public void setUp() throws MalformedURLException{ DesiredCapabilities caps = new DesiredCapabilities(); File app=new File("path of the .app"); caps.setCapability(MobileCapabilityType.APP,app); caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1"); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS"); caps.setCapability(MobileCapabilityType.DEVICE_NAME,"iPad"); caps.setCapability("udid","UDID "); caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");// , - driver = new IOSDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps); driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS); } @Test public void testExample(){ // } @AfterClass public void tearDown(){ driver.closeApp(); //driver.quit(); // , - } }
ネイティブアプリケーションの自動化
ネイティブAndroidアプリ
Androidオートメーションの場合、前の章(エミュレーターでテスト済み)と同じコードが機能します。avdに関する情報を削除する必要があるのはユーザーだけです。
Androidでのダイヤルの例を見てみましょう。
- 次の必要な機能をインストールして、ダイヤラーアプリケーションを実行します。
caps.setCapability(MobileCapabilityType.APP_PACKAGE, "com.android.dialer"); caps.setCapability(MobileCapabilityType.APP_ACTIVITY, "com.android.dialer.DialtactsActivity");
- 次に、ダイヤルパッドを見つける必要があります。 AccessibityIdで検索します
WebElement dialPad= driver.findElementByAccessibilityId("dial pad"));
- クリックして
dialPad.click();
- 数字キーを見つける必要があります。 簡単なロジックを使用して、キー0〜9を名前で検索し、それぞれをクリックします
for(int n=0;n<10;n++){ driver.findElement(By.name(""+n+"")).click(); }
- この場合、間違った電話番号を使用しているため、電話はどこにも鳴りません。
- 呼び出しボタンを見つけましょう。 AccessibilityIdで検索します。
WebElement dial= driver.findElementByAccessibilityId("dial"));
- クリック:
dial.click();
- TestNGを使用するスクリプト全体は次のようになります。
public class TestAppIication { AndroidDriver driver; @BeforeClass public void setUp() throws MalformedURLException{ DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4"); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android"); caps.setCapability(MobileCapabilityType.DEVICE_NAME,"Moto X");//I am using Moto X as Real Device caps.setCapability(MobileCapabilityType.APP_PACKAGE, "com.android.dialer"); caps.setCapability(MobileCapabilityType.APP_ACTIVITY, "com.android.dialer.DailtactsActivity"); driver = new AndroidDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps); driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS); } @Test public void testExample(){ WebElement dialPad=driver.findElementByAccessibilityId("dial pad"); dialPad.click(); for(int n=0;n<10;n++){ driver.findElement(By.name(""+n+"")).click(); } WebElement dial=driver.findElementByAccessibilityId("dial"); dial.click(); } @AfterClass public void tearDown(){ driver.closeApp(); } }
ネイティブiOSアプリ
ここでは、BMI計算機を使用します
体重と身長によって肥満度指数を計算します。 これを行うには、次を実行します。
- 次の必要な機能をインストールして、アプリケーションを実行します
File app=new File("/Users/mhans/appium/ios/BmiCalc.app");//You can change it with your app address caps.setCapability(MobileCapabilityType.APP,app);//To set the app path
- 次に、身長と体重の入力フィールドを見つける必要があります。 Xpathで検索します
WebElement height=driver.findElement(By.xpath("(//UIATextField)[2]")); WebElement weight=driver.findElement(By.xpath("(//UIATextField)[4]"));
- 計算ボタンを探しています。 名前を使用します:
WebElement calculateBMI=driver.findElement(By.name("Calculate BMI"));
- 成長を示す
height.sendKeys("1.82");
- 重量を示す
weight.sendKeys("75");
- インデックスを数える
calculateBMI.click();
- TestNGを使用するスクリプト全体は次のようになります。
public class TestAppIication { IOSDriver driver; @BeforeClass public void setUp() throws MalformedURLException{ File app=new File("/Users/mhans/appium/ios/BmiCalc.app");//You can change it with your app address DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability(MobileCapabilityType.APP,app); caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1"); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS"); caps.setCapability(MobileCapabilityType.DEVICE_NAME,"iPad"); caps.setCapability("udid","Real Device Id "); driver = new IOSDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps); driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS); } @Test public void testExample(){ WebElement height=driver.findElement(By.xpath("(//UIATextField)[2]")); height.sendKeys("1.82"); WebElement weight=driver.findElement(By.xpath("(//UIATextField)[4]")); weight.sendKeys("75"); WebElement calculateBMI=driver.findElement(By.name("Calculate BMI")); calculateBMI.click(); } @AfterClass public void tearDown(){ driver.closeApp(); } }
Webアプリケーションの自動化
Android Webアプリケーション
たとえば、Gmailのログインページを考えます。 このセクションでは、実際のデバイスでChromeを起動し、目的のアドレスに移動し、ログイン/パスワードを転送して、[サインイン]をクリックする方法を説明します。
- 次の必要な機能をインストールしてChromeを実行します
caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome");
- 次に、アドレスを指定する必要があります
driver.get("https://www.gmail.com");
- ユーザー名要素を見つける必要があります。 名前ロケーターを使用します
WebElement username=driver.findElement(By.name("Email"));
- 値を渡す
username.sendKeys("test");
- 次に、パスワード要素を見つける必要があります。 名前ロケーターを使用します
WebElement password=driver.findElement(By.name("Passwd"));
- 値を渡す
password.sendKeys("test");
- サインインボタンを探しています。 名前ロケーターを使用します
WebElement signIn=driver.findElement(By.name("signIn"));
- クリックして
signIn.click();
- TestNGを使用するスクリプト全体は次のようになります。
public class TestAppIication { AndroidDriver driver; @BeforeClass public void setUp() throws MalformedURLException { DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome"); caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4"); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android"); caps.setCapability(MobileCapabilityType.DEVICE_NAME,"Moto X"); driver = new AndroidDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps); driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS); } @Test public void testExample(){ driver.get("https://www.gmail.com"); WebElement username=driver.findElement(By.name("Email")); username.sendKeys("test"); WebElement password=driver.findElement(By.name("Passwd")); password.sendKeys("test"); WebElement signIn=driver.findElement(By.name("signIn")); signIn.click(); } @AfterClass public void tearDown(){ driver.quit(); } }
IOS Webアプリケーション
たとえば、Google検索ページを考えてみましょう。 このセクションでは、実際のデバイスでブラウザを起動し、目的のアドレスに移動し、検索文字列を渡して、[検索]をクリックする方法を説明します。
- 次の必要な機能をインストールして、Safariを実行します
caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");
- 次に、アドレスを指定する必要があります
driver.get("https://www.google.com");
- searchBox要素を見つける必要があります。 名前ロケーターを使用します
WebElement searchBox=driver.findElement(By.name("q"));
- 値を渡す
searchBox.sendKeys("Appium for mobile automation");
- スクリプトを実行する前に、プロキシコマンドを有効にする必要があります。
ios_webkit_debug_proxy -c 2e5n6f615z66e98c1d07d22ee09658130d345443:27753 –d
2e5n6f615z66e98c1d07d22ee09658130d345443をデバイスのUDIDに置き換えます。 ポートは27753である必要があります
- Web Inspectorが有効(設定| Safari |詳細設定)で、デバイスにSafariLauncherがインストールされていることを確認してください
- TestNGを使用するスクリプト全体は次のようになります。
public class TestAppIication { IOSDriver driver; @BeforeClass public void setUp() throws MalformedURLException{ DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari"); caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1"); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS"); caps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPad"); caps.setCapability("udid","Real Device Identifier"); driver = new IOSDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps); driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS); } @Test public void testExample(){ driver.get("https://www.google.com"); WebElement searchBox=driver.findElement(By.name("q")); searchBox.sendKeys("Appium for mobile automation"); } @AfterClass public void tearDown(){ driver.quit(); } }
ハイブリッドオートメーション
Androidハイブリッドアプリ
例として、 Hybridtestappを使用します
ハイブリッドアプリケーションを使用するには、 ここに示す変更を行う必要があります 。 Hybridtestappアプリケーションでは、既に適用されています。
例では、アプリケーションのフォームに入力しようとします。
- 次の必要な機能をインストールして、ハイブリッドアプリケーションを実行します
File app=new File("C:\\Appium_test\\HybridtestApp.apk");// (On window platform) caps.setCapability(MobileCapabilityType.APP,app); caps.setCapability(MobileCapabilityType.APP_PACKAGE, "com.example.hybridtestapp"); caps.setCapability(MobileCapabilityType.APP_ACTIVITY, "com.example.hybridtestapp.MainActivity");
- 次に、WebViewで動作するようにコンテキストを変更する必要があります
Set<String> contexts = driver.getContextHandles(); for (String context : contexts) { System.out.println(context); // }
- スイッチ
driver.context("WEBVIEW_com.example.hybridtestapp");
または
driver.context((String) contextNames.toArray()[1]);
- WebViewに移動した後、First Name入力フィールドを見つける必要があります。 名前ロケーターで検索します
WebElement firstName=driver.findElement(By.name("fname")); firstName.sendKeys("test");
- そして姓
WebElement lastName=driver.findElement(By.name("lname")); lastName.sendKeys("test");
- したがって、残りのフィールドに入力します
WebElement age=driver.findElement(By.name("age")); age.sendKeys("26"); WebElement username=driver.findElement(By.name("username")); username.sendKeys("appiumTester"); WebElement password=driver.findElement(By.id("psw")); password.sendKeys("appium@123");
- そして、登録ボタンをクリックします
WebElement registerButton=driver.findElement(By.id("register")); registerButton.click();
- TestNGを使用するスクリプト全体は次のようになります。
public class TestAppIication { AndroidDriver driver; @BeforeClass public void setUp() throws MalformedURLException{ File app=new File("C:\\Appium_test\\HybridtestApp.apk"); caps.setCapability(MobileCapabilityType.APP,app); DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4"); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android"); caps.setCapability(MobileCapabilityType.DEVICE_NAME, "Moto X"); caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, "Appium");// Selendroid android 4.4 caps.setCapability(MobileCapabilityType.APP_PACKAGE, "com.example.hybridtestapp"); caps.setCapability(MobileCapabilityType.APP_ACTIVITY, "com.example.hybridtestapp.MainActivity"); driver = new AndroidDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps); driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS); } @Test public void testExample(){ Set<String> contexts = driver.getContextHandles(); for (String context : contexts) { System.out.println(context); } driver.context((String) contexts.toArray()[1]); WebElement firstName=driver.findElement(By.name("fname")); firstName.sendKeys("test"); WebElement lastName=driver.findElement(By.name("lname")); lastName.sendKeys("test"); WebElement age=driver.findElement(By.name("age")); age.sendKeys("26"); WebElement username=driver.findElement(By.name("username")); username.sendKeys("appiumTester"); WebElement password=driver.findElement(By.id("psw")); password.sendKeys("appium@123"); WebElement registerButton=driver.findElement(By.id("register")); registerButton.click(); } @AfterClass public void tearDown(){ driver.closeApp(); } }
ハイブリッドiOSアプリ
WebViewAppアプリケーションの例を検討します
アプリケーションでの作業を試みます。
- 次の必要な機能をインストールして、ハイブリッドアプリケーションを実行します
File app=new File("/Users/mhans/appium/ios/WebViewApp.app"); caps.setCapability(MobileCapabilityType.APP,app);
- 次に、入力フィールドを見つけて、目的のアドレスを指定する必要があります
WebElement editBox=driver.findElement(By.className("UIATextField")); editBox.sendKeys("www.google.com");
- 検索して[Go]ボタンをクリックします
WebElement goButton=driver.findElement(By.name("Go")); goButton.click();
- 次に、WebViewで動作するようにコンテキストを変更する必要があります
Set<String> contexts = driver.getContextHandles(); for (String context : contexts) { System.out.println(context); }
- スイッチ
driver.context("WEBVIEW_com.example.testapp");
または
driver.context((String) contextNames.toArray()[1]);
- それだけです Googleページで作業できます。 画像の石積みを開こうとしています:
WebElement images=driver.findElement(By.linkText("Images")); images.click();
- テスト全体を開始する前に、プロキシを有効にする必要があります
ios_webkit_debug_proxy -c <UDID >:27753 –d
ポートは27753である必要があります
- TestNGを使用するスクリプト全体は次のようになります。
public class TestAppIication { IOSDriver driver; @BeforeClass public void setUp() throws MalformedURLException{ DesiredCapabilities caps = new DesiredCapabilities(); File app=new File("/Users/mhans/appium/ios/WebViewApp.app"); caps.setCapability(MobileCapabilityType.APP,app); caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1"); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS"); caps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPad"); caps.setCapability("udid","Real Device Identifier"); driver = new IOSDriver (new URL("http://127.0.0.1:4723/wd/hub"), caps); driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS); } @Test public void testExample(){ WebElement editBox=driver.findElement(By.className("UIATextField")); editBox.sendKeys("https://www.google.com"); WebElement goButton=driver.findElement(By.name("Go")); goButton.click(); Set<String> contexts = driver.getContextHandles(); for (String context : contexts) { System.out.println(context); } driver.context((String) contexts.toArray()[1]); WebElement images=driver.findElement(By.linkText("Images")); images.click(); } @AfterClass public void tearDown(){ driver.closeApp(); } }
以上です。 最後の章が残っています。ここでは、モバイルプラットフォーム向けの特定のユーザーアクションをシミュレートする方法について説明します。