2019独角兽企业重金招聘Python工程师标准>>>

Appium是一个跨平台移动端自动化测试工具,可以非常便捷地为iOS和Android平台创建自动化测试用例。它可以模拟App内部的各种操作,如点击、滑动、文本输入等,只要我们手工操作的动作Appium都可以完成。在前面我们了解过Selenium,它是一个网页端的自动化测试工具。Appium实际上继承了Selenium,Appium也是利用WebDriver来实现App的自动化测试。对iOS设备来说,Appium使用UIAutomation来实现驱动。对于Android来说,它使用UiAutomator和Selendroid来实现驱动。

Appium相当于一个服务器,我们可以向Appium发送一些操作指令,Appium就会根据不同的指令对移动设备进行驱动,完成不同的动作。

对于爬虫来说,我们用Selenium来抓取JavaScript渲染的页面,可见即可爬。Appium同样也可以,用Appium来做App爬虫不失为一个好的选择。

下面我们来了解Appium的基本使用方法。

一、本节目标

我们以Android平台的微信为例来演示Appium启动和操作App的方法,主要目的是了解利用Appium进行自动化测试的流程以及相关API的用法。

二、准备工作

请确保PC已经安装好Appium、Android开发环境和Python版本的Appium API。另外,Android手机安装好微信App。

三、启动App

Appium启动App的方式有两种:一种是用Appium内置的驱动器来打开App,另一种是利用Python程序实现此操作。下面我们分别进行说明。

首先打开Appium,启动界面如下图所示。

直接点击Start Server按钮即可启动Appium的服务,相当于开启了一个Appium服务器。我们可以通过Appium内置的驱动或Python代码向Appium的服务器发送一系列操作指令,Appium就会根据不同的指令对移动设备进行驱动,完成不同的动作。启动后运行界面如下图所示。

Appium运行之后正在监听4723端口。我们可以向此端口对应的服务接口发送操作指令,此页面就会显示这个过程的操作日志。

将Android手机通过数据线和运行Appium的PC相连,同时打开USB调试功能,确保PC可以连接到手机。

可以输入adb命令来测试连接情况,如下所示:

adb devices -l

如果出现类似如下结果,这就说明PC已经正确连接手机。

List of devices attached
2da42ac0 device usb:336592896X product:leo model:MI_NOTE_Pro device:leo

model是设备的名称,就是后文需要用到的deviceName变量。我使用的是小米Note顶配版,所以此处名称为MI_NOTE_Pro。

如果提示找不到adb命令,请检查Android开发环境和环境变量是否配置成功。如果可以成功调用** adb **命令但不显示设备信息,请检查手机和PC的连接情况。

接下来用Appium内置的驱动器打开App,点击Appium中的Start New Session按钮,如下图所示。

这时会出现一个配置页面,如下图所示。

需要配置启动App时的Desired Capabilities参数,它们分别是** platformName、deviceName、appPackage、appActivity **。

  • platformName:它是平台名称,需要区分Android或iOS,此处填写Android。
  • deviceName:它是设备名称,此处是手机的具体类型。
  • appPackage:它是App程序包名。
  • appActivity:它是入口Activity名,这里通常需要以 . 开头。

在当前配置页面的左下角也有配置参数的相关说明,链接是https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md。

我们在Appium中加入上面4个配置,如下图所示。

点击保存按钮,保存下来,我们以后可以继续使用这个配置。

点击右下角的Start Session按钮,即可启动Android手机上的微信App并进入到启动页面。同时PC上会弹出一个调试窗口,从这个窗口我们可以预览当前手机页面,并可以查看页面的源码,如下图所示。

点击左栏中屏幕的某个元素,如选中登录按钮,它就会高亮显示。这时中间栏就显示了当前选中的按钮对应的源代码,右栏则显示了该元素的基本信息,如元素的id、class、text等,以及可以执行的操作,如Tap、Send Keys、Clear,如下图所示。

点击中间栏最上方的第三个录制按钮,Appium会开始录制操作动作,这时我们在窗口中操作App的行为都会被记录下来,Recorder处可以自动生成对应语言的代码。例如,我们点击录制按钮,然后选中App中的登录按钮,点击Tap操作,即模拟了按钮点击功能,这时手机和窗口的App都会跳转到登录页面,同时中间栏会显示此动作对应的代码,如下图所示。

接下来选中左侧的手机号文本框,点击Send Keys,对话框就会弹出。输入手机号,点击Send Keys,即可完成文本的输入,如下图所示。

