【问题标题】:How do you handle using Appium to test both an iOS and an Android device with the same code?您如何使用 Appium 来测试具有相同代码的 iOS 和 Android 设备?
【发布时间】:2021-10-03 20:49:59
【问题描述】:

我注意到它们都有不同的驱动程序(至少对于我正在使用的 c#)。

private AppiumDriver<AndroidElement> _driver;
private IOSDriver<IOSElement> _iosDriver;  

您如何处理所有不同的定位器等。您是否编写了两个版本的代码,一个用于 iOS,另一个用于 Android。 非常感谢您提供的任何建议。

我希望创建一个类似的方法:

internal void ClickOKButton(driver)
{
   driver.FindElementById("okBtn").Click();
}

并将方法用作:

page.ClickOKButton(IOSElement> driver) <-- for iOS
page.ClickOKButton(AppiumDriver<AndroidElement> driver) <-- for Android

这可能吗?谢谢

【问题讨论】:

    标签: c# appium appium-android appium-ios


    【解决方案1】:

    我会尝试根据我对 Android 和 iOS 项目的经验给你一个答案,只是我总是单独使用它们而不是同一个项目(基于 Java)。

    在分析了 Appium Android 和 iOS 项目之后,我有以下亮点。所有这些事情都可以通过正确的语句在同一个项目中处理。:

    抱歉,如果这在 C# 中意义不大,但我希望这能让您了解不同之处

    • 相同的 NPM 包,虽然 iOS 只能在 Mac OS X 上执行

    • iOS 和 Android 的驱动程序不同:

    AndroidDriver<MobileElement> driver = new AndroidDriver<>(new URL("http://0.0.0.0:4723/wd/hub"), cap); <- for Android
    IOSDriver<MobileElement> driver = new IOSDriver<>(new URL("http://0.0.0.0:4723/wd/hub"), cap); <- for iOS
    
    • iOS 和 Android 的功能不同(我没有在不同的项目中专门同步这些功能)
    Android
            DesiredCapabilities cap = new DesiredCapabilities();
            cap.setCapability("platformVersion", platformVersion);
            cap.setCapability("deviceName", deviceName);
            cap.setCapability("platformName", "Android");
            cap.setCapability("noReset", true);
            cap.setCapability("app", APP);
            cap.setCapability("avd", EMULATOR);
    
    iOS
            DesiredCapabilities cap = new DesiredCapabilities();
            cap.setCapability(MobileCapabilityType.DEVICE_NAME, deviceName);
            cap.setCapability(MobileCapabilityType.UDID, "auto");
            cap.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");
            cap.setCapability(MobileCapabilityType.PLATFORM_VERSION, platformVersion);
            cap.setCapability(MobileCapabilityType.NO_RESET, true);
            cap.setCapability(MobileCapabilityType.FULL_RESET, false);
            cap.setCapability(MobileCapabilityType.AUTOMATION_NAME, "XCUITest");
            cap.setCapability(MobileCapabilityType.APP, app);
            cap.setCapability("showXcodeLog", false);
    
    • PageFactory 与定位器不同(我创建了一个新的 Java 类来创建元素库并在 Main 中创建实例)
    Android - PageFactory for elements
        public Elements(AndroidDriver<MobileElement> driver) {
            this.driver = driver;
            PageFactory.initElements(new AppiumFieldDecorator(driver), this);
        }
    
        @AndroidFindBy(xpath = "//*[contains(@text,'text')]")
        public MobileElement element;
    
    iOS - PageFactory for elements
        public Elements(IOSDriver<MobileElement> driver) {
            this.driver = driver;
            PageFactory.initElements(new AppiumFieldDecorator(driver), this);
        }
    
        @iOSXCUITFindBy(xpath = "//XCUIElementTypeStaticText[@name='text']")
        public MobileElement element;
    
    
    • WebDriverWaits 相同
    wait_5 = new WebDriverWait(driver, 5);
    

    【讨论】:

      猜你喜欢
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 2021-10-18
      • 2021-11-07
      • 2018-10-18
      • 1970-01-01
      • 2020-06-11
      相关资源
      最近更新 更多