书接上回Appium高级操作--从源码角度解析--模拟复杂手势操作-CSDN博客文章浏览阅读712次,点赞24次,收藏6次。下面总结Appium模拟复杂手势整体流程创建类实例action时,一定要传入WebDriver实例参数,创建实例成功后,调用属性(实例)将devices置为空列表,不使用默认的[mouse, keyboard, wheel],因为客户端鼠标操作子类型为touch不能使用mouse调用的方法将新输入源加入到devices列表中,并返回XXXInput类的新输入源调用新输入源(new_input)的各种操作方法(例如鼠标按下按钮,释放按钮,鼠标移动等)(这块源码就不细讲了可以自行查看)https://blog.csdn.net/fantasy_4/article/details/146154955,从源码的角度讲解了Appium模拟复杂手势的高级操作,使用的是WebDriver 提供的一种更底层的指针交互方法,适合更精细化的手势操作。本片文章主要讲解其他高级操作,适用于一般手势操作,ActionChains类自带的操作方法,手机系统API的操作,toast元素识别,Hybrid APP操作等。
1.ActionChains类方法
ActionChains类自带的操作方法很多,也可以完成轻击,长按,拖拽等操作,只介绍部分方法或者方法组合操作,其他方法可自行查看方法源码。PS:源码写的注释非常非常非常非常清晰!!!!!是可以拿来练习读源码的入门教材!!!!!!!
注意📢:所有操作都需要调用perform()
方法执行
-
手指短暂轻击
click()
python"> login_id = 'new UiSelector().resourceId("com.sankuai.movie:id/dt8")'ele1 = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, login_id)ActionChains(driver).click(ele1).perform();
-
手指快速双击
double_click()
python"># 双击图片放大photo_id = 'new UiSelector().resourceId("com.sankuai.movie:id/dt8")'ele4 = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, photo_id)ActionChains(driver).double_click(ele4).perform()
-
手指长按
click_and_hold()
手指抬起release()
手指暂停pause()
python"> text = 'new UiSelector().text("收藏")'ele2 = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, text)# 手指点击并且按下ActionChains(driver).click_and_hold(ele2).perform()# 手指暂挺0.2秒,模拟长按ActionChains(driver).pause(0.2).perform() # 手指抬起ActionChains(driver).release(ele2).perform()
-
手指移动具体位置
move_to_element_with_offset()
手指移动到某一元素位置move_to_element()
python"> # 手指移动到具体坐标位置size = driver.get_window_size()ActionChains(driver).move_to_element_with_offset(xoffset=size['width']*0.5, yoffset=size['height']*0.5).perform()# 手指移动到某一元素位置login_id = 'new UiSelector().resourceId("com.sankuai.movie:id/dt8")'ele3 = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, login_id)ActionChains(driver).move_to_element(ele3).perform()
2.Toast元素识别
Toast是Android系统提供的轻量级信息提醒机制,用于向用户提示即时消息。
它不会打断当前操作,并且它永远不会获得焦点,无法被单击,必须使用XPath来查找。以下是两种查找方案。
-
//*[@class='android.widget.Toast']
-
"//*contains(@text, 'toast上的文字')"
python"> driver.find_element(AppiumBy.XPATH, "//*[@class='android.widget.Toast']")
driver.find_element(AppiumBy.XPATH, "//*contains(@text, '手机号不合法')")
3.Hybrid App操作
对于APP中的H5页面元素的是基于B/S架构,不是基于APP原生控件,所以需要先切换上下文(Context)即当前所属的不同切换环境,然后在进行元素定位。切换Context需要环境准备,然后才能切换。
3.1环境准备
-
安装软件的测试包(最好是测试包,可以直接打开webView的debug模式)
-
模拟器或者真机通过USB连接到PC,并且ADB可调试
-
移动端、PC装有Chrome浏览器
-
移动端必须要装有与WebView版本对应的ChromeDriver
-
开启Webview调试模式
WebView.setWebContentsDebuggingEnabled(true);
一般需要需要H5前端开发人员帮忙
3.2检查App WebView调试模式是否开启
chrome浏览器打开chrome://inspect可以看到Remote Target,
此时在手机端打开webview页面,则如下图展示:
3.3Context相关方法
python">WebDriverWait(driver,10).until(lambda x:x.find_element(AppiumBy.CLASS_NAME, "android.webkit.WebView"))
# 获取当前Context
driver.current_context
# 获取所有Contexts
driver.contexts
# 切换到某一Context
driver.switch_to.context()
4.手机系统API的操作
4.1屏幕截图
-
save_screenshot()
截图保存到指定目录,只能保存成PNG格式 -
get_screenshot_as_file()
截图保存到制定目录,可以保存成多种格式JPG,PNG等 -
get_screenshot_as_png()
以二进制方式获取当前窗口截图 -
get_screenshot_as_base64()
以Base64编码字符串的形式获取当前窗口截图
特性 | get_screenshot_as_file | save_screenshot(filename) |
---|---|---|
是否需要检查返回值 | 需要检查返回值 | 无需检查返回值 |
文件格式 | 支持多种格式(通过文件扩展名指定) | 仅支持 PNG 格式 |
使用方便性 | 较低,因为需要检查返回值 | 更低,因为无需额外处理 |
适用场景 | 需要保存为其他格式(如 JPEG)的场景 | 只需保存为 PNG 格式的场景 |
特性 | get_screenshot_as_png() | get_screenshot_as_base64() |
---|---|---|
返回值类型 | bytes 类型的数据 | str 类型的字符串 |
数据格式 | PNG 格式 | Base64 编码的字符串 |
适用场景 | 适用于需要将截图保存为文件或进行进一步处理的场景 | 将截图嵌入到文本格式(如 HTML 报告或日志)中的场景 |
python"> # 直接保存当前截图到指定目录driver.save_screenshot('/Users/XXXX/Documents/homepage1.png')sleep(3)# 有返回值re = driver.get_screenshot_as_file('/Users/XXXX/Documents/homepage.png')print(re)sleep(4)# 适用于需要将截图保存为文件或进行进一步处理的场景 有返回值driver.get_screenshot_as_png()
#适用于需要将截图嵌入到文本格式(如 HTML 报告或日志)中的场景,有返回值driver.get_screenshot_as_base64()
4.2 发送键到设备
driver.press_keycode
用于发送 Android 设备的按键事件
适用场景:很多应用有按两次返回键退出应用的功能
http://developer.android.com/reference/android/view/KeyEvent.html.官网可以查看keycode对应含义
python"> # 音量增加键 driver.press_keycode(24)# 返回键driver.press_keycode(4)# 音量减少键driver.press_keycode(25)
Keycode | 描述 |
---|---|
24 | 音量增加键 |
25 | 音量减少键 |
3 | Home 键 |
4 | 返回键 |
82 | 菜单键(长按) |
26 | 电源键 |
19 | 上方向键 |
20 | 下方向键 |
21 | 左方向键 |
22 | 右方向键 |
23 | 确认键(如 Enter 键) |
66 | 回车键 |
67 | 退格键(Backspace) |
4.3操作手机通知栏
driver.open_notifications()
下拉通知栏
使用场景:查看通知栏消息
python">driver.open_notifications()
# 输入keycode,根据keycode做对应操作,4:表示返回键
# 表示上拉通知栏
driver.press_keycode(4)
4.4息屏亮屏
-
driver.lock()
息屏 -
driver.unlock()
亮屏 -
driver.is_locked()
返回当前屏幕状态
python"> driver.lock(10)
sleep(3)
driver.unlock()
# 返回boolean值 True表示亮屏 False表示息屏driver.is_locked()
4.5操作手机网络
driver.set_network_connection()
根据connect type 设置手机网络
使用场景:视频应用在使用流量看视频的时候,大部分都会提示用户正在是否继续播放,这种情况需要切换网络
python"># 设置网络仅为WIFI
driver.set_network_connection(2)
# 获取网络状态
driver.network_connection
可设置的connect type如下:
下文章继续Appium之旅,下篇文章主要讲解Appium的等待机制,可以期待一下哦~
参考文章:移动端webview进行网页调试_app webview在线模拟-CSDN博客