我们可以在此页面点击不同的动作按钮,即可实现对App的控制,同时Recorder部分也可以生成对应的Python代码。

下面我们看看使用Python代码驱动App的方法。首先需要在代码中指定一个Appium Server,而这个Server在刚才打开Appium的时候就已经开启了,是在4723端口上运行的,配置如下所示:

server = 'http://localhost:4723/wd/hub'

用字典来配置Desired Capabilities参数,代码如下所示:

desired_caps = {'platformName': 'Android','deviceName': 'MI_NOTE_Pro','appPackage': 'com.tencent.mm','appActivity': '.ui.LauncherUI'
}

新建一个Session,这类似点击Appium内置驱动的Start Session按钮相同的功能,代码实现如下所示:

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWaitdriver = webdriver.Remote(server, desired_caps)

配置完成后运行,就可以启动微信App了。但是现在仅仅是可以启动App,还没有做任何动作。

再用代码来模拟刚才演示的两个动作:一个是点击“登录”按钮,一个是输入手机号。

看看刚才Appium内置驱动器内的Recorder录制生成的Python代码,自动生成的代码非常累赘,例如点击“登录”按钮的代码如下所示:

el1 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.Button[1]")
el1.click()

这段代码的XPath选择器路径太长,选择方式没有那么科学,获取元素时也没有设置等待,很可能会有超时异常。所以我们修改一下,将其修改为通过ID查找元素,设置延时等待,两次操作的代码改写如下所示:

wait = WebDriverWait(driver, 30)
login = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/cjk')))
login.click()
phone = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/h2')))
phone.set_text('18888888888')

综上所述,完整的代码如下所示:

from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECserver = 'http://localhost:4723/wd/hub'
desired_caps = {'platformName': 'Android','deviceName': 'MI_NOTE_Pro','appPackage': 'com.tencent.mm','appActivity': '.ui.LauncherUI'
}
driver = webdriver.Remote(server, desired_caps)
wait = WebDriverWait(driver, 30)
login = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/cjk')))
login.click()
phone = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/h2')))
phone.set_text('18888888888')

一定要重新连接手机,再运行此代码,这时即可观察到手机上首先弹出了微信欢迎页面,然后模拟点击登录按钮、输入手机号,操作完成。这样我们就成功使用Python代码实现了App的操作。

四、API

接下来看看使用代码如何操作App、总结相关API的用法。这里使用的Python库为AppiumPythonClient,其GitHub地址为https://github.com/appium/python-client,此库继承自Selenium,使用方法与Selenium有很多共同之处。

  1. 初始化

需要配置Desired Capabilities参数,完整的配置说明可以参考https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md。一般来说,配置几个基本参数即可,如下所示:

from appium import webdriverserver = 'http://localhost:4723/wd/hub'
desired_caps = {'platformName': 'Android','deviceName': 'MI_NOTE_Pro','appPackage': 'com.tencent.mm','appActivity': '.ui.LauncherUI'
}
driver = webdriver.Remote(server, desired_caps)

这里配置了启动微信App的Desired Capabilities,这样Appnium就会自动查找手机上的包名和入口类,然后将其启动。包名和入口类的名称可以在安装包中的AndroidManifest.xml文件获取。

如果要打开的App没有事先在手机上安装,我们可以直接指定App参数为安装包所在路径,这样程序启动时就会自动向手机安装并启动App,如下所示:

from appium import webdriverserver = 'http://localhost:4723/wd/hub'
desired_caps = {'platformName': 'Android','deviceName': 'MI_NOTE_Pro','app': './weixin.apk'
}
driver = webdriver.Remote(server, desired_caps)

程序启动的时候就会寻找PC当前路径下的APK安装包,然后将其安装到手机中并启动。

  1. 查找元素

我们可以使用Selenium中通用的查找方法来实现元素的查找,如下所示:

el = driver.find_element_by_id('com.tencent.mm:id/cjk')

在Selenium中,其他查找元素的方法同样适用,在此不再赘述。

在Android平台上,我们还可以使用UIAutomator来进行元素选择,如下所示:

el = self.driver.find_element_by_android_uiautomator('new UiSelector().description("Animation")')els = self.driver.find_elements_by_android_uiautomator('new UiSelector().clickable(true)')

在iOS平台上,我们可以使用UIAutomation来进行元素选择,如下所示:

el = self.driver.find_element_by_ios_uiautomation('.elements()[0]')
els = self.driver.find_elements_by_ios_uiautomation('.elements()')

