接続を受信するように Appium サーバーをセットアップしましたか?
Appium は、プロジェクト内のデバイスと対話できる WebDriver であると同時に、プロジェクトを物理デバイスまたはエミュレーターにブリッジするサーバーでもあります。
Appium サーバーをリスナーとして実行し、Capabilities を設定して接続する必要があります。これにより、アプリが起動し、テストが実行されます。
これには他にもたくさんありますが、ここにあなたがあなたの道を歩むことができるセットアップがあります:
WebDriver サポート クラスでは、[BeforeScenario] タグを使用して、テストの前にこのコードを実行します。これには Sauce Labs の実装があります。
[BeforeScenario]
public void BeforeScenario()
{
var name = Locale == "sauce" ? "AppiumSauceDriver" : "AppiumDriver";
InitializeServiceLocator();
if (WebDriver == null)
{
InitializeWebDriver(name);
}
ObjectContainer.RegisterInstanceAs(WebDriver);
if (WebDriver != null)
{
Console.WriteLine("Driver Already Exists");
}
}
次に、InitializeServiceLocator() メソッドを設定する必要があります。ここには、名前を設定する以外に何もしないデバイス セレクタ メソッドがあります。代わりに、機能に合わせてハードコーディングすることができます。
private static void InitializeServiceLocator()
{
if (ServiceLocator == null)
{
var ip = "";
var deviceType = TestSetupHelper.DeviceSelector["iphone7"];
var capabilities = TestSetupHelper.SetAppiumCababilities(deviceType, Locale);
string server = MSTestContextSupport.GetRunParameter("appiumServer");
var port = Convert.ToInt32(MSTestContextSupport.GetRunParameter("appiumPort"));
if (Locale != "sauce")
{
ip = TestSetupHelper.GetComputerIpAddress(server, port, true);
}
var kernel = new StandardKernel();
kernel.Bind<IOSDriver<AppiumWebElement>>().ToConstructor(x => new IOSDriver<AppiumWebElement>(new Uri("http://" + ip + ":" + port + "/wd/hub"), capabilities, TimeSpan.FromMinutes(10))).Named("AppiumDriver");
kernel.Bind<IOSDriver<AppiumWebElement>>().ToConstructor(x => new IOSDriver<AppiumWebElement>(new Uri("http://ondemand.saucelabs.com:80/wd/hub"), capabilities, TimeSpan.FromMinutes(10))).Named("AppiumSauceDriver");
ServiceLocator = new NinjectServiceLocator(kernel);
Microsoft.Practices.ServiceLocation.ServiceLocator.SetLocatorProvider(() => ServiceLocator);
}
}
ここから、機能を設定する必要があります。以下の方法は、私が行った方法です。
public static DesiredCapabilities SetAppiumCababilities(string deviceType, string locale, bool realDevice = false, string udid = "FAKEUDIDFOREXAMPLE")
{
string appiumAppFilePath = MSTestContextSupport.GetRunParameter("appiumAppFilePath");
//Universal Capabilities
capabilities.SetCapability("platformName", "iOS");
capabilities.SetCapability("deviceName", deviceType);
capabilities.SetCapability("automationName", "XCUITest");
capabilities.SetCapability("app", appiumAppFilePath);
capabilities.SetCapability("xcodeOrgId", "GET_THIS_FROM_APP_DEV");
capabilities.SetCapability("xcodeSigningId", "iPhone Developer");
capabilities.SetCapability("noReset", true);
capabilities.SetCapability("newCommandTimeout", 80);
if (locale == "sauce")//Sauce specific capabilities
{
capabilities.SetCapability("appiumVersion", "1.7.2");
capabilities.SetCapability("name", MSTestContextSupport.GetRunParameter("appiumJobName"));
capabilities.SetCapability("username", MSTestContextSupport.GetRunParameter("sauceId"));
capabilities.SetCapability("accessKey", MSTestContextSupport.GetRunParameter("sauceKey"));
capabilities.SetCapability("tunnel-identifier", MSTestContextSupport.GetRunParameter("sauceTunnel"));
capabilities.SetCapability("browserName", "");
capabilities.SetCapability("platformVersion", "11.2");
}
else//Local specific capabilities
{
capabilities.SetCapability("platformVersion", "11.3");
}
if (realDevice)//Sauce real device testing will not need this. This is for Local Real Device testing only
{
capabilities.SetCapability("udid", udid);
}
return capabilities;
}
GetRunParameter を参照するものはすべて、.runsettings ファイルから値を取得しています。
例:
<TestRunParameters>
<Parameter name="appiumJobName" value="OBI App Automated Test"/>
</TestRunParameters>
そこから調達したいプロジェクトを実行するために使用している .runsettings ファイルにすべてのものを追加する必要があります。runsettings ファイルを使いたくない場合は、ハードコードすることもできますが、私はその方法を好みます。選択した実行設定ファイルに基づいて、そのように変数を作成できます。
次に、TestSetupHelper.GetComputerIpAddress(server, port, true); を定義する必要があります。Appium サーバーを実行しているコンピューターにハード コーディングされた IP アドレスがある場合は、それをハード コーディングできます。それ以外の場合は、どこかにヘルパー クラスが必要です (この例では、TestSetupHelper です)。この例では、サーバーへのソケット接続を開始し、すべての詳細を返します。そうすれば、IP アドレスの変更について心配する必要はありません。ホスト名と Appium を実行するように構成したポートを渡すだけで、その接続から接続情報を取得し、Appium Server インスタンスへの実際の接続を確立できます。
public static string GetComputerIpAddress(string computerName, int port, bool remote)
{
var ip = "";
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
socket.Connect(computerName, port);
//If remote it gets the connection destination IP, else it gets the connection initiator IP
IPEndPoint endPoint = remote ? socket.RemoteEndPoint as IPEndPoint : socket.LocalEndPoint as IPEndPoint;
ip = endPoint.Address.ToString();
}
return ip;
}
これで完全にそこにたどり着くわけではありませんが、作業環境に近づくことができます。その後、実際にテストを実行するための作業を開始できます。
これが役立つことを願っています。
JR