目录结构
一、Appium元素定位概述
1. 元素定位
2. id定位
3. 元素定位:id定位测试场景
4. 检测定位元素的存在性
二、id定位综合实践:自动登录APP
一、Appium元素定位概述
1. 元素定位
同Web自动化测试(如:Selenium+Python)类似,APP自动化测试(如:Appium+Python)过程中最重要的一个环节就是元素定位,只有准确定位到元素才能进行相关元素的操作(输入、点击、拖拽、滑动)
对比参考:Selenium WebDriver定位元素的9种方式及操作
appium提供了元素定位的多种方法:id定位、name定位、class定位、层级定位...
元素定位方式:
- id定位
- name定位
- class定位
- List定位
- 相对定位
- Xpath定位
- H5页面元素定位
- UIAutomator定位
2. id定位
在app界面元素中,可使用id值来区分不同的元素,然后进行定位操作。Appium可使用find_element_by_id()
方法进行id定位
3. 元素定位:id定位测试场景
测试场景:
(1)安装指定APP到移动设备中
(2)在升级提示页面点击【取消升级】按钮(旧版本才会出现此页面,最新版本无此验证)
(3)在引导页面点击【跳过】按钮(首次启动APP才会出现此页面,再次启动则不会出现)
kaoyan_skip_cancel.py
from appium import webdriver
# 定义字典,存储capabilities配置信息
desired_caps={}
# 移动设备信息-1(Android模拟器)
desired_caps['platformName']='Android'
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platformVersion']='5.1.1'
# 移动APP应用信息
desired_caps['app']=r'C:\Users\Administrator\Desktop\kaoyanbang_3.3.7beta.243.apk'
desired_caps['appPackage']='com.tal.kaoyan'
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
# 连接远程服务器,监听端口,开启会话
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(10) # 等待时间
# 点击升级【取消】按钮,不作APP升级
driver.find_element_by_id('android:id/button2').click()
# 点击【跳过】按钮,直接进入登录界面
driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
定位方式:
在已连接移动设备的基础之上,利用UI Automator进行元素定位,也可使用Appium的Inspector定位元素,但不建议2个工具同时启用定位,有可能会引起冲突or异常
定位操作:
连接Android模拟器:adb connect 127.0.0.1:62001
检查当前连接的设备:adb devices
方式①:UI Automator定位元素
方式②:Appium启动Inspector后利用Select Elements定位元素
4. 检测定位元素的存在性
from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
import time
# 定义字典,存储capabilities配置信息
desired_caps={}
# 移动设备信息(Android模拟器)
desired_caps['platformName']='Android'
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platformVersion']='5.1.1'
# 移动APP应用信息
desired_caps['app']=r'C:\Users\Administrator\Desktop\kaoyanbang_3.3.7beta.243.apk'
desired_caps['appPackage']='com.tal.kaoyan'
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
# 连接远程服务器,监听端口,开启会话
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
# driver.implicitly_wait(50) # 等待时间(隐式)
time.sleep(50)
# 定义点击取消升级按钮的方法
def check_cancelBtn():
print('check cancel Button')
try:
cancelBtn=driver.find_element_by_id('android:id/button2')
except NoSuchElementException:
print('no cancel button')
else:
cancelBtn.click()
# 定义点击跳过引导页的方法
def check_skipBtn():
print('check skip Button')
try:
skipBtn=driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
except NoSuchElementException:
print('no skip button')
else:
skipBtn.click()
# 调用函数
check_cancelBtn()
check_skipBtn()
执行结果:
以上,安装的是最新版本的被测APP,故没有捕获到取消升级的提醒元素,而捕获到了跳过引导页的元素并点击实现页面跳过,直接进入到登录界面
PS:在Android模拟器上执行代码前,根据需要可能先要删除已安装的被测APP、Appium settings
二、id定位综合实践:自动登录APP
场景描述:
(1)启动App,进入到登录界面
(2)在登录界面输入[用户名+密码],然后点击登录
需求分析:
- 将启动后检测升级弹窗、跳出引导页面,作为独立的模块进行抽离,让其他模块来调用,从而提高代码复用率
- 获取用户名和密码输入框、登录按钮所对应的元素id属性。另外要考虑启动时App之前是否有登录过账号,已登录过和从未登录过对应的操流程是不一样的
① 从未登录过被测APP:启动APP->点击【取消升级】->点击【跳过】->输入用户名+密码,点击【登录】按钮
② 已有登录过被测APP:启动APP->点击【跳过】->点击【我的】->点击【未登录】->输入用户名+密码,点击【登录】按钮 - send_keys() 传入中文时需要在capability中配置如下内容:
desired_caps['unicodeKeyboard']="True"
desired_caps['resetKeyboard']="True"
键 | 描述 |
---|---|
unicodeKeyboard | 使用 Unicode 输入法。 默认值为 false |
resetKeyboard | 在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态。如果单独使用,将会被忽略。默认值为 false |
以上设置完成之后,会有Appium的输入法守护来执行输入操作
代码实现:
2个模块:capability.py、kaoyan_login.py(位于同一个目录之下)
capability.py
实现:capabilities配置、登录前的页面处理(取消升级、跳过引导页面)
from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
# 定义字典,存储capabilities配置信息
desired_caps={}
# 移动设备信息(Android模拟器)
desired_caps['platformName']='Android'
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platformVersion']='5.1.1'
# 设置键盘输入法Unicode格式
desired_caps['unicodeKeyboard']='True'
desired_caps['resetKeyboard']='True'
# 重置登录状态(每次都需要输入[用户名+密码]登录)
desired_caps['noReset']='False'
# 移动APP应用信息
desired_caps['app']=r'C:\Users\Administrator\Desktop\kaoyanbang_3.3.7beta.243.apk'
desired_caps['appPackage']='com.tal.kaoyan'
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
# 连接远程服务器,根据配置开启会话
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(10) # 等待时间(隐式)
# 定义点击取消升级按钮的方法
def check_cancelBtn():
print('check cancel Button')
try:
cancelBtn=driver.find_element_by_id('android:id/button2')
except NoSuchElementException:
print('no cancel button')
else:
cancelBtn.click()
# 定义点击跳过引导页的方法
def check_skipBtn():
print('check skip Button')
try:
skipBtn=driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
except NoSuchElementException:
print('no skip button')
else:
skipBtn.click()
# 调用函数
check_cancelBtn()
check_skipBtn()
kaoyan_login.py
实现:引导进入登录界面,输入[用户名+密码],提交登录
from capability import driver,NoSuchElementException
# 定义登录方法
def login():
# 定位用户名输入框,清空输入框中的原有内容,再输入新的用户名
username=driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
username.send_keys('xxxxx')
# 定位密码输入框,输入密码
password=driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('yyyyy')
# 定位登录按钮,点击
driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()
# 设置已有登录的场景处理
try:
myBtn=driver.find_element_by_id('com.tal.kaoyan:id/mainactivity_button_mysefl') # 定位【我】按钮
nonLg=driver.find_element_by_id('com.tal.kaoyan:id/activity_usercenter_username') # 定位【未登录】按钮
except NoSuchElementException:
login() # 没有获取到【我】【未登录】元素时,执行常规登录方法
else:
myBtn.click() # 点击【我】按钮
nonLg.click() # 点击【未登录】按钮
login() # 进入登录界面,调用常规登录方法执行登录
执行命令:python kaoyan_login.py
执行结果:自动登录OK
网友评论