Hi 各位,通过Appium+Python+Android-sdk 实现APP简单的登录测试功能。登录功能面临的情况比较多,在进行编写脚本之前应根据需求尽可能考虑全面。
以下就是本人的登录测试,望各位大佬多多指教。
1.获取设备信息,连接手机,打开指定APP
self.desired_caps = {
# 被测手机的系统
"platformName": "Android",
# 被测手机的版本号
"platformVersion": "11",
# 被测手机名称
"deviceName": "Redmi_K20_Pro",
# 指定被测软件包名
"appPackage": "com.lstech.rehealth",
# 指定要打开的APP页面是哪一个
"appActivity": "com.lstech.useraccount.pages.login.LoginActivity",
"automationName": "Uiautomator2",
# 设置apk的重置策略(noReset--不停止应用程序,不清除应用数据,不卸载apk)
"noReset": True,
# 设置命令的超时时间
"newCommandTimeout": 600000,
# 设置用于中文输入,appium默认不支持中文输入
"unicodeKeyboard": True,
"resetKeyboard": True,
}
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', self.desired_caps)
2.错误账号或者错误密码的全部情况
为了减少代码量,把输入错误账号或者错误密码的全部情况进行封装,后期直接循环调用
#验证用户名或者密码错误时
self.circulation={
('155****1363','L','密码输入错误,需要6–14个字符、数字加字母'), #输入不规范的密码,判断toast是否符合预期效果
('155****1363','HHHaisi12','密码不正确'), #输入正确的账号,错误的密码(密码符合规范),判断toast是否符合预期效果
('132****1949','HHHaisi12','用户不存在,请先注册账户'), # 输入没有注册的账号,符合规范的密码,判断是否符合预期效果
('132****1949','L','密码输入错误,需要6–14个字符、数字加字母'), # 输入没有注册的账号,不符合规范的密码,判断是否符合预期效果
('132****19','HHHaisi12','请输入正确的手机号'), # 输入不符合规范的账号,符合规范的密码,判断是否符合预期效果
('132****19','L','请输入正确的手机号') # 输入不符合规范的账号,不符合规范的密码,判断是否符合预期效果
}
3.根据上面的封装执行当密码错误或者账号错误的各种形式。
当输入错误的账号或者密码时根据Android的toast提示框来进行判断当前操作是否符合预期效果,拿获取本次操作的toast提示内容与需求内容进行对比。
def test_Login_failed(self):
self.driver.find_element('id', 'com.lstech.rehealth:id/agreementCheck').click() # 勾选协议
for data in self.circulation:
self.driver.find_element('id','com.lstech.rehealth:id/phoneNumber').click() #点击用户名输入框
self.driver.find_element('id','com.lstech.rehealth:id/phoneNumber').clear() #点击用户名输入框清空里面内容
self.driver.find_element('id','com.lstech.rehealth:id/phoneNumber').send_keys(data[0]) #输入用户名
self.driver.find_element('id','com.lstech.rehealth:id/passwordInput').click() #点击密码输入框
self.driver.find_element('id','com.lstech.rehealth:id/passwordInput').clear() #点击密码输入框清空里面内容
self.driver.find_element('id','com.lstech.rehealth:id/passwordInput').send_keys(data[1]) #输入密码
self.driver.find_element('id','com.lstech.rehealth:id/loginButton').click() #点击登录按钮
# 获取toast提示
time.sleep(0.5)
self.assertIsNotNone(self.driver.find_element(AppiumBy.XPATH, "//*[@class="android.widget.Toast"]").text,data[2])
print(data[2])
4.当输入正确的账号,密码时判断是否成功登录。
根据获取的主页用户名来判断输入的账号密码是否登录成功。
#输入正确的账号,密码,判断是否可以登录成功
def test_login_Username_Password(self):
self.driver.find_element('id','com.lstech.rehealth:id/agreementCheck').click() #勾选协议
self.driver.find_element('id','com.lstech.rehealth:id/phoneNumber').click() #点击用户名输入框
self.driver.find_element('id','com.lstech.rehealth:id/phoneNumber').send_keys('155****1363') #输入用户名
self.driver.find_element('id','com.lstech.rehealth:id/passwordInput').click() #点击密码输入框
self.driver.find_element('id','com.lstech.rehealth:id/passwordInput').send_keys('HHisi123') #输入密码
self.driver.find_element('id','com.lstech.rehealth:id/loginButton').click() #点击登录按钮
time.sleep(2)
self.assertIsNotNone(self.driver.find_element('id','com.lstech.rehealth:id/tv_account'),'Hi~派7VYG') #判断主页获取的用户名是否与预期用户名一致
print('登录成功!!')
# #调用退出函数
self.Log_Out()
5.当用户名或者密码为空时判断登录按钮状态是否符合预期效果。
用户名或者密码有一项或者两项都为空时,此时登录按钮状态为不可点击状态,通过判断登录按钮的状态来进行验证,
# 输入空的账号,空的密码,判断是否符合预期效果
def test_login_EmptyUsername_EmptyPassword(self):
self.driver.find_element('id', 'com.lstech.rehealth:id/agreementCheck').click() #勾选协议
self.driver.find_element('id', 'com.lstech.rehealth:id/phoneNumber').click() #点击用户名输入框
self.driver.find_element('id', 'com.lstech.rehealth:id/phoneNumber').send_keys('') #输入空的用户名
self.driver.find_element('id', 'com.lstech.rehealth:id/passwordInput').click() #点击密码输入框
self.driver.find_element('id', 'com.lstech.rehealth:id/passwordInput').send_keys('') #输入空的密码
self.assertTrue(self.driver.find_element('id', 'com.lstech.rehealth:id/loginButton').is_enabled()) #来判断登录按钮的状态是否符合预期效果
print('未输入账号或者密码登录按钮为不可点击状态')
6.通过手机验证码来进行登录。
验证码登录主要问题就是获取验证码比较困难,本人采用的是直接去消息通知里面找到验证码信息,为了避免被其他信息干扰,需在获取验证码之前把通知列表里面清空一下,找到验证码短信并对验证码进行截取(APP验证码短信长度都是一致。可以直接根据下标进行截取,保留需要的六位验证码)
#验证码登录
def test_login_Verification_Code(self):
self.driver.find_element('id', 'com.lstech.rehealth:id/agreementCheck').click() #勾选协议
self.driver.find_element('id','com.lstech.rehealth:id/refMode').click() #点击验证码登录
self.driver.find_element('id','com.lstech.rehealth:id/phoneNumber').click() #点击手机输入框
self.driver.find_element('id','com.lstech.rehealth:id/phoneNumber').send_keys('155****1363') #输入手机号
self.driver.swipe(167, 35, 167, 454) #下拉屏幕拉出消息通知页面
self.driver.find_element('id','com.android.systemui:id/dismiss_view').click() #接收验证码前情空消息通知里面内容
self.driver.find_element('id','com.lstech.rehealth:id/loginButton').click() #点击获取验证码
time.sleep(15) #等待15s,等待验证码
self.driver.swipe(167, 35, 167, 454) #下拉屏幕拉出消息通知页面
VC=self.driver.find_element('id','com.android.systemui:id/text') #获取消息通知验证码内容
print("短信内容是:",VC)
# 截验证码
YZM = VC[10:14] #截取验证码,只保留六位验证码数字
self.driver.find_element('id', 'com.android.systemui:id/dismiss_view').click() #点击清空按钮后回到输入验证码页面
self.driver.find_element('id','com.lstech.rehealth:id/verify_input').send_keys(YZM) #输入验证码
self.driver.find_element('id','com.lstech.rehealth:id/login_button').click() #点击登录
self.assertIsNotNone(self.driver.find_element('id','com.lstech.rehealth:id/tv_account'),'Hi~派7VYG') #判断通过验证码是否成功登录
7.通过QQ,微信等软件账号进行登录
当选择QQ微信等软件进行登录时,只需要跳转到对应APP进行一个登录授权操作即可.
#通过QQ登录
def test_QQLogin(self):
self.driver.find_element('id', 'com.lstech.rehealth:id/agreementCheck').click() #勾选协议
self.driver.find_element('id','com.lstech.rehealth:id/qqLogin').click() #选择QQ登录
time.sleep(2)
self.driver.find_element('id','com.tencent.mobileqq:id/fds').click() #点击 同意登录
time.sleep(5)
self.assertIsNotNone(self.driver.find_element('id', 'com.lstech.rehealth:id/tv_account'),
'Hi~浊酒爱空投') # 判断是否登录成功
print('登录成功!!')
#调用退出函数
self.Log_Out()
8.验证当QQ微信等软件未安装时,选择该软件登录时效果是否正确
主要还是通过toast框来判断情况是否与预期效果一致(以微博为例)。
#验证没有安装(微信,QQ,微信)toas弹框是否正确
def test_No(self):
self.driver.find_element('id', 'com.lstech.rehealth:id/agreementCheck').click() #勾选协议
self.driver.find_element('id','com.lstech.rehealth:id/weiboLogin').click() #选择微博登录
# 获取toast提示
self.assertIsNotNone(self.driver.find_element(AppiumBy.XPATH, "//*[@class="android.widget.Toast"]").text,
'请先安装应用')
print('未安装应用!')
9.通过邮箱账号进行登录
邮箱登录整体操作与账户密码基本一致,只是多了一个点击邮箱登录的操作
#通过邮箱登录
def test_EmailLogin(self):
self.driver.find_element('id', 'com.lstech.rehealth:id/agreementCheck').click() #勾选协议
self.driver.find_element('id','com.lstech.rehealth:id/emailLogin').click() #选择邮箱登录
self.driver.find_element('id','com.lstech.rehealth:id/email').click()
self.driver.find_element('id','com.lstech.rehealth:id/email').send_keys('y159****8851@163.com') #输入邮箱账号
self.driver.find_element('id', 'com.lstech.rehealth:id/passwordInput').click()
self.driver.find_element('id', 'com.lstech.rehealth:id/passwordInput').send_keys('******AAA') # 输入邮箱密码
self.driver.find_element('id','com.lstech.rehealth:id/loginButton').click() #点击登录按钮
time.sleep(2)
self.assertIsNotNone(self.driver.find_element('id', 'com.lstech.rehealth:id/tv_account'),
'Hi~派6zLT') # 判断是否登录成功
print('登录成功!!')
# #调用退出函数
self.Log_Out()
10.最后一个验证当用户没有勾选协议按钮时实际效果是否与预期效果一致
# #验证没有勾选协议时toast提示是否正确
def test_Agreement(self):
self.driver.find_element('id', 'com.lstech.rehealth:id/phoneNumber').click()
self.driver.find_element('id', 'com.lstech.rehealth:id/phoneNumber').send_keys('155****1363')
self.driver.find_element('id', 'com.lstech.rehealth:id/passwordInput').click()
self.driver.find_element('id', 'com.lstech.rehealth:id/passwordInput').send_keys('HHHaisi123')
self.driver.find_element('id', 'com.lstech.rehealth:id/loginButton').click()
# 获取toast提示
self.assertIsNotNone(self.driver.find_element(AppiumBy.XPATH, "//*[@class="android.widget.Toast"]").text,
'先勾选下方协议再继续')
print('未勾选协议!!')
11.通过HTMLTestRunner来获取测试报告