还可以使用iOS Predicates来进行元素选择,如下所示:

el = self.driver.find_element_by_ios_predicate('wdName == "Buttons"')
els = self.driver.find_elements_by_ios_predicate('wdValue == "SearchBar" AND isWDDivisible == 1')

也可以使用iOS Class Chain来进行选择,如下所示:

el = self.driver.find_element_by_ios_class_chain('XCUIElementTypeWindow/XCUIElementTypeButton[3]')
els = self.driver.find_elements_by_ios_class_chain('XCUIElementTypeWindow/XCUIElementTypeButton')

但是此种方法只适用于XCUITest驱动,具体可以参考:https://github.com/appium/appium-xcuitest-driver。

  1. 点击

点击可以使用tap()方法,该方法可以模拟手指点击(最多五个手指),可设置按时长短(毫秒),代码如下所示:

tap(self, positions, duration=None)

其中后两个参数如下。

  • positions:它是点击的位置组成的列表。
  • duration:它是点击持续时间。 实例如下所示:
driver.tap([(100, 20), (100, 60), (100, 100)], 500)

这样就可以模拟点击屏幕的某几个点。

对于某个元素如按钮来说,我们可以直接调用cilck()方法实现模拟点击,实例如下所示:

button = find_element_by_id('com.tencent.mm:id/btn')
button.click()
  1. 屏幕拖动

可以使用scroll()方法模拟屏幕滚动,用法如下所示:

scroll(self, origin_el, destination_el)

可以实现从元素origin_el滚动至元素destination_el

它的后两个参数如下。

  • original_el:它是被操作的元素。
  • destination_el:它是目标元素。 实例如下所示:
driver.scroll(el1,el2)

可以使用swipe()模拟从A点滑动到B点,用法如下所示:

swipe(self, start_x, start_y, end_x, end_y, duration=None)

后面几个参数说明如下。

  • start_x:它是开始位置的横坐标。
  • start_y:它是开始位置的纵坐标。
  • end_x:它是终止位置的横坐标。
  • end_y:它是终止位置的纵坐标。
  • duration:它是持续时间,单位是毫秒。 实例如下所示:
driver.swipe(100, 100, 100, 400, 5000)

这样可以实现在5s时间内,由(100, 100)滑动到 (100, 400)。

可以使用**flick()**方法模拟从A点快速滑动到B点,用法如下所示:

flick(self, start_x, start_y, end_x, end_y)

几个参数说明如下。

  • start_x:它是开始位置的横坐标。
  • start_y:它是开始位置的纵坐标。
  • end_x:它是终止位置的横坐标。
  • end_y:它是终止位置的纵坐标。 实例如下所示:
driver.flick(100, 100, 100, 400)
  1. 拖曳

可以使用**drag_and_drop()**将某个元素拖动到另一个目标元素上,用法如下所示:

drag_and_drop(self, origin_el, destination_el)

可以实现将元素origin_el拖曳至元素destination_el

两个参数说明如下。

  • original_el:它是被拖曳的元素。
  • destination_el:它是目标元素。 实例如下所示:
driver.drag_and_drop(el1, el2)
  1. 文本输入

可以使用**set_text()**方法实现文本输入,如下所示:

el = find_element_by_id('com.tencent.mm:id/cjk')
el.set_text('Hello')
  1. 动作链

与Selenium中的ActionChains类似,Appium中的TouchAction可支持的方法有**tap()、press()、long_press()、release()、move_to()、wait()、cancel()**等,实例如下所示:

el = self.driver.find_element_by_accessibility_id('Animation')
action = TouchAction(self.driver)
action.tap(el).perform()

首先选中一个元素,然后利用TouchAction实现点击操作。

如果想要实现拖动操作,可以用如下方式:

els = self.driver.find_elements_by_class_name('listView')
a1 = TouchAction()
a1.press(els[0]).move_to(x=10, y=0).move_to(x=10, y=-75).move_to(x=10, y=-600).release()
a2 = TouchAction()
a2.press(els[1]).move_to(x=10, y=10).move_to(x=10, y=-300).move_to(x=10, y=-600).release()

利用以上API,我们就可以完成绝大部分操作。更多的API操作可以参考:https://testerhome.com/topics/3711。

本文文章转载,摘子于:

https://cloud.tencent.com/developer/article/1151796

作者:崔庆才

静觅博客博主,《Python3网络爬虫开发实战》作者

