如何将Appium与C#集成?

时间:2015-02-20 20:41:58

标签: c# selenium-webdriver appium specflow

我无法找到一个帖子,我可以用C#中的appium自动进行移动测试。

我在specflow中编写了我的网站自动化代码。我可以重复使用吗?

4 个答案:

答案 0 :(得分:9)

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

您可以在我写的this article中找到更多信息。

答案 1 :(得分:8)

最后到达解决方案在C#中运行测试。非常感谢安德里。

此解决方案在连接到计算机的手机的Chrome浏览器中运行网站:

使用Appium在Android设备上设置和运行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)Envrionment变量:添加变量名称“ANDROID_HOME”并在变量给出sdk文件夹的路径中,在PATH(在System变量中找到)中,将路径附加到sdk文件夹中的工具并将路径附加到平台工具。

4)连接你的设备(应该在计算机上安装a.mobile设备的驱动程序(安装我的案例moto g adb驱动程序)b。设备应该选择开发者模式选项并检查调试器选项并且始终选中唤醒选项)

5)现在下载Appium并打开Appium.exe。

6)Appium窗口 - &gt;在Android设置(第一个按钮)中,选中“使用浏览器”选项并选择“浏览器”作为选项。

7)启动appium节点服务器(顶部的播放按钮)。

8)现在从视觉工作室运行测试,你会看到网站在手机浏览器中打开。

答案 2 :(得分:4)

为了使这更全面,我写了一篇博文,用图像清楚地解释了所有步骤。它是一个循序渐进的教程,使用appium与c#和MSTest 你可以在这里阅读它。 http://www.binaryclips.com/2016/03/test-automation-on-android-using-appium.html

答案 3 :(得分:0)

这就是我实施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 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;
}

这并不能使您完全达到目标,但可以使您接近工作环境。然后,您就可以开始进行实际运行的测试了。

我希望这会有所帮助。