web-dev-qa-db-ja.com

AppiumをC#と統合する方法は?

C#でappiumを使用してモバイルテストを自動化できる単一の投稿が見つかりません。

Specflowでウェブサイト自動化コードを記述しました。再利用できますか?

10
Arpan Buch

Appiumは dotnet-appium-driver を提供します。これは、Appiumとやり取りするためのAPIです。これを使用して、アプリの自動化を記述できます。

ここでは例もコードも提供しなかったので、実際に何かを見せることはできません。 C#で簡単なテストを作成する方法を理解できるように、いくつかのC#コードを書き留めます。

namespace AppiumTests
{
  using System;
  // .NET unit test namespaces needed here as well, just not mentioning them
  using OpenQA.Selenium; /* Appium is based on Selenium, we need to include it */
  using OpenQA.Selenium.Appium; /* This is Appium */

  [TestClass]
  public class TestSuite
  {
    private AppiumDriver driver;

    private static Uri testServerAddress = new Uri("http:127.0.01:4723/wd/hub"); // If Appium is running locally
    private static TimeSpan INIT_TIMEOUT_SEC = TimeSpan.FromSeconds(180); /* Change this to a more reasonable value */
    private static TimeSpan IMPLICIT_TIMEOUT_SEC = TimeSpan.FromSeconds(10); /* Change this to a more reasonable value */

    [TestInitialize]
    public void BeforeAll()
    {
      DesiredCapabilities testCapabilities = new DesiredCapabilities();

      testCapabilities.App = "<your-app-file>";
      testCapabilities.AutoWebView = true;
      testCapabilities.AutomationName = "";
      testCapabilities.BrowserName = String.Empty; // Leave empty otherwise you test on browsers
      testCapabilities.DeviceName = "Needed if testing on IOS on a specific device. This will be the UDID";
      testCapabilities.FwkVersion = "1.0"; // Not really needed
      testCapabilities.Platform = TestCapabilities.DevicePlatform.Android; // Or IOS
      testCapabilities.PlatformVersion = String.Empty; // Not really needed

      driver = new AppiumDriver(testServerAddress, capabilities, INIT_TIMEOUT_SEC);
      driver.Manage().Timeouts().ImplicitlyWait(IMPLICIT_TIMEOUT_SEC);
    }

    [TestCleanup]
    public void AfterAll()
    {
      driver.Quit(); // Always quit, if you don't, next test session will fail
    }

    /// 
    /// Just a simple test to heck out Appium environment.
    /// 
    [TestMethod]
    public void CheckTestEnvironment()
    {
      var context = driver.GetContext();
      Assert.IsNotNull(context);
    }
  }
}

あなたはもっと見つけることができます この記事 私が書いた。

9
Andry

最終的にソリューションに到達し、C#でテストを実行します。Andryに感謝します。

このソリューションは、コンピューターに接続された電話のchromeブラウザー:でWebサイトを実行します。

Android Appiumを使用するデバイス:でC#プログラムをセットアップして実行する手順と短いプログラム

namespace poc
{
    using NUnit.Framework;    
    using System;
    using OpenQA.Selenium; 
    using OpenQA.Selenium.Appium;
    using OpenQA.Selenium.Appium.Interfaces;
    using OpenQA.Selenium.Appium.MultiTouch;
    using OpenQA.Selenium.Interactions;
    using OpenQA.Selenium.Remote;
    using OpenQA.Selenium.Appium.Android;

    [TestFixture()]
    public class TestAppium
    {
        public IWebDriver driver;

        [TestFixtureSetUp]
        public void SetUp()
        {
            DesiredCapabilities capabilities = new DesiredCapabilities();
            capabilities.SetCapability("device", "Android");
            capabilities.SetCapability("browserName", "chrome");
            capabilities.SetCapability("deviceName", "Motorola Moto g");
            capabilities.SetCapability("platformName", "Android");
            capabilities.SetCapability("platformVersion", "5.0.2");

             driver = new RemoteWebDriver(new Uri("http://127.0.0.1:4723/wd/hub"), capabilities, TimeSpan.FromSeconds(180));
        }  

        [Test()]
        public void OpenHofHomePage()
        {
            driver.Navigate().GoToUrl("http://YourWebsiteToTest.com");
            Assert.IsTrue(driver.Title.Equals("Your Website")," Sorry , the website didnt open!!");
        }

        [TestFixtureTearDown]
        public void End()
        {
            driver.Dispose();
        }
    }
}

1)C#で通常のプロジェクトをセットアップし、NuGetパッケージマネージャーを使用してAppium、Seleniumをインストールし、同じプロセスでNunitもインストールします。

2)ダウンロードAndroid SDK

3)環境変数:変数名「Android_HOME」を追加し、変数にsdkフォルダーへのパスを指定します。PATH(システム変数にあります)で、sdkフォルダー内のツールへのパスを追加し、プラットフォームツールへのパスを追加します。

4)デバイスを接続します(a。モバイルデバイスのドライバーをコンピューターにインストールする必要があります(私の場合はmoto g adbドライバーをインストールする必要があります)b。デバイスの開発者モードオプションをオンにし、デバッガーオプションをオンにし、常にスリープ解除オプションをオンにする必要があります)

5)Appiumをダウンロードして、Appium.exeを開きます。

6)Appiumウィンドウ-> Android設定(最初のボタン))で、[ブラウザを使用]オプションをオンにし、オプションとして[ブラウザ]を選択します。

7)appiumノードサーバーを起動します(上部の再生ボタン)。

8)Visual Studioからテストを実行すると、電話のブラウザーでWebサイトが開きます。

8
Arpan Buch

これをより包括的にするために、すべてのステップを画像で明確に説明するブログ投稿を作成しました。 c#とMSTestでappiumを使用するためのステップバイステップのチュートリアルここで読むことができます。 http://www.binaryclips.com/2016/03/test-automation-on-Android-using-appium.html

4
joinsaad

これが私がAppiumを実装した方法です。それは議論にいくらかの深みを加えると思います。

Appiumは、プロジェクト内のデバイスと対話できるWebDriverであると同時に、プロジェクトを物理デバイスまたはエミュレーターにブリッジするサーバーでもあります。

Appiumサーバーをリスナーとして実行し、それに接続する機能を設定する必要があります。これでアプリが起動し、テストが実行されます。

これ以外にもたくさんありますが、ここにあなたがあなたをあなたの道に連れて行くように試みることができる設定があります:

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ファイルを使いたくない場合は、ハードコーディングできますが、私はそのようにしたいと思っています。選択したrunsettingsファイルに基づいて、そのように物事を可変にすることができます。

次に、TestSetupHelper.GetComputerIpAddress(server、port、true);を定義する必要があります。 Appiumサーバーを実行しているコンピューターにハードコードされたIPアドレスがある場合は、それをハードコードすることができます。それ以外の場合は、どこかにHelperクラスが必要です(この例では、TestSetupHelperです)。この例では、サーバーへのソケット接続を開始し、すべての詳細を返します。そうすれば、IPアドレスの変更について心配する必要はありません。 Appiumを実行するように構成したホスト名とポートを渡すだけで、その接続から接続情報を取得し、Appiumサーバーインスタンスに実際に接続できます。

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;
}

これで完全にそこに到達するわけではありませんが、作業環境に近くなります。次に、実際にテストを実行するための作業を開始できます。

これがお役に立てば幸いです。

0
J.R. Bye