1.获取driver属性
- current_package,包名,aapt,元素定位给
- current_activity,后面切换有用,==>url
- context,上下文,web窗口切换,h5测试,获取上下文,driver.switch_to.context
- contexts,所有的上下文,==>window_handlers
- current_context,获取现在的上下文,获取当前窗口current_window_handler
- page_source,源代码,html,driver.page_source
- capabilities
- device_time,设备时间
- location,定位
# 获取现在的app页面的名称
print(driver.current_activity)
# 获取现在的app页面的源代码 xml
print(driver.page_source)
# 定位
print(driver.location)
# 获取caps参数信息
print(driver.capabilities)
# 获取窗口大小,屏幕尺寸
print(driver.get_window_size())
2.获取元素属性
- el.rect,获取元素的尺寸,包括元素的宽度高度和起始点的坐标
- el.text,获取元素的文本
- el.get_attribute(),获取元素的属性值
el = driver.find_element("id", "com.lemon.lemonban:id/navigation_my")
# 获取元素的文本
print(el.text)
# 获取元素的尺寸,包含元素的高度宽度和起始点的坐标
print(el.rect)
3.用户操作
- el.click()
- el.send_keys(),注意,appium中输入中文,必须要配置caps中的参数
"unicodeKeyboard": True, "resetKeyboard": True, 使用真机操作时,需要修改手机配置的输入法后再进行输入
4.触屏操作
- tap,相当于全局的click,适合封装在basepage中
- move_to
- press
- long_press
- release
- wait
- flick
5.swipe滑动
- driver.swipe()
在 Appium 中提供 swipe() 方法来模拟用户滑动屏幕。
swipe() 实现过程 是先通过在屏幕上标记两个坐标,然后再从开始坐标移动到结束坐标。
time.sleep(10)
# 滑动操作
# get_window_size()获取屏幕尺寸
width = driver.get_window_size()['width']
height = driver.get_window_size()['height']
driver.swipe(start_x=width * 0.9, start_y=height * 0.5, end_x=width * 0.1, end_y=height * 0.5)
driver.swipe(start_x=width * 0.9, start_y=height * 0.5, end_x=width * 0.1, end_y=height * 0.5)
driver.swipe(start_x=width * 0.9, start_y=height * 0.5, end_x=width * 0.1, end_y=height * 0.5)
封装basepage代码:
class Page:
def __init__(self, driver):
self.driver = driver
def width(self):
"""获取app的宽度"""
return self.driver.get_window_size()['width']
def height(self):
"""获取app的高度"""
return self.driver.get_window_size()['height']
def swipe_left(self):
"""从右往左滑动"""
width = self.width()
height = self.height()
self.driver.swipe(start_x=width * 0.9, start_y=height * 0.5, end_x=width * 0.1, end_y=height * 0.5)
def swipe_right(self):
"""从左往右滑动"""
width = self.width()
height = self.height()
self.driver.swipe(start_x=width * 0.1, start_y=height * 0.5, end_x=width * 0.9, end_y=height * 0.5)
def swipe_up(self):
"""从下往上滑动"""
width = self.width()
height = self.height()
self.driver.swipe(start_x=width * 0.5, start_y=height * 0.9, end_x=width * 0.5, end_y=height * 0.1)
def swipe_down(self):
"""从上往下滑动"""
width = self.width()
height = self.height()
self.driver.swipe(start_x=width * 0.5, start_y=height * 0.1, end_x=width * 0.5, end_y=height * 0.9)
调用封装方法:
Page(driver).swipe_left()
6.按键操作
先通过功能查对应的事件数字
driver.press_keycode(8)
按键的数字代表的意义可参考:
Appium---Android的keycode键值 - 简书
但是这样可读性很差,谁知道这个数字具体是什么意思呢?可以进行封装,增强可读性:
封装类:
class MobileKey:
ENTER = 66
VOLUME_UP = 24
HOME = 3
调用封装类及属性:
driver.press_keycode(MobileKey.VOLUME_UP)
7.toast弹框
前提
登录:Toast是viewer识别不到的,但是我们需要确认文本是否正确。
- appium server 1.6.3以上
- 代码中必须定制automationName为:UiAutomator2
- UiAutomator2只支持安卓版本5.0+
- jdk1.8 64位以上,配置JAVA_HOME环境变量
定位表达式
- xpath定位://*[contains(@text,'手机号码格式不正确')]
- find_element("xpath","//android.widget.Toast")
# 出现toast弹框
el = driver.find_element('xpath', '//android.widget.Toast')
assert el.text == "手机号码格式不正确"
8.start_activity进入页面
app的路径依赖是很严重的,如果需要测试某个单纯的页面,但是进入这个页面有很长的路径,则会严重影响效率,而且路径过长,会让测试程序不稳定。
start_activity可以快速进入指定界面,只需要指定activity的名称。
获取当前页面的名称:
adb shell dumpsys activity | find "mResumedActivity"

