Appium教程

Appium 是移动端的自动化测试工具,利用它可以驱动 Android或者iOS 设备完成自动化测试,比如模拟点击 滑动 输入等操作,其官方网站为:http://appium.io/ 。

本文中我们,我们就来了解一下 Appium 安装方式。
  GitHub: https://github.com/appium/appium 
  官方网站 http ://appium.io
  官方文档: http:// Appium.io/introduction.html
  下载链接:https: //github.com/appium/appium-desktop/releases
  Python Client: https://github.com/appium/python-client

1.安装Appium

首先,需要安装Appium。因为Appium 负责驱动移动端来完成一系列操作,对于ios设备来说,它使用苹果的UIAutomation来实现驱动;对于Android 来说,它使用UIAutomator和Selendroid来实现驱动。同时Appium也相当于一个服务器,我们可以向它发送一些操作指令,它会根据不同的指令对移动设备进行驱动,以完成不同的动作。安装Appium有两种方式,一种是直接下载安装包Appium Desktop来安装,另一种是通过Node.js来安装,下面我们介绍- .下这两种安装方式。

(1)Appium Desktop

Appium Desktop支持全平台的安装,我们可以直接从GitHub的Releases 里面下载安装即可,下载链接为:https://github.com/appium/appium-desktop/releases。

如图所示:

Appium教程_第1张图片

Windows平台可以下载exe安装包91.7 MB,appium-desktop-setup-1.9.0.exe, Mac平台可以下载dmg安装包如appium-desktop-1.9 0.dmg, Linux 平台可以选择下载源码,但是更推荐用Node.js 安装方式。安装完成后桌面将会出现Appium的图标运行,看到的页面如下图所示,出现类似的内容表示安装成功。

Appium教程_第2张图片

(2)Node.js方式安装

首先需要安装 Node.js,而关于Node.js的安装方法这里不过多赘述,如果有不清楚的读者可以参考以下的地址进行安装:http://www.runoob.com/nodejs/nodejs-install-setup.html,安装完成之后就可以使用 npm 命令了。接下来,使用npm命令进行全局安装Appium,此时耐心等待命令执行完成即可,这样就成功安装了Appium。安装命令如下:
 

npm install -g appium

2.Android 开发环境配置

如果我们要使用Android设备做App抓取的话,还需要下载和配置Android SDK,这里推荐直接安装Android Studio,其下载地址为:http://www.android-studio.org/index.php。下载后点击安装包进行安装,关于安装时的选项默认即可。安装完成后,打开初始界面如图所示:
Appium教程_第3张图片

点击 【Start a new Android Studio project】 创建一个新项目,一直点【next】完成创建。进入项目主界面,如图所示:

Appium教程_第4张图片

然后,我们还需要下载Android SDK。直接打开【File】→【Settings】首选项里面的【Android SDK】设置页面,勾选要安装的SDK版本,点击OK按钮即可下载和安装勾选的SDK版本,如图所示

Appium教程_第5张图片

另外,还需要配置一下环境变量,添加ANDROID_HOME为Android SDK所在路径,然后再添加SDK文件夹下的tools和plaform-tools文件夹到PATH中。更详细的配置可以参考Android Studio的中文社区文档:

http://www.android-studio.org/index.php/docs

3.启动APP

Appium 启动 App 的方式有两种:一种是用 Appium内置的驱动器来打开app ,另一种是利用 Python程序实现此操作 下面我们分别进行说明。首先打开 Appium ,启动界面如图所示:
Appium教程_第6张图片

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

Appium教程_第7张图片

Appium 运行之后正在监听 4723 端口 我们可以向此端口对应的服务接口发送操作指令,此页面就会显示这个过程的操作日志。将Android手机通过数据线和运行Appium的PC相连,同时打开USB调试功能,确保PC可以连接到手机。接下来,用Appium内置的驱动来打开App。点击 Appium 中的 【Start Inspectos Session】 按钮如图

Appium教程_第8张图片

这时会出现一个配置页面,如图:

Appium教程_第9张图片

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

appPackage、appActivity。

£ platformName:它是平台名称,需要区分 Android或者 iOS ,此处填 Android

£ deviceName:它是设备名称,此处是手机的具体类型(比如我这里的vivo x23)

£ appPackage:它是 app 程序包名(例如大众点评app的包名为:com.dianping.v1)

£ appActivity:它是入口 Activity 名(例如大众点评的为:com.dianping.main.guide.SplashScreenActivity)

接下来,为了能更形象化的讲解本文相关知识,以下将会以大众点评app为例,实现使用Appium控制手机并启动大众点评并实现模拟登陆。相关步骤如下:

