APP自动化测试神器之Appium-QQ登录脚本实战(java版)
的有关信息介绍如下:在前文中,我们已经完成了如下知识点的铺垫:
一、QQ登录脚本测试用例
下面我们就来着手实现 QQ轻聊版本 应用的登录业务脚本的开发和运行。
打开android模拟器上的qq应用
点击首页上的登录按钮
在登录页面输入用户名和密码
点击登录按钮
滑动条状验证码进行验证(如果有的话)
登录qq账号成功
二、测试环境准备
JDK安装及path配置
启动夜神模拟器(或itools),安装qq软件,ADB连接模拟器正常
打开Appium并启动服务,安装下图设置即可,host设置127.0.0.1,端口设置4723
三、脚本开发
启动Eclipse软件(支持java project开发),就可以根据测试用例创建java工程编写脚本了。
1、新建一个java project
2、导入jar包
在project下新建一个文件夹lib,把三个jar包拷贝到lib文件夹下,选中三个jar包后右键,点击Build Path->Add build path。
3、创建java文件
在src目录下新建一个包及class文件QQLogin,点击Finish即可。
4、实现自动化代码
使用java直接编写的脚本
package com.qf ; import java.net.URL ; import java.util.concurrent.TimeUnit ; import org.openqa.selenium.remote.DesiredCapabilities ; import io.appium.java_client.AppiumDriver ; public class QQLogin { public static void main ( String [] args ) { //打包DesiredCapabilities这个类 DesiredCapabilities des = new DesiredCapabilities (); des . setCapability ( "platformName" , "Android" ); des . setCapability ( "platformVersion" , "5.1.1" ); des . setCapability ( "deviceName" , "Android Emulator" ); des . setCapability ( "noReset" , true ); //获取包名及第一个页面的activity des . setCapability ( "appPackage" , "com.tencent.qqlite" ); des . setCapability ( "appActivity" , "com.tencent.mobileqq.activity.SplashActivity" ); //创建AppiumDriver对象,连接上Appium服务器,并将相应的键值对传过去 AppiumDriver driver = null ; try { driver = new AppiumDriver ( new URL ( "http://127.0.0.1:4723/wd/hub" ), des ); driver . manage (). timeouts (). implicitlyWait ( 10 , TimeUnit . SECONDS ); //步骤1:点击首页的登录按钮 driver . findElementById ( "com.tencent.qqlite:id/btn_login" ). click (); //步骤2:在登录页面用户名文本框中输入qq号码 driver . findElementByAccessibilityId ( "请输入QQ号码或手机或邮箱" ). clear (); driver . findElementByAccessibilityId ( "请输入QQ号码或手机或邮箱" ). sendKeys ( "2572652583" ); //步骤3:在登录页面密码文本框中输入异常的密码(123456789) Thread . sleep ( 2000 ); driver . findElementById ( "com.tencent.qqlite:id/password" ). click (); driver . findElementById ( "com.tencent.qqlite:id/password" ). sendKeys ( "123456789" ); //步骤4:点击登录按钮 driver . findElementByAccessibilityId ( "登录QQ" ). click (); //为了能够正常地跳转到验证码页面,又添加了一个强制线程的等待 //Thread.sleep(8000); //滑动验证码的图标到相应的位置 //driver.swipe(169, 334, 347, 344, 3000); //符合qq的组成规范的号码不一定是qq号码,需要断言一下 boolean flag = driver . findElementByAndroidUIAutomator ( "text('登录失败')" ). isDisplayed (); if ( flag == true ){ System . out . println ( "测试用例通过" ); }
}
catch ( Exception e ) { System . out . println ( "测试用例不通过" ); }
finally { driver . quit (); }
}
}
使用java+junit单元测试框架进行重构
package com.qf ; import static org.junit.Assert.* ; import java.net.MalformedURLException ; import java.net.URL ; import java.util.concurrent.TimeUnit ; import org.junit.Before ; import org.junit.BeforeClass ; import org.junit.Test ; import org.openqa.selenium.remote.DesiredCapabilities ; import io.appium.java_client.AppiumDriver ; /* * * 1、构建的被测试对象的类(键值对),是比较固定,所有的相关测试用例都是一样的,我可以把他放在5个方法中的哪一个比较合适?@BeforeClass * * */ public class QQLoginUnit { //需要将des声明为成员变量,如果一个变量想在静态方法中使用,则该变量必须也是静态的 //一个静态的变量,能不能在一个普通成员方法中使用呢?是可以的 public static DesiredCapabilities des ; @BeforeClass public static void beforeClassss (){ //创建对象,des在方法中,就是局部变量,没办法跨方法使用 des = new DesiredCapabilities (); //设置des的键值对 des . setCapability ( "platformName" , "Android" ); des . setCapability ( "platformVersion" , "5.1.1" ); des . setCapability ( "deviceName" , "Android Emulator" ); des . setCapability ( "noReset" , true ); //获取包名及第一个页面的activity des . setCapability ( "appPackage" , "com.tencent.qqlite" ); des . setCapability ( "appActivity" , "com.tencent.mobileqq.activity.SplashActivity" ); }
@Before public void before (){ }
//测试qq号码////符合qq的组成规范的号码不一定是qq号码 @Test public void test_Login_UserName_true_1 () { AppiumDriver driver = null ; try { driver = new AppiumDriver ( new URL ( "http://127.0.0.1:4723/wd/hub" ), des ); driver . manage (). timeouts (). implicitlyWait ( 10 , TimeUnit . SECONDS ); //步骤1:点击首页的登录按钮 driver . findElementById ( "com.tencent.qqlite:id/btn_login" ). click (); //步骤2:在登录页面用户名文本框中输入qq号码 driver . findElementByAccessibilityId ( "请输入QQ号码或手机或邮箱" ). clear (); driver . findElementByAccessibilityId ( "请输入QQ号码或手机或邮箱" ). sendKeys ( "2572652583" ); //步骤3:在登录页面密码文本框中输入异常的密码(123456789) Thread . sleep ( 2000 ); driver . findElementById ( "com.tencent.qqlite:id/password" ). click (); driver . findElementById ( "com.tencent.qqlite:id/password" ). sendKeys ( "123456789" ); //步骤4:点击登录按钮 driver . findElementByAccessibilityId ( "登录QQ" ). click (); //为了能够正常地跳转到验证码页面,又添加了一个强制线程的等待 //Thread.sleep(8000); //滑动验证码的图标到相应的位置 //driver.swipe(169, 334, 347, 344, 3000); //符合qq的组成规范的号码不一定是qq号码,需要断言一下 boolean flag = driver . findElementByAndroidUIAutomator ( "text('登录失败')" ). isDisplayed (); ) assertEquals ( flag , true ); }
catch ( Exception e ) { System . out . println ( "测试用例不通过" ); }
finally { driver . quit (); }
}
}
5、运行脚本
main()方法中右键,选择run as->java application,运行脚本。
模拟器中按照设定的测试用例步骤执行。
欢迎关注作者,如果觉得写的还不错,就给点个赞同、喜欢、收藏(后续持续更新)。
【全文手打 如需转载 请标注此出处】