iOS及Android自动化实践

摘要:App:网易看游戏(Xone)  工具:appium1.0  Appium1.0较以往的版本有了比较大的变化。  1.xpath路径改变  Before:/window[1]/navigationBar[1]/button[4]  Current://UIAApplication[1

App:网易看游戏(Xone)

工具:appium1.0

Appium1.0较以往的版本有了比较大的变化。

1.xpath路径改变

Before:/window[1]/navigationBar[1]/button[4]

Current://UIAApplication[1]/UIAWindow[1]/UIANavigationBar[1]/UIAButton[4]

2.Capability参数名称改变

Before:

desiredCapabilities.setCapability(CapabilityType.PLATFORM,"iOS");

desiredCapabilities.setCapability(CapabilityType.VERSION,"7.0");

Current:

desiredCapabilities.setCapability("platformVersion","7.0");desiredCapabilities.setCapability("platformName","iOS");

3.Appium客户端UI变化(提供更丰富的参数选择)

4.稳定性提供,客户端未崩溃过。

等等

接下来简单讲下具体实践过程吧

1.项目结构,如图

page:获取UI元素类

test:用例类,即测试类

util:封装大部分的公共方法

assertion:断言类

以testng框架为基础,ant编译执行,实现了每日构建运行。

2.编码,贴下通行证登录模块的代码,供参考

测试类:PassportLogin

publicclassPassportLoginextendsBaseTest{

privatestaticLoggerlog=Logger.getLogger(PassportLogin.class);

@DataProvider(name="passportLoginData")

publicstaticObject[][]passportLoginData(){

returnnewObject[][]{

{"正确的网易通行证登录","xxxxx@163.com","xxxxx",""},

{"非网易账号的网易通行证登录","xxx@qq.com","xxxx",""},

{"网易通行证登录,密码错误","xxxx@163.com","xxx",

"用户名或密码错误"},

{"不输入账号和密码","","","用户名不能为空"},

{"不输入密码","xxx@163.com","","密码不能为空"},

{"不输入账号","","xxxx","用户名不能为空"},

{"错误的网易通行证登录",MyRandom.getRandomString(10)+"@163.com",

MyRandom.getRandomString(6),"用户名或密码错误"}};

}

@BeforeClass

publicvoidsetUp(){

driver=newOrange();

mainPage=newMainPage(driver);

account=newAccount(driver);

as=newAssertSettings(driver);

usPage=newUserSettingsPage(driver);

homePage=newHomePage(driver);

mainPage.enterMainPage();

mainPage.enterLogin();

account.logoutTrue();

}

@AfterClass

publicvoidtearDown(){

driver.quit();

}

@AfterMethod

publicvoidend()throwsInterruptedException{

log.info("-------------------------------------------------------------------");

}

@Test(dataProvider="passportLoginData")

publicvoidpassportLoginTest(StringtestName,Stringpassport,

Stringpassword,StringerrorCode)throwsInterruptedException{

log.info("测试内容:"+testName);

mainPage.enterLogin();

account.login(passport,password);

if(errorCode!=""){

booleanb=as.assertLogin(errorCode);

driver.sleep(3000);

mainPage.flickToRight();

mainPage.closePage();

Assert.assertTrue(b);

}else{

mainPage.enterLogin();

homePage.settingsClick();

usPage.passportClick();

account.logout();

}

}

}

由于涉及到了多个page,这里只贴部分Page类,如Account类,用于获取登录操作

publicclassAccountextendsBasePage{

/**

*@Title:Account

*@Description:TODO

*@param@paramdriver

*@throws

*/

publicAccount(Orangedriver){

super(driver);

//TODOAuto-generatedconstructorstub

}

/**

*@Title:login

*@Description:TODO

*@param@paramdriver

*@returnvoid

*@throws

*/

publicvoidlogin(){

driver.clickOnElement(By.name("网易通行证登录"));

driver.sendKeys(By.xpath("//UIAApplication[1]/UIAWindow[1]/UIATextField[1]"),

PropertiesHandle.readValue("passport_2"));

driver.sendKeys(By.xpath("//UIAApplication[1]/UIAWindow[1]/UIASecureTextField[1]"),

PropertiesHandle.readValue("password"));

driver.clickOnElement(By.xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[1]"));

}

/**

*@Title:login

*@Description:TODO

*@param@paramdriver

*@param@parampassport

*@param@parampassword

*@returnvoid

*@throws

*/

publicvoidlogin(Stringpassport,Stringpassword){

driver.clickOnElement(By.name("网易通行证登录"));

driver.sendKeys(By.xpath("//UIAApplication[1]/UIAWindow[1]/UIATextField[1]"),passport);

driver.sendKeys(By.xpath("//UIAApplication[1]/UIAWindow[1]/UIASecureTextField[1]"),password);

driver.clickOnElement(By.xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[1]"));

}

/**

*@Title:login

*@Description:TODO

*@param@paramtype

*@param@parampassport

*@param@parampassword

*@returnvoid

*@throws

*/

publicvoidlogin(Stringtype,Stringpassport,Stringpassword){

driver.clickOnElement(By.name(type));

driver.sendKeys(By.xpath("//UIAApplication[1]/UIAWindow[1]/UIATextField[1]"),passport);

driver.sendKeys(By.xpath("//UIAApplication[1]/UIAWindow[1]/UIASecureTextField[1]"),password);

driver.clickOnElement(By.xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[1]"));

}

/**

*@Title:login

*@Description:TODO

*@param@paramtype

*@returnvoid

*@throws

*/

publicvoidlogin(Stringtype){

driver.clickOnElement(By.name(type));

}

/**

*@Title:logout

*@Description:TODO

*@param@paramdriver

*@returnvoid

*@throws

*/

publicvoidlogout(){

driver.clickOnElement(By.name("退出当前帐号"));

driver.clickOnElement(By.name("确定"));

}

}

主要的公共类:Orange,主要借鉴了孔庆云同学已经封装好的方法,并进行一些改进后直接使用,方便快捷。

目前Appium已经到了1.1版本,这款自动化工具还是不错的,跨平台,跨语言支持都比较好,稳定性也在逐步提升。

最新内容请见作者的GitHub页:http://qaseven.github.io/

如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。