1

我正在尝试新的 selenium ios-driver。我有一个混合应用程序,它想测试特别是以下代码

 DesiredCapabilities cap = IOSCapabilities.iphone("InternationalMountains", "1.1");

但是,该网站上的代码似乎是 JAVA。

我们可以使用 C# selenium API 与 ios-driver 一起使用吗?我试着打电话

driver = new RemoteWebDriver(new Uri("http://www:4444/wd/hub"), DesiredCapabilities.IPhone());

它是否提供任何方式来启动应用程序并使用 C# selenium API 进行测试?

4

1 回答 1

0

您是否设置了 Appium Server 以接收连接?

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 地址,你可以硬编码它。否则你需要一个 Helper 类(在这个例子中是 TestSetupHelper)。此示例启动到服务器的 Socket 连接并返回所有详细信息。这样您就不必担心 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

于 2018-06-15T19:06:40.807 回答