步骤1:前面我们已经进入了会话界面,现在需要做的就是添加参数,这里以大众点评为例,参数信息如下,效果如图

{
  "platformName": "Android",
  "deviceName": "vivo x23",
  "appPackage": "com.dianping.v1",
  "appActivity": "com.dianping.main.guide.SplashScreenActivity"
}

Appium教程_第10张图片

步骤2:参数设置完成后,点击右下角的【Start Session】按钮,即可启动Android手机上的大众点评App并进入到启动页面。同时PC上会弹出一个调试窗口,从这个窗口我们可以预览当前手机页面,并可以查看页面的源码,如图:

Appium教程_第11张图片

步骤3:点击左栏中屏幕的某个元素, 例如这里我选择地址成都,它就会高亮显示,这时中间栏就显示了当前选中的按钮对应的源代码,右栏则显示了该元素的基本信息,如元素的 id、class、text 等,以及可以执行的操作,如Tap、Send Keys、Clear等。如图:

Appium教程_第12张图片

步骤4:点击中间栏最上方的第三个录制按钮(就是那个有点像眼睛的图标,鼠标移动到上面去会显示Start Recording),Appium会开始录制操作动作,这时我们在窗口中操作App的行为都会波记录下来,Recorder 处可以自动生成对应语言的代码。例如,我们选择【成都】这个地址,使它高亮显示以后,然后点击右边Selected Element面板中的【Tap】操作,即模拟了按钮点击功能,这时手机和窗口的App都会跳转到大众点评的首页主界面,同时中间栏会显示此动作对应的代码,如图:

Appium教程_第13张图片

步骤5:接下来选中底部菜单选项【我的】高亮显示后,点击【Tap】完成页面跳转到我的页面,如图8-47所示,我们可以在此页面点击不同的动作按钮,即可实现对 App 的控制,同时 Recorder 部分也可以生成对应的 Python 代码。

Appium教程_第14张图片

步骤6:选择页面上面的【点击登陆】然后点击【Tap】进行页面跳转,如图1所示。跳转之后将会到大众点评的登录页面,如图2:

Appium教程_第15张图片

Appium教程_第16张图片

步骤7:跳转到登录页面后,可以看到默认是通过手机号进行登录的,所以需要填入手机号,这里使用鼠标选中手机号的输入框使之高亮显示,然后点击右边面板中的【Send Keys】这时候会弹出一个输入框,直接输入你已经注册好了的手机号,如下图1所示。填写完手机号之后,点击弹出框右下角的【Send Keys】进行填充操作。填充完手机号后,选择【下一步】按钮,然后点击【Tap】进行跳转,如图下图2所示。

Appium教程_第17张图片

Appium教程_第18张图片

步骤8:跳转到下一步之后如下图所示,我们发现,登录有两种方式,一种是通过验证码,另外一种是使用密码登录,这里选择密码,然后点击【Tap】进行跳转。

Appium教程_第19张图片

步骤9:进入密码填入模式后,如下图所示,由于安全保护原因,它这里会隐藏掉页面元素,弹出输入密码的输入框,直接输入密码并点击【Send Keys】完成填充。

Appium教程_第20张图片

步骤10:这里填入密码之后,由于页面元素已经被隐藏了,怎么办。这时候需要到 App Source下面的代码中去找,如下图1中划线处所示,找到id为logom_button的元素选中,然后点击【Tap】进行登录页面跳转。跳转之后即完成了本节的目标,成功登录了大众点评,如下图2所示。

Appium教程_第21张图片

Appium教程_第22张图片

4.appPackage和appActivity参数获取方法

前面我们使用Appium连接并启动大众点评App进行模拟登陆,不知道有没有细心的读者发现,有两个特别重要的参数值appPackage 和 appActivity 。

(1)appPackage的获取方法:

可以在腾讯应用宝中下载GT工具获取:

Appium教程_第23张图片

(2)appActivity 的获取方法

这里以大众点评这个app为例:

步骤1:需要配置好android的开发环境后,打开cmd命令窗口

Appium教程_第24张图片

步骤2:在命令窗口中输入,adb logcat>D:/log.log,输入D盘下

Appium教程_第25张图片

步骤3:运行手机上app应用程序,需要获取到app应用程序例如我在手机上打开大众点评。

Appium教程_第26张图片

步骤4:然后停止运行获取手机上logcat的文件,停止是直接按Ctrl+C

Appium教程_第27张图片

Appium教程_第28张图片

步骤6:通过抓取到log的日志,找到相应activity的应用程序。例如下图我通过筛选找到了我需要的appActivity

Appium教程_第29张图片

5.Python代码驱动App

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

server = “http: //localhost: 4723/wd/hub”

 

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

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

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

