Как интегрировать Appium с C#?

Я не могу найти ни одного сообщения, где я могу автоматизировать мобильное тестирование с appium в C#.

Я написал свой код автоматизации веб-сайта в specflow. Могу ли я также использовать его ?

4 ответов


Appium предоставляет dotnet-appium-драйвер который является вашим API для взаимодействия с Appium. Вы можете использовать это для написания автоматизации приложений.

вы не привели здесь никакого примера или кода, поэтому я не могу действовать на что-то, чтобы показать вам. Я просто запишу код 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);
    }
  }
}

вы можете найти более в этой статье я писал.


наконец добрался до решения запустить тест на C#. Большое спасибо Андри.

это решение запускает веб-сайт в браузере chrome вашего телефона, подключенного к компьютеру:

шаги и короткая программа для установки и запуска программы C# на устройстве android с помощью Appium:

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#, установите Appium, Selenium с помощью диспетчера пакетов NuGet, также установите Nunit с тем же процесс.

2) скачать Android SDK

3) переменные среды: добавьте имя переменной "ANDROID_HOME" и в переменной дайте путь к папке sdk , в пути (найдено в системной переменной) , добавьте путь к инструментам в папке sdk и добавьте путь к инструментам платформы.

4) Подключите устройство (a.драйверы мобильных устройств должны быть установлены на компьютере (в моем случае установлены драйверы moto g adb) b. устройство должно иметь параметр режима разработчика и параметр отладчика проверено и всегда бодрствует опция проверена)

5) Теперь загрузите Appium и откройте Appium.исполняемый.

6) окно Appium - > в настройках Android (первая кнопка) установите флажок "Использовать браузер" и выберите "браузер" в качестве опции.

7) запустите сервер узла appium (кнопка воспроизведения вверху).

8) Теперь запустите тест из visual studio, и вы увидите открытие веб-сайта в браузере телефона.


чтобы сделать это более полным, я написал сообщение в блоге, которое объясняет все шаги четко с изображениями. Его пошаговое руководство по использованию appium с c# и MSTest Вы можете прочитать его здесь. http://www.binaryclips.com/2016/03/test-automation-on-android-using-appium.html


вот как я реализовал Appium. Я думаю, это добавляет некоторую глубину дискуссии.

Appium - это веб-драйвер, который может взаимодействовать с устройством в вашем проекте, а также сервер, который связывает ваш проект с вашим физическим устройством или эмулятором.

вы должны запустить сервер 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); если у вас есть жестко закодированный IP-адрес компьютера, на котором работает ваш сервер Appium, вы можете просто жестко закодировать его. В противном случае вам понадобится вспомогательный класс (в этом примере это 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;
}

Это не приведет вас полностью туда, но это приблизит вас к рабочей среде. Затем вы можете начать работать над получением теста для фактического запуска.

надеюсь, это поможет.