Python Appium配置的一些坑和经验分享

最近朋友跟我说可能要接一个 App爬虫的的单子,怀着兴奋激动(bu han chan)的心情,我打开CSDN搜索如何配置Python Appium的相关教程,踩了很多的坑,准备和大家一起分享一下。

准备篇

首先我们需要配置Android SDK(iOS没试,因为没有设备),因为我这个人比较的喜欢IDE(lan),所以我直接选择下载一个Android Studio来安装我们的Android SDK。访问Android Studio官网来下载:

Download Android Studio and SDK tools  |  Android Developershttps://developer.android.google.cn/studio/Python Appium配置的一些坑和经验分享_第1张图片

 下载好后打开Android Studio,找到settings --> system settings --> Android SDK

Python Appium配置的一些坑和经验分享_第2张图片

Python Appium配置的一些坑和经验分享_第3张图片

 

 按照上图配置好SDK保存路径以及安装的版本后,点击Apply按钮安装。

安装好我们的SDK后记得配置一下环境变量(因为Appium会自动读取环境变量以检验JDK和SDK-Tools的安装),因此我们需要创建如下变量:

配置好后打开PowerShell检查一下:

 确认好上述东西可以开始下载Appium驱动了,这里不建议使用1.20版本以上的Appium,因为如何你需要对XML(ui)进行即时的元素查看的话,你需要去独立的安装Appium Inspector(ui检查器),而这个东西是在1.20以下版本是被集成在原生Appium里的,无需单独下载。

Appium github下载链接:https://github.com/appium/appium-desktop/releases/latesticon-default.png?t=LA92https://github.com/appium/appium-desktop/releases/latest

下载好的Appium是安装C盘里的,这个是无法更改的。

打开后的驱动涨这个样子:

Python Appium配置的一些坑和经验分享_第4张图片

 一般情况下我们只使用精简模式就足够了,保留默认配置启动服务器。

启动后的Appium Log长这样:

Python Appium配置的一些坑和经验分享_第5张图片

 好了,到这里准备工作就完成了。

实战篇

对安卓有点了解的小伙伴应该知道:Android的APP基本元素包含Activity和UI XML。那么,如果我去爬虫,我怎么去定位到我想要爬取的元素呢?这里就用到我们之前提到过的Appium Inspector了。

有主意发现上面Log Shell里的一个放大镜吗,那就是我们要用的UI检查器。

点开它,你能看到这样的画面:

Python Appium配置的一些坑和经验分享_第6张图片

 可是这样干启动会话是根本启动不了我们的UI检查器的,它会抛出这样的异常:

这是因为我们没有指定启动配置,那么我们该怎么配置我们的连接呢?

首先点击自动设定按钮,这时Appium会弹出这样的对话框:

 因为我们刚才在启动Appium服务的时候是以localhost来启动的,所以这里Appium自动识别到了。

当然这种情况下还不能启动会话,因为它又会抛出这样的异常:

这是因为你没有指定Appium以哪一种内核类型去连接设备,以及你没有指定设备的名称、动画以及自动化时发生异常时的指令超时等等配置项。

所以我在这里为大家列举了一份启动json:

{
    "platformName": "Android",//平台名称
    "platformVersion": "11",//系统版本
    "deviceName": "pyxis",//设备名称,可以随便写(但这里建议用adb识别的结果
    "unicodeKeyboard": true,//是否启动unicode键盘以进行自动化
    "resetKeyboard": true,//是否重置键盘
    "noReset": true,//这个没太搞懂
    "newCommandTimeout": 6000,//当新指令信号发送到安卓设备时,Appium最大的等到超时为多长时间(以毫秒为单位)
    "automationName" : "UiAutomator2"//指定动画
}

将其复制到我们下面的JSON Representation里并保存:

Python Appium配置的一些坑和经验分享_第7张图片

可以看到Appium已经读取我们的配置项了,这个时候我们就可以启动我们的会话了。

 在创建连接会话时,Appium会要求你安装如下的驱动组件:

Python Appium配置的一些坑和经验分享_第8张图片

 Python Appium配置的一些坑和经验分享_第9张图片

一个是appium的uiautomator2的测试服务,一个是主服务,切记一定要安装,否则Appium是拿不到数据的。

安装好之后,UI检查器就是如下的样子:

Python Appium配置的一些坑和经验分享_第10张图片

这样我们就可以向Selenium一样来定位我们想要的元素对象了。

讲完了UI部分,我们也需要Activty来对我们的APP进行控制,那么,该怎么操作呢,没错这个时候就需要ADB(Android Debug Bridge)工具了

使用如下的指令可以获取到我们想要的APP锁对应的activity:

adb shell monkey -p package_name -v-v-v 1

可以看到,这里就是我们想要的activity:

 好的,以上与代码相关的部分就介绍完了,接下来讲讲我在配置时遇到的坑。

踩坑篇

1.”Session Not Created“,像这种错误有一种可能是因为你的手机并没有获取到权限,这个时候该怎么办呢?

首先在确保你的手机有开启开发者模式的情况下,以小米手机为例(本人小米CC9),打开开发者模式下的这些设置:

Python Appium配置的一些坑和经验分享_第11张图片

 打开这些设置后以防万一,我们最好重启一下再连接adb。

2."C:\Program Files\Java\jdk-17.0.1" is not xxx,is it installed ?

     这个问题的指向对象就很明显了,是指你的JAVA配置出现了问题,因此你需要检查你的JAVA_HOME是否配置正常。

3.切记不要在pip中安装uiautomator2和weditor!!!

具体是因为什么我也不清楚是为什么,但是实话这么搞它就会报错,因此,千万别装!!!

4."远程主机关闭了访问"?不用看了,这是因为你Appium服务没启动或者掉了。

---------------------------------------------------------------------------------------------------------------------------------好的,以上就是本次Appium配置分享的全部内容了,喜欢或者觉得有用记得给我点个赞,我是Deahost,下期见。

最后附上一个自动刷抖音的脚本送给大家,有需要的可以自行复制运行:

from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
import time
from random import randint
action = TouchAction()

timehold = int(input("请输入浏览时长:"))
swipe_duration = float(input("请输入滑动时长:"))
desired_caps = {
    "platformName": "Android",
    "platformVersion": "11",
    "deviceName": "pyxis",
    "appPackage":"com.ss.android.ugc.aweme",
    "appActivity":".splash.SplashActivity",
    "unicodeKeyboard": True,
    "resetKeyboard": True,
    "noReset": True,   
    "newCommandTimeout": 6000,
    "automationName" : "UiAutomator2"
}

driver = webdriver.Remote("http://localhost:4723/wd/hub",desired_capabilities=desired_caps)

def get_size():
    x = driver.get_window_size()['width']
    y = driver.get_window_size()['height']
    return (x,y)
def swipe(time_hold:int,duration:int) -> None:
    screen = get_size()
    time.sleep(time_hold)
    driver.swipe(screen[0] * 0.5,screen[1] * 0.75,screen[0] * 0.5,screen[1]*0.25,duration)
time.sleep(3)
while True:
    try:
        driver.implicitly_wait(randint(1,3))
        like_button = driver.find_element_by_id("ck8")
        action.tap(like_button,count=2)
        swipe(time_hold=timehold,duration=swipe_duration)
    except Exception as Error:
        print(f"[Error] 不是一个有效短视频,可能是直播,尝试滑动")
        swipe(time_hold=0,duration=swipe_duration)

 

你可能感兴趣的:(python,经验分享,开发语言)