Android 元素定位方法:https://testerhome.com/topics/8256
Android 元素操作相关,也包含定位方法:https://www.cnblogs.com/zihanxing/p/7055065.html
Webdriver.Remote链接地址如何配置:https://www.cnblogs.com/yoyoketang/p/6128808.html
desired_caps参数:https://blog.csdn.net/yejianyun1/article/details/56279051
建议不要直接看API的中文文档,文档的内容太长了。大多数内容介绍的是原理相关的,但是有句话叫不知道原理,照样可以入门,所以自学不从原理开始,从自动化的根本需求出发,逐个击破,最后再通过原理文档找到代码实现的原理,以便以后解决更多的问题以及对付面试官!
笔记一里,搭建完环境后,有一段代码是驱动安卓手机中的计算器,运行简单的计算操作。就从分析这段代码来:源码如下
#coding=utf-8
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.0.1'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['appPackage'] = 'com.android.calculator2'
desired_caps['appActivity'] = '.Calculator'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.find_element_by_name("1").click()
driver.find_element_by_name("5").click()
driver.find_element_by_name("9").click()
driver.find_element_by_name("delete").click()
driver.find_element_by_name("9").click()
driver.find_element_by_name("5").click()
driver.find_element_by_name("+").click()
driver.find_element_by_name("6").click()
driver.find_element_by_name("=").click()
driver.quit()
这一段看似很长,不过实际上就几个关键部分,弄明白了内容后自己尝试几次应该就可以了。先看俺有哪几部分:desired_caps/Remote()/find_element_by_name()/click/quit()
用SDK manager自带的UI Automator Viewer,看取的内容,效果不好,而且看不到Xpath,对比我这种小白,定位起来很不方便。所以怎么办嗯?看文头链接,搞一个,等等,暂时先不搞了。将就下
常用的有4个:下面举例3个,第四个是Xpath,不过自带的取不到,很尴尬!截个图方便以后回头看知道这几个是怎么找的
driver.find_element_by_class_name("android.widget.Button").click()
driver.find_element_by_name("8").click()
driver.find_element_by_id("com.android.calculator2:id/digit_9").click()
Android操作内容比web有些内容相同,有些内容是独有的
相同操作:点击【click()】, 清空【clear()】, 输入【send()】,获取元素的text内容【text】
不同操作:1. 触摸操作 2. 系统按键操作 3. driver特殊操作
1.1 长按元素:driver.tap([(234,483),(327,568)],2)
元素比较好理解,就3部分:
1.1.1 driver.tap() 关键字
1.1.2 [(234,483),(327,568)] 元素坐标,需要写完整,不能只写一部分。实例如下:
driver.tap([(234,483),(327,568)],100) # 能够运行,但是没有持续时间
driver.tap([234,483],2) # 无法运行,报错:TypeError: 'int' object has no attribute '__getitem__'
driver.tap((234,483),2) # 无法运行,报错:TypeError: 'int' object has no attribute '__getitem__'
能够运行的一条确实能够实行,不过感觉从本机看像是没有持续按。也可能是计算器持续按也没有效果,这个当课后作业1:探索driver.tap,是否能够持续按压
1.1.3 “2”,这个是悬停时长,单位ms
1.2 触摸屏常规操作TouchAction(driver)
操作步骤:1. 引用TouchAchton 2. 生成TouchAction对象 3. 对象执行操作
1.2.1 引用:本地尝试的时候发现,调用TouchAchtion失败,找了下这个方法需要单独引用,只引用appium的webdriver还不够
from appium.webdriver.common.touch_action import TouchAction
1.2.2 创建触摸对象:action=TouchAction(driver) 可以理解为操作的发生器,一户的一系列操作都由action产生
1.2.3 编写运动脚本:运动包含短按、长按、移动到、等待、点击、取消、执行、释放。
action.press(x=24, y=386).wait(2).move_to(x=129, y=386).move_to(x=123, y=386).release().perform()
这里运用到了短按、等待、移动、释放。 执行一系列操作之后,还需要增加.perform(),让操作能够运行出来!
本地实践了下,上诉代码在操作计算器的时候,报错了:The coordinates provided to an interactions operation are invalid.【提供给交互操作的坐标无效。】查了下分析原因是手机分辨率不同,超过了手机设定的位置,导致元素点击不到。这个暂时也作为课后作业2,先不做解答。
1.3 多点触控操作:MultiAction()
操作步骤:1. 定位多个TouchAction() 2. MutiAction.add() 将多个Action拼接到一起, 3 . perform()执行
1.3.1 引用MutiAction:
from appium.webdriver.common.multi_action import MultiAction
1.3.2 根据需要创建多个TouchAction,在TouchAction中,不要使用.perform()
1.3.3 使用MutiAction.add将多个TouchAction串联起来, 之后使用perform()
action = TouchAction(driver)
action.press(x=24, y=386).wait(2).move_to(x=129, y=386).move_to(x=123, y=386).release()
action2 = TouchAction(driver)
action2.press(x=11, y=11)
MultiAction().add(action).add(action2).perform()
1.4 滑动坐标:driver.swipe(). 这个实例类似于封装了一套进行滑动的方法。可以直接复制到本地直接作为方法调用。
操作步骤:1. 使用关键字:driver.press_keycode() 2. 录入需要进行的按键操作,实际使用的时候再单独对应下就可以了。这部分内容不太难,不做过多解释。
入门阶段使用的不多,操作部分先分析到这。
driver. quit():退出功能,没有执行会导致之前的session未失效,无法再运行脚本
操作步骤:1. 录入控制Appium服务器 2. 手机端连接说明:主要用于告诉服务器,链接哪台服务器的哪个功能
1. 服务器地址,配置本地地址,使用:localhose,如果有确切的appium地址,也可以使用详细地址
'http://127.0.0.1:4723/wd/hub'
2. desired_caps,配置内容很多,这个根据测试需要进行配置:详见开头
desired_caps['platformName'] = 'Android' # 平台名称
desired_caps['platformVersion'] = '5.0.1' # 平台版本
desired_caps['deviceName'] = 'Android Emulator' # 设备名称
desired_caps['appPackage'] = 'com.android.calculator2' # 包名
desired_caps['appActivity'] = '.Calculator' # 启动文件
以上内容差不多入门了,开始搞下需要测试的系统了,下期见