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[][]{
{"正确的网易通行证登录","[email protected]","xxxxx",""},
{"非网易账号的网易通行证登录","[email protected]","xxxx",""},
{"网易通行证登录,密码错误","[email protected]","xxx",
"用户名或密码错误"},
{"不输入账号和密码","","","用户名不能为空"},
{"不输入密码","[email protected]","","密码不能为空"},
{"不输入账号","","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/
如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:[email protected]进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。