「docker实战篇」python的docker-抖音appium模拟滑动操作(22)

zhugeaming 2019-06-10 09:41:12

原创文章,欢迎转载。转载请注明:转载自 IT人故事会,谢谢!
原文链接地址: 「docker实战篇」python的docker-抖音appium模拟滑动操作(22)

上次代码写到了可以通过接口获取粉丝的数据了,但是当时有个问题,需要人为的手动进行点击头像,然后点击粉丝,进入粉丝列表,然后在下拉刷新获取最新的粉丝。之前都说过appium模拟器可以帮咱们做这些事,下面通过appium来进行操作吧。源码: https://github.com/limingios/dockerpython.git (douyin)

1240

抖音短视频的操作步骤(一)

1.首先通过模拟器打开抖音,等待加载完毕。

1240
1240

2.完全进去后,左上角有个放大镜的窗口,点击搜索框,输入抖音ID(191433445)

1240
1240

3.点击用户的标签,点击头像,在点击进入“陈赫” 前,先看看关注的标签是否存在

1240

4.进入“陈赫”页面后,点击粉丝,然后进行模拟滑动,通过上节的实际使用的(mitmdump)解析粉丝数据存入数据库中。

1240
1240

编写python的脚本通过appium操作抖音(二)

  • 准备工作
    1.取消模拟器代理
1240

2.下载抖音apk

http://acj3.pc6.com/pc6_soure/2019-2/com.ss.android.ugc.aweme_500.apk

1240

3.查看抖音apk的信息

查看appPackage和appActivity
1.进入安卓sdk目录下找到build-tools
2.随便选择一个版本号
3.通过cmd进入这个目录
4.输入命令获取aapt.exe dump badging 包名(必须在sdk的build-tools的版本的版本号的 aapt.exe目录下执行)

1240
1240
1240
1240

只能获取appPackage=com.ss.android.ugc.aweme,appActivity获取不到

用另一个变态的方式

                #获取列表 adb devices 
                #进入监控日志 adb -s 127.0.0.1:62025 logcat>E:/log.txt 
                #启动后,点开抖音,然后查看E盘目录下的log.txt文件 
1240

搜Displayed

1240

获取到信息
appPackage: com.ss.android.ugc.aweme
appActivity:com.ss.android.ugc.aweme.main.MainActivity

3.获取安卓的版本号

打开模拟器,进入关于手机查看android的版本4.4.2

1240

4.测试配置

1.启动安卓模拟器
2.启动appium应用
3.启动测试的python代码
4.顺序必须上找上边的

1240

测试的python代码

                #!/usr/bin/env python 
                import time 
                from appium 
                import webdriver 
                from selenium.webdriver.support.ui 
                import WebDriverWait
cap = { 
                "platformName": 
                "Android", 
                "platformVersion": 
                "4.4.2", 
                "deviceName": 
                "127.0.0.1:62001", 
                "appPackage": 
                "com.ss.android.ugc.aweme", 
                "appActivity": 
                "com.ss.android.ugc.aweme.main.MainActivity", 
                "noReset": 
                True, 
                "unicodeKeyboard":
                True, 
                "resetkeyboard":
                True }
driver = webdriver.Remote(
                "http://localhost:4723/wd/hub",cap) 
                
                def 
                get_size
                (): x = driver.get_window_size()[
                'width']
    y = driver.get_window_size()[
                'height'] 
                return(x,y)

开始解析页面的xpath信息(三)

1.关闭上边测试用的appium,单独启动下抖音app

1240

2.暂停播放,启动uiautomatorviewer。源码包中有加强版的uiautomatorviewer。看过之前文章的老铁都懂。一定要暂停,否则uiautomatorviewer。

1240

还需要感叹一句的是,一天时间抖音app升级了,昨天写一半的文章,今天在看【搜索】按钮换到了右边,没事,只要页面有【搜索】按钮就可以了。

1240

搜索按钮的xpath

//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.ImageView[1]

