[AP_08] Appium元素定位01:id定位&检测元素存在性 | APP自动登录案例实践

目录结构

一、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

[AP_08] Appium元素定位01:id定位&检测元素存在性 | APP自动登录案例实践_第1张图片

方式①:UI Automator定位元素

[AP_08] Appium元素定位01:id定位&检测元素存在性 | APP自动登录案例实践_第2张图片

方式②:Appium启动Inspector后利用Select Elements定位元素

[AP_08] Appium元素定位01:id定位&检测元素存在性 | APP自动登录案例实践_第3张图片

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)在登录界面输入[用户名+密码],然后点击登录

需求分析:
  1. 将启动后检测升级弹窗、跳出引导页面,作为独立的模块进行抽离,让其他模块来调用,从而提高代码复用率
  2. 获取用户名和密码输入框、登录按钮所对应的元素id属性。另外要考虑启动时App之前是否有登录过账号,已登录过和从未登录过对应的操流程是不一样的
    从未登录过被测APP:启动APP->点击【取消升级】->点击【跳过】->输入用户名+密码,点击【登录】按钮
    已有登录过被测APP:启动APP->点击【跳过】->点击【我的】->点击【未登录】->输入用户名+密码,点击【登录】按钮
  3. 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

[AP_08] Appium元素定位01:id定位&检测元素存在性 | APP自动登录案例实践_第4张图片
[AP_08] Appium元素定位01:id定位&检测元素存在性 | APP自动登录案例实践_第5张图片

你可能感兴趣的:([AP_08] Appium元素定位01:id定位&检测元素存在性 | APP自动登录案例实践)