所示:

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Remote(server, desired_caps)

配置完成后运行,就可以启动微信 App 但是现在仅仅是可以启动 app ,还没有做任何动作。再用代码来模拟刚才才演示的两个动作一个是点击“登录”按钮,一个是输入手机号码。看看刚才 Appium 置驱动器内的 Recor 制生成的 Python 代码,自动生成的代码非常累赘,例如点击“登录”按钮的代码如下所示:

ell=driver. find_e lement_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 .Rel ativelayout/android.widget. 
Button[l]”) 
ell . 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 _e lement_located( (By. ID, ' com .tencent .mm:id/h2')))
phone.set_text('18200157378')

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

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

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

desired_caps = {
    'platformName': 'Android',
    'deviceName': 'vivo x23',
    '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('18200157374')

运行代码,如果报错未找到appium模块,可使用pip install Appium-Python-Client安装。安装完成后再次运行代码,则正确了。这里需要注意一点是:一定要重新连接手机, 再运行此代码, 这时即可观察到手机上首先弹出了微信欢迎页面,然后模拟点击登录按钮、输入手机号,操作完成 这样我们就成功使用 Python 代码实现了 App 的操作。

6.常用API方法

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

1.初始化

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

from appium import webdriver

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

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

driver = webdriver.Remote(server, desired_caps)

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

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

from appium import webdriver 

server= 'http ://localhost:4723/wd/hub ' 
desired_caps = { 
' platformName' : 'Android' , 
' deviceName ': ' vivo x23 ', 
' app ' . ' . /weixin. apk ' 
} 
driver = webdriver. Remote(server, desired_ caps) 

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

2.审查元素

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

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

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

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

el = self.driver.find_element_by_android_uiautomator(' new UiSel ector() . description (”Animation”)')

els= self.dri ver.find_elements_by_android uiautomator('new UiSelector() .clickable(true)')

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

el = self .driver. ind element_by _ios _uiautomation(' . elements() [OJ ')

els= self.driver.find_elements_by_ios_L iautomation(' .elements()')

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

el = self. driver. find _element_by_ios _predicate(' wdNar 1e ==”Buttons”')

els= seH.driver.find_elements_by_ios_predicate('wdValue == "SearchBar” AND isWDDivisible == 1')

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

el = self. driver. find_ element_by_ios_ class_ chain XCUIElementTypeWindow/XCUIElementTypeB ton[3]')

els= self.driver.find_elements_by_ios_class_chain( 'XCUIElementTypeWindow/XCUIElementTypeButton')

但是此种方法只适用于 XCUlTest 驱动,具体可以参考 https: // hub .com/appiu m/appium-xcuitesDriver。

3.点击

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

代码如下所示:

tap(self, positions, duration=None)

其中后两个参数如下:

£  positions :它是点击的位置组成的列表

£  duration :它是点击持续时间

实例如下所示:

driver.tap([(100, 20), (100, 60), (100, 100),500)

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

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

button = find_element_by_id (‘com .tencent.mm:id/btn ‘)

button. click()

4.屏幕拖动

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

scroll(self, origi 1_el, destinatio 1_el)

可以实现从元素 origin_el 滚动至元素 destination_el。它的后两个参数如下:

£  original el :它是被操作的元素。

£  destination_el :它是目标元素。

实例如下所示:

driver. scroll (ell, el2)

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

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

后面几个参数说明如下:

£ start_x: 它是开始位置的横坐标

£ start_y:它是开始位置的纵坐标

£ end:它是终止位置的横坐标

£ end_y:它是终止位置的纵坐标

£ duration:它是持续时间,单位是毫秒

例如下所示:

driver. swipe ( 100, 100, 100, 400, 5000)

这样可以实现在 Ss 时间内,由 (100, 100) 滑动到 (100, 400),可以使用 flick() 方法模拟从A 点快速滑动到 B 点,用法如下所示:

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

几个参数说明如下:

£ start_x: 它是开始位置的横坐标

£ start_y:它是开始位置的纵坐标

£ end:它是终止位置的横坐标

£ end_y:它是终止位置的纵坐标

实例如下所示:

driver.flick(100, 100, 100, 400)

5.拖拽

可以使用 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)

6.文本输入

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

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

el.set_ text(‘哈喽!你好')

7.动作链

月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).per arm()

首先选中一个元素,然后利用 TouchAction 实现点击操作。如果想要实现拖动操作,可以用如下方式:

els= self.driver.find_elements_by_class_name( ' listview')

al = TouchAction()

al. press (els [ o]). move_ to(x=10, y=O) . 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 操作可以参考 http s: //testerhome .com/topics/3711 。

你可能感兴趣的:(python,爬虫)