3.进入搜索页面后,需要先点击搜索框,如果框中存在“191433445”,直接点击,不存在需要在搜索框中输入“191433445”,然后点击右边的搜索按钮

1240
  1. 输入框红色的xpath
//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]
1240
  1. 黄色的xpath
//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v7.widget.RecyclerView[1]/android.widget.LinearLayout[1]/android.widget.TextView[1]
1240

3.紫色部分搜索按钮xpath

//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.TextView[1]
1240

3.搜索结果页面,点击【用户】,点击【头像】,进入【用户信息界面】。

1240
1240

1.用户xpath

//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.HorizontalScrollView[1]/android.widget.LinearLayout[1]/android.support.v7.app.ActionBar
                $Tab[3]/android.widget.LinearLayout[1]/android.widget.TextView[1]
1240

2.用户xpath

//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]
1240

4.进入【用户信息界面】,点击红色粉丝这个位置。进入粉丝列表

1240

1.粉丝xpath

//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.HorizontalScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[5]/android.widget.LinearLayout[3]/android.widget.TextView[2]
1240

python代码的编写

按照上边的业务逻辑开始代码的编写

                #!/usr/bin/env python 
                import time 
                from appium 
                import webdriver 
                from selenium.webdriver.support.ui 
                import WebDriverWait
cap = { 
                "platformName": 
                "Android", 
                "platformVersion": 
                "4.4.2", 
                "deviceName": 
                "127.0.0.1:62001", 
                "appPackage": 
                "com.ss.android.ugc.aweme", 
                "appActivity": 
                "com.ss.android.ugc.aweme.main.MainActivity", 
                "noReset": 
                True, 
                "unicodeKeyboard":
                True, 
                "resetkeyboard":
                True }
driver = webdriver.Remote(
                "http://localhost:4723/wd/hub",cap) 
                
                def 
                get_size
                (): x = driver.get_window_size()[
                'width']
    y = driver.get_window_size()[
                'height'] 
                return(x,y) 
                try: 
                #点击搜索 print(
                '点击搜索') 
                if WebDriverWait(driver,
                60).until(
                lambda x:x.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.ImageView[1]")):
        driver.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.ImageView[1]").click() 
                except: 
                #[26,76][115,165] driver.tap([(
                26,
                76),(
                115,
                165)],
                500) 
                #定位搜索框 
                if WebDriverWait(driver,
                60).until(
                lambda x:x.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]")): 
                #获取douyin_id进行搜索 driver.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]").send_keys(
                '191433445') 
                while driver.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]").text != 
                '191433445':
        driver.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]").send_keys(
                '191433445')
        time.sleep(
                0.1) 
                #点击搜索 driver.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.TextView[1]").click() 
                #点击用户标签 
                if WebDriverWait(driver,
                10).until(
                lambda x:x.find_element_by_xpath(
                "//android.widget.TextView[@text='用户']")):
    driver.find_element_by_xpath(
                "//android.widget.TextView[@text='用户']").click() 
                #点击头像 
                if WebDriverWait(driver,
                10).until(
                lambda x:x.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]")):
    driver.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]").click() 
                #点击粉丝按钮 
                if WebDriverWait(driver,
                10).until(
                lambda x:x.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.HorizontalScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[5]/android.widget.LinearLayout[3]/android.widget.TextView[2]")):
    driver.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.HorizontalScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[5]/android.widget.LinearLayout[3]/android.widget.TextView[2]").click()
    x1 = int(driver.get_window_size()[
                'width']*
                0.5)
    y1 = int(driver.get_window_size()[
                'height']*
                0.75)
    y2 = int(driver.get_window_size()[
                'height']*
                0.25) 
                while 
                True: 
                if 
                '没有更多了' 
                in driver.page_source: 
                break driver.swipe(x1,y1,x1,y2)
        time.sleep(
                0.5)

PS:因用的是模拟器,导致电脑很卡,如果是真机就好些了,开启usb调试,通过adb devices,查看真机的名称,然后修改python的代码。

1240
蝉知2.0