iOS及Android自动化实践

简介:
App:网易看游戏(Xone)
  工具:appium 1.0
  Appium 1.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
public class PassportLogin extends BaseTest {
private static Logger log = Logger.getLogger(PassportLogin.class);
@DataProvider(name = "passportLoginData")
public static Object[][] passportLoginData() {
return new Object[][] {
{ "正确的网易通行证登录", "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
public void setUp() {
driver = new Orange();
mainPage = new MainPage(driver);
account = new Account(driver);
as = new AssertSettings(driver);
usPage = new UserSettingsPage(driver);
homePage = new HomePage(driver);
mainPage.enterMainPage();
mainPage.enterLogin();
account.logoutTrue();
}
@AfterClass
public void tearDown() {
driver.quit();
}
@AfterMethod
public void end() throws InterruptedException {
log.info("-------------------------------------------------------------------");
}
@Test(dataProvider = "passportLoginData")
public void passportLoginTest(String testName, String passport,
String password, String errorCode) throws InterruptedException {
log.info("测试内容:" + testName);
mainPage.enterLogin();
account.login(passport, password);
if (errorCode != "") {
boolean b = 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类,用于获取登录操作
public class Account extends BasePage {
/**
* @Title: Account
* @Description: TODO
* @param @param driver
* @throws
*/
public Account(Orange driver) {
super(driver);
// TODO Auto-generated constructor stub
}
/**
* @Title: login
* @Description: TODO
* @param @param driver
* @return void
* @throws
*/
public void login() {
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 @param driver
* @param @param passport
* @param @param password
* @return void
* @throws
*/
public void login(String passport, String password) {
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 @param type
* @param @param passport
* @param @param password
* @return void
* @throws
*/
public void login(String type, String passport, String password) {
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 @param type
* @return void
* @throws
*/
public void login(String type) {
driver.clickOnElement(By.name(type));
}
/**
* @Title: logout
* @Description: TODO
* @param @param driver
* @return void
* @throws
*/
public void logout() {
driver.clickOnElement(By.name("退出当前帐号"));
driver.clickOnElement(By.name("确定"));
}
}
  主要的公共类:Orange,主要借鉴了孔庆云同学已经封装好的方法,并进行一些改进后直接使用,方便快捷。
  目前Appium已经到了1.1版本,这款自动化工具还是不错的,跨平台,跨语言支持都比较好,稳定性也在逐步提升。


最新内容请见作者的GitHub页:http://qaseven.github.io/
相关文章
|
23天前
|
人工智能 JavaScript 前端开发
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
|
20天前
|
IDE 开发工具 Android开发
移动应用开发之旅:探索Android和iOS平台
在这篇文章中,我们将深入探讨移动应用开发的两个主要平台——Android和iOS。我们将了解它们的操作系统、开发环境和工具,并通过代码示例展示如何在这两个平台上创建一个简单的“Hello World”应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧,帮助你更好地理解和掌握移动应用开发。
44 17
|
21天前
|
运维 监控 持续交付
自动化运维在现代数据中心的应用与实践####
本文探讨了自动化运维技术在现代数据中心中的应用现状与实践案例,分析了其如何提升运维效率、降低成本并增强系统稳定性。通过具体实例,展示了自动化工具如Ansible、Puppet及Docker在环境配置、软件部署、故障恢复等方面的实际应用效果,为读者提供了一套可参考的实施框架。 ####
|
21天前
|
运维 监控 Devops
自动化运维实践:打造高效的DevOps流水线
在软件开发的快节奏中,自动化运维成为提升效率、确保质量的关键。本文将引导你理解自动化运维的价值,通过实际案例分享如何构建一个高效、可靠的DevOps流水线。我们将从持续集成(CI)开始,逐步深入到持续部署(CD),并展示代码示例来具体说明。准备好让你的运维工作飞跃式进步了吗?让我们开始吧!
|
24天前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
29 8
|
20天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
23天前
|
人工智能 安全 物联网
Android与iOS:移动操作系统的双雄争霸
在智能手机市场中,Android和iOS作为两大主流操作系统,各自拥有庞大的用户群体和独特的生态系统。本文将深入探讨这两种系统的发展历程、技术特点、市场表现以及未来趋势,以期为读者提供全面而深入的了解。通过对比分析,我们可以发现,尽管Android和iOS在某些方面存在竞争关系,但它们也在相互借鉴中不断进步和完善。
|
20天前
|
安全 生物认证 Android开发
深入探索iOS与Android操作系统的安全性差异
本文旨在通过对比分析iOS和Android两大主流移动操作系统在安全性方面的差异,揭示它们各自的安全机制、面临的挑战以及用户如何提升自身设备的安全保护。通过对系统架构、应用审核机制、数据加密方式及隐私政策的深入探讨,本文为读者提供了一个全面了解两大平台安全性的视角,并提出了实用的安全建议。
|
21天前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
|
24天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。