转载于:https://my.oschina.net/u/3826227/blog/2245844

App的selenium,Appium爬App!相关推荐

  1. Python +Appium 实现app自动化测试

    Python +Appium 实现app自动化测试 一.Appium简介 Appium是一款开源工具,用于自动化iOS.Android和Windows桌面平台上的本地.移动web和混合应用程序.原生应 ...

  2. 使用自动化测试工具selenium爬虫——爬取艾瑞app获取手机app使用排行

    话不多说,进入正题,我就不说怎么安装selenium.怎么用webdriver了,有人要是不会可以私信我哈.不过我想,这里混的都是大佬,不会比我这种小白程序员差,我也就做个分享而已. 目录 一.导入需 ...

  3. 第30讲:如何爬app的数据

    前面我们介绍的都是爬取 Web 网页的内容.随着移动互联网的发展,越来越多的企业并没有提供 Web 网页端的服务,而是直接开发了 App,更多更全的信息都是通过 App 来展示的.那么针对 App 我 ...

  4. APP测试概念/Appium实战

    按测试类型分类 1.APP专项测试概念 2.APP测试方法 3.Appium简介 appium 实战脚本 是看着课程听的,做的课程的随堂笔记 课程的链接如下: https://coding.imooc ...

  5. android app自动化测试框架Appium资料整理

    by Ruiming.Lv 1   自动化测试 1.1    自动化测试简介 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程.从广义上来讲,一切通过工具(程序)的方式来代替或辅助手工测试的 ...

  6. APPIUM实现APP自动化的基本使用教程

    目录 安装电脑客户端 配置客户端 启动服务 连接设备中的APP 认识界面提供的功能 开始连接 制作脚本 认识界面提供的功能 基本制作步骤 执行脚本 以Android Studio和生成Java -JU ...

  7. appium启动APP配置参数:

    一.Android启动app python启动脚本如下:   from appium import webdriver desired_caps = {} desired_caps['platform ...

  8. 使用appium进行app自动化测试时遇到AppActivity设置正确但报Connect Appium Server Fail.A new session could not be created

    appium 部分服务关键字如下: PlatformName=Android PlatformVersion=4.4.4 AppPackage=com.xxxxx.xxxx AppActivity=. ...

  9. APP自动化测试-12.Appium日志分析(原理)

    APP自动化测试-12.Appium日志分析 文章目录 APP自动化测试-12.Appium日志分析 前言 一.应用启动 二.元素定位与操作 总结 前言 以Android原生应用为例,记录使用appi ...

最新文章

  1. DCN-2655同异步端口
  2. wordpress关闭博客评论的两种方法
  3. 到底什么时候不应该使用机器学习?
  4. ThinkPHP 3.2.2 实现持久登录 ( 记住我 )
  5. iis php 数据库乱码,如何解决php插入数据乱码问题
  6. 将应用程序安装为Windows服务
  7. 考研生物和计算机结合的专业,2020考研:生物医学工程,考研是考原专业还是跨专业考计算机好?...
  8. Excel-在整个工作簿中查找/替换
  9. php把时间戳转换成多少时间之前函数
  10. 计算机应用0006作业2,〔计算机应用基本0006〕14秋在线作业2.doc
  11. Jetpack—LiveData组件的缺陷以及应对策略 转至元数据结尾
  12. 苹果Mac设备丢失时怎样利用激活锁保护隐私信息?
  13. 大话设计模式 设计模式书籍 编程书籍
  14. Principle for Mac(交互式UI原型设计神器)
  15. 英文信件结尾的表达方式
  16. WinForm实现Loading等待界面
  17. python 微信自动回复_python微信机器人自动回复
  18. 强化学习蘑菇书Easy RL第二、三章学习(马尔可夫决策过程、表格型方法)
  19. qchart 坐标轴设置_QChart学习之QValueAxis坐标轴设置
  20. kingbase之ksql命令工具

热门文章

  1. c语言最短延时程序,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写...
  2. html怎么设置字体竖直,CSS3 writing-mode 控制字体竖直显示
  3. some any oracle,Oracle之 any、some、all 解析
  4. Springboot 多模块项目创建与配置
  5. 思科交换机的初始配置(使用telnet登录)
  6. 微信小程序之可滚动视图 scroll-view 的使用注意
  7. Android前后端交互细节--Json转化为对象的原理
  8. [Leetcode]141. Linked List Cycle
  9. 存储过程批量执行脚本
  10. 诗与远方:无题(二十五)