首页 文章 精选 留言 我的

精选列表

搜索[Emacs化],共10000篇文章
优秀的个人博客,低调大师

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/

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册