如何将Appium与C#集成?

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

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

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 = ""; 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浏览器中运行网站:

使用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设备的驱动程序应该安装在计算机中(我的安装了我的案例motb驱动程序)b。设备应该有开发者模式选项ON并选中调试器选项并且始终选中唤醒选项)

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

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

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

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

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

这就是我实现Appium的方式。 我认为它为讨论增加了一些深度。

Appium既是可以与项目中的设备交互的WebDriver,也是将项目连接到物理设备或模拟器的服务器。

您必须将Appium服务器作为侦听器运行,并设置您的function以连接到它。 这将启动应用程序并执行您的测试。

除此之外还有更多内容,但这里有一个设置,您可以尝试让您继续前进:

在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>().ToConstructor(x => new IOSDriver(new Uri("http://" + ip + ":" + port + "/wd/hub"), capabilities, TimeSpan.FromMinutes(10))).Named("AppiumDriver"); kernel.Bind>().ToConstructor(x => new IOSDriver(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文件中获取值。

例:

    

您必须将所有内容添加到用于运行要从中获取的项目的.runsettings文件中。 如果您不想浏览runsettings文件,可以对其进行硬编码,但我更喜欢这样做。 您可以根据您选择的runsettings文件使事物变量。

然后你必须定义TestSetupHelper.GetComputerIpAddress(server,port,true); 如果你有一个硬编码的IP地址到运行你的Appium服务器的计算机,你可以硬编码。 否则你需要一个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; } 

这不会让你完全在那里,但它会让你接近一个工作环境。 然后,您可以开始尝试实际运行测试。

我希望这有帮助。