07-appium常用操作

2024-06-21 04:52
文章标签 操作 常用 07 appium

本文主要是介绍07-appium常用操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、press_keycode

1)方法说明

        press_keycode方法是appium的键盘相关函数,可以实现键盘的相关操作,比如返回、按键、音量调节等等。也可以使用keyevent方法,功能与press_keycode方法类似。

# KeyCode:各种操作对应的键值码
driver.press_keycode(KeyCode)
2)使用示例
# 返回键
driver.press_keycode(4)# 回车键
driver.press_keycode(66)# 回车键
driver.keyevent(66)# 退格键
driver.keyevent(67)

二、scroll方法

1)方法说明

        scroll方法是滑动页面,不过不是滑动滚动条,而是获取两个元素,然后从一个元素滚动到另一个元素。

        要求:两个元素都在界面上可见,否则会报错。而且滑动持续时间设置越短,滑动越快,滑动效果会不太准确。所以使用scroll方法时,滑动持续时间尽量设置大一些。

# origin_el:滚动的起始元素
# destination_el:滚动的结束元素
# duration:滑动的持续时间,默认是600ms,时间越大滑动越慢
driver.scroll(origin_el, destination_el, duration)
2)使用示例

        这里通过代码,将设置页从 “应用兼容性” 滑动到 “更多”。

start_element = driver.find_element('xpath', "//*[@text='应用兼容性']")
end_element = driver.find_element('xpath', "//*[@text='更多']")
driver.scroll(start_element, end_element, 5000)

三、drag_and_drop方法

1)方法说明

        drag_and_drop方法是也是滑动页面,从一个元素滑动到另一个元素,第二个元素代替第一个元素原本屏幕上的位置。

        要求:两个元素都在界面上可见,否则会报错。但是drag_and_drop方法不能设置滑动持续时间,但滑动效果比scroll方法更加精确,几乎没有惯性。drag_and_drop方法有点类似于慢速版的scroll方法。

# origin_el:滚动的起始元素
# destination_el:滚动的结束元素
driver.drag_and_drop(origin_el, destination_el)
2)使用示例

        这里通过代码,将设置页从 “应用兼容性” 滑动到 “更多”

start_element = driver.find_element('xpath', "//*[@text='应用兼容性']")
end_element = driver.find_element('xpath', "//*[@text='更多']")
driver.drag_and_drop(start_element, end_element)

四、swipe方法

1)方法说明

        swipe方法是从一个坐标点滑动到另一个坐标点,也就是说是两点之间的滑动。

# start_x:起始坐标点的横坐标
# start_y:起始坐标点的纵坐标
# end_x:结束坐标点的横坐标
# end_y:结束坐标点的纵坐标
# duration:滑动的持续时间
driver.swipe(start_x, start_y, end_x, end_y, duration)
2)使用示例

        这里通过代码,将设置页从第一个坐标点(660,1483)滑动到第二个坐标点(660,533)。

driver.swipe(660, 1483, 660, 533, 5000)

五、TouchAction

1)TouchAction使用步骤

        TouchAction可以实现一些针对手势的操作,比如滑动、拖动、长按等,我们可以将这些基本手势组合成一个相对复杂的手势,比如我们解锁手机或者一些应用软件都有手势解锁的这种方式。

  1. 使用TouchAction具体方法之前,需要导入TouchAction库。
    from appium.webdriver.common.touch_action import TouchAction
  2. 创建TouchAction对象。
  3. 通过对象调用想要执行的手势操作的方法。
  4. 通过perform方法执行动作(所有手势必须通过perform方法来触发)。
2)tap方法

        tap()方法用来模拟手指对某个元素或坐标按下并快速抬起。

        tap和click方法的作用差不多,但tap可以接收一个坐标值作为点击的区域,而click只能接收元素对象作为参数。另外,tap()方法还可以设置count参数,表示点击次数,count=2用来表示双击。

def tap(self,element: Optional['WebElement'] = None,x: Optional[int] = None,y: Optional[int] = None,count: int = 1,
) -> 'TouchAction':"""Perform a tap action on the elementArgs:element: the element to tapx : x coordinate to tap, relative to the top left corner of the element.y : y coordinate. If y is used, x must also be set, and vice versa
TouchAction(driver).tap(user_name).perform()
3)press方法

        press()方法用来模拟手指对某个元素或坐标一直按下。

def press(self,el: Optional['WebElement'] = None,x: Optional[int] = None,y: Optional[int] = None,pressure: Optional[float] = None,
) -> 'TouchAction':"""Begin a chain with a press down action at a particular element or pointArgs:el: the element to pressx: x coordiate to press. If y is used, x must also be sety: y coordiate to press. If x is used, y must also be set
TouchAction(driver).press(x=100, y=200).perform()
4)release方法

        release()方法用来模拟手指抬起。

def release(self) -> 'TouchAction':"""End the action by lifting the pointer off the screen
Returns:`TouchAction`: Self instance
"""self._add_action('release', {})return self
TouchAction(driver).press(x=100, y=200).release().perform()
5)wait方法

        wait()方法用来模拟手指等待。

 def wait(self, ms: int = 0) -> 'TouchAction':"""Pause for `ms` milliseconds.
Args:ms: The time to pauseReturns:`TouchAction`: Self instance
"""
TouchAction(driver).press(x=100, y=200).wait(3000).release().perform()
6)move_to方法

        wait()方法用来模拟手指移动到某个元素或坐标。

