Appium 最近在使用 Appium 做自动化测试,包括 Android 和 iOS,只是在封装的过程中,不知道该如何实现下面的代码,求建议

__Luke · 发布于 2017年12月05日 · 最后由 fyam 回复于 2017年12月12日 · 1064 次阅读
public class PlatformSelector {

    public WebDriver setDriver(MobileType mobileType, URL url, DesiredCapabilities cap) {
        MobileDriver platform = new MobileDriver();
        WebDriver driver = null;
        try{
            switch (mobileType) {
                case ANDROID:
                    driver = platform.androidDriver(url, cap);
                    LogUtil.frameLog("Launch ANDROID platform Complete");
                    return driver;
                case FIREOS:
                    driver = platform.fireOSDriver(url, cap);
                    LogUtil.frameLog("Launch FIREOS platform Complete");
                    return driver;
                case iOS:
                    driver = platform.iosDriver(url, cap);
                    LogUtil.frameLog("Launch iOS platform Complete");
                    return driver;
                default:
                    LogUtil.frameLog("Please Check the Type of Platform");
                    return driver;
            }
        }
        catch(Exception e){
            LogUtil.error("Launch Mobile paltform Failed\n");
            return driver;
        }
    }


}
public class MobileDriver {

    private WebDriver driver;
    private static int RETRY_TIME;
    private static int RETRY_WAIT;

    public MobileDriver(){
        RETRY_TIME = Integer.parseInt(FrameConfig.getInstance().getConfig("RetryTime"));
        RETRY_WAIT = Integer.parseInt(FrameConfig.getInstance().getConfig("RetryWait"));
    }

    protected WebDriver androidDriver(URL url,DesiredCapabilities cap) {
        LogUtil.frameLog("Launch Android Platform Application...");

        for(int i = 1; i <= RETRY_TIME; i++){
            try{
                driver = new AndroidDriver<AndroidElement>(url,cap);
                driver.manage().timeouts().implicitlyWait(Long.parseLong(FrameConfig.getInstance().getConfig("TimeOut")), TimeUnit.SECONDS);
                break;
            }
            catch(Exception e){
                LogUtil.warn("Launch Android Platform Application, Retry (" + i + "/" + RETRY_TIME + ") Times After " + RETRY_WAIT + "Seconds");
                SysUtil.sleep(RETRY_WAIT);
                if(i == RETRY_TIME){
                    throw e;
                }
            }
        }
        return driver;
    }

    protected WebDriver iosDriver(URL url,DesiredCapabilities cap) {
        LogUtil.frameLog("Launch iOS Platform Application...");

        for(int i = 1; i <= RETRY_TIME; i++){
            try{
                driver = new IOSDriver<MobileElement>(url,cap);
                driver.manage().timeouts().implicitlyWait(Long.parseLong(FrameConfig.getInstance().getConfig("TimeOut")), TimeUnit.SECONDS);
                break;
            }
            catch(Exception e){
                LogUtil.warn("Launch iOS Platform Application Failed, Retry (" + i + "/" + RETRY_TIME + ") Times After " + RETRY_WAIT + "Seconds");
                SysUtil.sleep(RETRY_WAIT);
                if(i == RETRY_TIME){
                    throw e;
                }
            }
        }
        return driver;
    }

}

我想要达到的目的是在底层分别封装AndroidDriver和IOSDriver,然后在脚本层面通过传递不同的平台参数
实现Driver的自动配置,然后在脚本层面就不必关心AndroidDriver和IOSDriver的区别了;

大家看看有什么好的实现方法没?

public class SecondTest extends TestBase{

    private URL url;
    private DesiredCapabilities cap;
    private String userName;
    private String passWord;


    @BeforeClass
    public void setUp(){

        initVariables();
        setDriver(MobileType.ANDROID, url, cap);
    }
    /***********************************************
     *
     *初始化基本信息
     *
     ***********************************************/
    private void initVariables(){

        userName = "xxxxxxx";
        passWord = "xxxxx";
        cap = new DesiredCapabilities();
        cap.setCapability("deviceName","192.168.54.101:5555");
        cap.setCapability("automationName","Appium");
        cap.setCapability("platformName","Android");
        cap.setCapability("platformVersion","7.1.1");

       //配置测试apk
        cap.setCapability("appPackage", "xxxxxxxxx");
        cap.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, ".AppStartActivity");
        cap.setCapability("sessionOverride", true);    //每次启动时覆盖session,否则第二次后运行会报错不能新建session
        cap.setCapability("unicodeKeyboard", true);    //设置键盘
        cap.setCapability("resetKeyboard", false);     //设置默认键盘为appium的键盘

        try {
            url = new URL("http://127.0.0.1:4723/wd/hub");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    @Test(description = "登录APP")
    public void Login(){

        action.sleep(5, "等待APP的启动");

        action.swipe("向左滑动");
        action.sleep(2, "等待页面滑动动作完成");
        action.swipe("向左滑动");
        action.sleep(2, "等待页面滑动动作完成");
        action.swipe("向左滑动");
        action.sleep(2, "等待页面滑动动作完成");

        action.sendKeys(By.id("com.eisoo.anycontent:id/accountEdt"), userName, "输入用户名");
        action.sendKeys(By.id("com.eisoo.anycontent:id/et_password"), passWord, "输入用户名");
        action.click(By.id("com.eisoo.anycontent:id/tv_account_login"), "点击登录按钮");
        action.sleep(10, "等待");
    }

}

上面的效果就是我想要达到的,只是目前对API的都是AndroidDriver,而IOSDriver的API确实与前者有所不同。

大家有什么类似的经验,一块儿学习一下呀

共收到 12 条回复
36ac1f
__Luke · #1 · 2017年12月05日 作者

自己顶一下,希望更多的朋友能够看到

F58ce0

可以试试 AppiumDriver 适用于Android和iOS

36ac1f
__Luke · #3 · 2017年12月05日 作者
F58ce0xiaoMGitHub 回复

在尝试,但是很多时候需要使用强制类型转换,我在想能不能添加一个flag,然后可以不使用强制类型转换

36ac1f
__Luke · #4 · 2017年12月05日 作者

还有人吗?

有JAVA的高手没?

27cc8a

怎么你在写自动化脚本的时候用到了封装, 我就没用到哦!

36ac1f
__Luke · #6 · 2017年12月06日 作者
27cc8aJinZhu 回复

。。。

8331

我们做的是 配置写在 properties文件里根据 配置自动读取Android或者ios
定义 protected static AppiumDriver driver;

根据 true 或者false 执行相对应的 方法初始化对应的driver

36ac1f
__Luke · #8 · 2017年12月06日 作者
8331sysayy 回复

我也正在尝试使用这样的配置或者说使用flag的方式,只是我觉得这种方式的封装程度还是不够,我希望能能够完全屏蔽
AndroidDriver 和IOSDriver的区别,在写业务测试脚本这个层面提供一套统一的API

谢谢你的回复,如果我有进一步的进展,也会继续在这里回复

36ac1f
__Luke · #9 · 2017年12月06日 作者

自己顶一下,希望更多的朋友看到,参与到appium框架二次开发中来

9f538f
36ac1f__Luke 回复

能加个好友吗

36ac1f
__Luke · #11 · 2017年12月12日 作者
9f538ffyam 回复

可以呀

9f538f
仅楼主可见
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册