Appium的安装在前一篇文章写得比较详细,如果有需要,可以参考前一篇,下面介绍抓取APP数据的过程。
开始界面
Appium安装完成之后,打开Appium,如下图直接点击开始。
进入如下图界面,点击,Start Inspector Session
设置相关信息
进入如下界面,填写相关信息,主要有
"platformName": "Android",
"deviceName": "MI_8",
"appPackage": "com.zhihu.android",
"appActivity": ".app.ui.activity.MainActivity",
"noReset": true
platformName平台名称:填写Android或者iOS,deviceName设备名称:填写真机的设备名,可以通过adb devices -l(不是数字1,是小写l) 查看,model后面就是
appPackage:app包名,appActivity:app活动名,appPackage和appActivity获取方式:
- a、启动待测apk
- b、开启日志输出:adb logcat>D:/log.txt
- c、关闭日志输出:ctrl+c
- d、查看日志
用 ctrl+f 找Displayed:
Displayed com.zhihu.android/.app.ui.activity.LauncherActivity: +1s365ms
appPackage = com.zhihu.android
appActivity = .app.ui.activity.LauncherActivity
这样就找出了appPackage,但是这样找出来的appActivity可能不一定是我们需要的那个,可以启动待测apk到需要访问的界面,
通过命令adb shell monkey -p com.zhihu.android -v -v -v 1,就可以查看需要访问的界面的活动名
还有一个特别简单快速有效的方法:
通过cmd命令,前提是先打开手机中你要获取包名的APP
1. adb shell
2. dumpsys activity | grep mFocusedActivity
noReset设置为true,每次运行的时候就不会把APP重置,可以免去登录的麻烦步骤。
设置完成。
开始
以上设置好之后,点击Start Session就可以启动了。
但是我开始的时候一直报错:
An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command 'C:\\Users\\hola\\AppData\\Local\\Android\\Sdk\\platform-tools\\adb.exe -P 5037 -s 972ad0b shell pm install -g /data/local/tmp/appium_cache/3d97225b036c28750562ef8962defee6b1af19a4.apk' exited with code 1'; Stderr: ''; Code: '1'
网上查找了各种解决方案都没有解决,最后发现是我没有打开允许usb安装的权限,因为Appium会安装一个'AppiumSettings'的程序到手机,每次都会用这个程序启动。这里提醒一下,要用真机调试的话,必须打开开发者选项,然后开启USB调试,USB安装,USB调试安全设置三项,不然都可能出现错误。
打开USB安装权限之后我就成功获取到了手机界面,激动不已,接着按下图步骤操作,
最上面红色框内各按钮功能:第一个:定位元素;第二个:拖拽测试;第三个高宽比; 第四个:后退;第五个:刷新;第六个录制;第七个:校验元素;第八个:关闭
1、我们先点击第六个按钮(图标为眼睛),开始录制,会把你后面的每一个操作都转换成代码,可以选择Java/Python等,然后直接复制代码,非常方便,为了不遗漏操作步骤,所以我们从头开始录制(不过我这里不需要录制,因为我这里获取数据不需要对app执行什么操作)。
2、选择元素功能
3、选择你想要操作的地方,我想要获取热点的标题,所以我选择了这个地方
然后就出现了最右边红框部分,框内各按钮功能:Tap是点击,Send Keys是发送输入的信息,比如填写电话号码等,Clear是清除。我们这里仅仅是想获取热点标题,所以我们不做任何操作,我们往下拉,可以找到resource-id:com.zhihu.android:id/title
同理,我们还可以点击“热度”,获取热度的resource-id:com.zhihu.android:id/metrics_text
然后我们就可以通过resource-id来获取内容啦
from appium import webdriver
import time
caps = {}
caps["platformName"] = "Android"
caps["deviceName"] = "MI_8_SE"
caps["appPackage"] = "com.zhihu.android"
caps["appActivity"] = ".app.ui.activity.MainActivity"
caps["platformVersion"] = "9"
caps["autoGrantPermissions "] = True
caps["noReset"] = True
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
time.sleep(6)
el1 = driver.find_elements_by_id("com.zhihu.android:id/title")
el2 = driver.find_elements_by_id("com.zhihu.android:id/metrics_text")
contents=[]
for i in range(len(el1)):
print(el1[i].text, el2[i].text,len(el1))
获取元素的方式常用的有:
driver.find_element_by_xpath("//")
driver.find_element_by_id("com.zhihu.android:id/title")
如果想要获取列表多个数据:
就把find_element_by_id改为find_elements_by_id
driver.find_element_by_id("com.zhihu.android:id/title").text就可以获取text数据
或者driver.find_element_by_id("com.zhihu.android:id/title").get_attribute('text')或get_attribute('href')
如果我想要获取知乎热点里面的每一条评论呢?怎么办?前面说了,选中热点标题后,右边红框就会出现,点击Tap,就会跳转到详细界面,获取数据同上