def move_to(self, el: Optional['WebElement'] = None, x: Optional[int] = None, y: Optional[int] = None
) -> 'TouchAction':"""Move the pointer from the previous point to the element or point specified
Args:el: the element to be moved tox: x coordiate to be moved to. If y is used, x must also be sety: y coordiate to be moved to. If x is used, y must also be setReturns:`TouchAction`: Self instance
"""
TouchAction(driver).press(x=400, y=500).move_to(500, 600).perform()
7)使用示例

        通过代码绘制出下图中的图案。

8)报错分析
from appium import webdriver
import time# 设置启动参数
desired_cap = {}
desired_cap['platformName'] = 'Android'
desired_cap['platformVersion'] = '6.0.1'
desired_cap['deviceName'] = '127.0.0.1:7555'
# 必须参数,指定被测软件的包名
desired_cap['appPackage'] = 'com.android.settings'
# 必须参数,指定要打开app的哪个页面
desired_cap['appActivity'] = '.ChooseLockPattern'
desired_cap['automationName'] = 'Uiautomator2'
desired_cap['noReset'] = True
desired_cap['newCommandTimeout'] = 6000
desired_cap['unicodeKeyboard'] = True
desired_cap['resetKeyboard'] = Truedriver = webdriver.Remote('http://localhost:4723/wd/hub', desired_cap)

        通过adb命令获取到绘制图案页面的activity为.ChooseLockPattern,但是通过执行上面代码不能打开设置app,报错:Original error: Cannot start the 'com.android.settings' application. Original error: The permission to start '.ChooseLockPattern' activity has been denied.

        原因是app应用没开权限,对于activity是禁止外部调用的。

9)解决办法
  1. 将AndroidManifest.xml文件中将Activity设置成允许调用:Android:exported=”true”,加上权限后再重新打apk包。
  2. 通过代码打开app应用的启动页,然后通过定位菜单元素,逐层点击进入下一层界面,直到打开绘制图案界面为止。
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
import time# 设置启动参数
desired_cap = {}
desired_cap['platformName'] = 'Android'
desired_cap['platformVersion'] = '6.0.1'
desired_cap['deviceName'] = '127.0.0.1:7555'
# 必须参数,指定被测软件的包名
desired_cap['appPackage'] = 'com.android.settings'
# 必须参数,指定要打开app的哪个页面
desired_cap['appActivity'] = '.Settings'
desired_cap['automationName'] = 'Uiautomator2'
desired_cap['noReset'] = True
desired_cap['newCommandTimeout'] = 6000
desired_cap['unicodeKeyboard'] = True
desired_cap['resetKeyboard'] = Truedriver = webdriver.Remote('http://localhost:4723/wd/hub', desired_cap)
time.sleep(5)# 1.获取手机设备宽、高信息
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']# 2.将设置app的启动界面向上滑动半屏,使 “安全” 菜单项可见
driver.swipe(x * 0.5, y * 0.5, x * 0.5, 0)# 3.依次点击菜单 “安全” -> “屏幕锁定方式” -> “图案”
driver.find_element('xpath', '//*[@text="安全"]').click()
time.sleep(1)
driver.find_element('xpath', '//*[@text="屏幕锁定方式"]').click()
time.sleep(1)
driver.find_element('xpath', '//*[@text="图案"]').click()
time.sleep(1)# 4.绘制图案
ta = TouchAction(driver)
# 按住第一个点
ta.press(x=145, y=564).wait(1000)
ta.move_to(x=449, y=564).wait(1000)
ta.move_to(x=748, y=564).wait(1000)
ta.move_to(x=748, y=863).wait(1000)
ta.move_to(x=748, y=1165).wait(1000)
# 移动到最后一个点之后松手
ta.release().perform()
10)如何定位不可见元素?

        在上述示例中,打开app应用的启动页后,需要先打开 “安全” 菜单,但界面菜单项过多,屏幕太小,导致 “安全” 菜单不可见。所以需要先将屏幕进行滑动,使得 “安全” 菜单可见后,再进行操作。

        在上述示例中,将屏幕向上滑动半屏后,就能看见 “安全” 菜单,所以在代码中将滑动屏幕操作直接写死了,直接滑动半屏,然后进行定位、操作等等。

        但有时候要定位的元素,可能需要滑动好多屏才能看见,所以不能直接在代码中写死,而应该在while循环中边滑动屏幕、边对元素进行定位,当定位到目标元素后,跳出循环。

这篇关于07-appium常用操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080258

相关文章

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

Java Stream流与使用操作指南

《JavaStream流与使用操作指南》Stream不是数据结构,而是一种高级的数据处理工具,允许你以声明式的方式处理数据集合,类似于SQL语句操作数据库,本文给大家介绍JavaStream流与使用... 目录一、什么是stream流二、创建stream流1.单列集合创建stream流2.双列集合创建str