driver.start_activity('com.lemon.lemonban','.activity.LoginActActivity')
9.混合应用测试Hybrid App
原生应用是使用系统原生的组件开发的app,需要特定的语言,比如android的java,ios的swift。
H5技术可以使用web技术开发app,原生和h5的组合就成了混合应用。
混合应用不是在app上直接写html页面,而是把H5页面放在一个webview控件当中。
webview是原生应用的一种控件,还有其他的imageview等等。webview能做到和web页面交互的功能。
常用的混合应用技术框架有:
- Cordova Apache
- React Native,RN
- Ionic
- Flutter,谷歌出的
如何判断进入一个web网页:
- 进度条
- 下拉页面,背面会出现一个网址
- 有 X 图标
- 通过辅助工具观察class是否为webview
- 通过远程的网页定位工具(1.谷歌浏览器输入chrome://inspect;2.uc-devtools UC 开发者调试工具及使用;3.edge浏览器输入edge://inspect;三种都可以)是发现是不是进入webview最可靠的工具
注意点:
使用uc-devtools工具时【设置】选择:本地 Devtools Inspector UI 资源
混合应用测试准备条件:
- apk设置,找开发开启webview调试模式。app设置setWebContentsDebuggingEnabled=True
- Webdriver/chromedriver.exe(安卓内置谷歌内核,网页定位工具有显示手机端浏览器的版本号,下载的驱动版本号需要与手机端保持一致)

- 调试工具
测试的步骤:
- 先是原生界面的操作
- 某个时刻,进入了webview,此时就需要进行切换,从原生到webview
- 进行网页操作
- 退回到原生环境,webview切换到原生界面
案例:
import time
from appium.webdriver import Remote
caps = {
"platformName": "Android",
"udid": "emulator-5554",
"app": r"D:\lemon_app_webview_debug.apk",
"chromedriverExecuteDir": r"D:\PycharmProjects\chromedriver"
}
driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',
desired_capabilities=caps)
# 隐性等待
driver.implicitly_wait(10)
# 找到师资团队的按钮
driver.find_element('xpath', '//*[@text="师资团队"]').click()
# 进入到webview网页环境
print(driver.contexts)
driver.switch_to.context("WEBVIEW_com.lemon.lemonban")
# driver.switch_to.context(driver.contexts[-1])
# 切换到的webview环境,此时driver表示浏览器
driver.find_element('xpath', "//*[@id='m-header__nav']").click()
time.sleep(3)
driver.quit()
注意事项:
- chromedriver根据版本下载到某个目录
- caps中使用属性chromedriverExecuteDir指定驱动的目录,如
"chromedriverExecuteDir": r"D:\PycharmProjects\chromedriver"
- 当从原生进入到网页后,driver.switch_to.context()完成切换操作
小程序和公众号(嵌入到微信的网页):
- 在微信的原生页面操作
- 当点击进入小程序后,进行小程序环境(网页)
- 切换 driver.switch_to.context()
- 网页的自动化测试
10.总结appium操作app的重点
- 元素定位,id,text,xpath,例外:toast
- 辅助工具,appium inspector,uiautomatorviewer
- 点击,输入操作,swipe(封装),toast,start_activity
- 混合应用
本文详细介绍了使用Appium进行自动化测试时的关键操作,包括获取driver属性、元素属性、用户操作、触屏操作、滑动、按键操作、处理toast弹框、启动活动及混合应用测试。讲解了各种操作的实现方式和实用技巧,例如通过driver属性获取设备信息,利用send_keys输入中文,使用swipe进行滑动,以及如何识别和操作混合应用中的webview。

727

被折叠的 条评论
为什么被折叠?



