最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談如何使用Python控制手機(jī)(二)

 更新時間:2021年11月16日 14:56:38   作者:蘇蘇與阿言  
這篇文章主要為大家介紹了如何使用Python控制手機(jī),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1. 序言

每年淘寶雙十一的時候,總是要刷各種各樣的瀏覽頁面,收集能量或者喵幣或者什么。

那既然如此,我就總想著,能否通過Python自動調(diào)用的方式來刷網(wǎng)頁。

2. 前置工作

本文是基于使用Python控制手機(jī)(一),默認(rèn)已經(jīng)安裝了ADB并配置了環(huán)境變量,安裝了Python環(huán)境,且在Python中安裝了uiautomator2和weditor等包。

3. 打開APP

當(dāng)我們使用uiautomator2包來打開某個APP時,可以通過點(diǎn)擊屏幕特殊位置的方式來實(shí)現(xiàn)。但是其中存在的問題便是,可能由于我們APP圖標(biāo)的移動,而使得程序無法運(yùn)行。健壯性和通用性不高。

其實(shí)在uiautomator2這個包中,提供了一種可以通過APP包名就可以打開特定APP的方式,例如打開和關(guān)閉淘寶。

import uiautomator2 as u2
import time
d = u2.connect()  # 連接設(shè)備
d.app_start("com.taobao.taobao")  # 打開淘寶
time.sleep(10)  # 等待10秒鐘
d.app_stop("com.taobao.taobao")  # 關(guān)閉淘寶

再比如打開和關(guān)閉微信:

import uiautomator2 as u2
import time
d = u2.connect()  # 連接設(shè)備
d.app_start("com.tencent.mm")  # 打開微信
time.sleep(10)  # 等待10秒鐘
d.app_stop("com.tencent.mm")  # 關(guān)閉微信

4. 獲取APP的包名

有的時候,我們是不太清楚一個APP的包名的,這時我們可以通過打印設(shè)備當(dāng)前信息的方式來獲取APP的包名。首先我們需要將要獲取的APP打開,并且保持在手機(jī)最前臺

執(zhí)行代碼:

import uiautomator2 as u2
import time
d = u2.connect()  # 連接設(shè)備
print(d.info)  # 打印設(shè)備信息

輸出結(jié)果如下:

{'currentPackageName': 'com.taobao.taobao', 'displayHeight': 2111, 'displayRotation': 0, 'displaySizeDpX': 393, 'displaySizeDpY': 851, 'displayWidth': 1080, 'productName': 'cannon', 'screenOn': True, 'sdkInt': 29, 'naturalOrientation': True}
Process finished with exit code 0

在所打印的Json鍵值對中,鍵currentPackageName對應(yīng)的值,即為此時正在最前臺的APP的包名,上述結(jié)果操作時,正在最前的APP為淘寶。

5. 打開特定頁面

一般來說,如果頁面切換按鈕含有特定文字,我們直接通過文字進(jìn)行定位是最方便的,也是最準(zhǔn)確的,比如打開微信朋友圈:

import uiautomator2 as u2
import time
d = u2.connect()  # 連接設(shè)備
d.app_start("com.tencent.mm")  # 打開微信
time.sleep(2)  # 等待2秒鐘
d(text='發(fā)現(xiàn)').click()  # 點(diǎn)擊文字為“發(fā)現(xiàn)”的控件
time.sleep(2)  # 等待2秒鐘
d(text='朋友圈').click()  # 點(diǎn)擊文字為“朋友圈”的控件

因?yàn)榭赡艽嬖诘?,APP的加載時間和對點(diǎn)擊操作的響應(yīng)時間,盡量在每次點(diǎn)擊操作之后,為APP和手機(jī)留有足夠的反應(yīng)時間。值得注意的是,如果打開微信之后,恰好有個常用聯(lián)系人的昵稱叫做“發(fā)現(xiàn)”,那就可能會被誤點(diǎn),這種情況下我們需要使用別的定位方式來定位特定控件。

需要點(diǎn)擊的文字如果是固定的,就可以使用d(text="XXX")來選擇控件元素,其中XXX為特定的文字。如果部分文字是固定的,比如第一次元素顯示文字為“我是第11932位訪客”,第二次顯示文字為“我是第12111位訪客”,那我們可以通過d(textContains="我是第").click()來點(diǎn)擊這個控件,或者通過d(textContains="位訪客").click()來點(diǎn)擊這個控件,這種方式就可以通過子字符串來定位特定的元素控件。

還是使用進(jìn)入朋友圈舉例:

import uiautomator2 as u2
import time
d = u2.connect()  # 連接設(shè)備
d.app_start("com.tencent.mm")  # 打開微信
time.sleep(2)  # 等待2秒鐘
# 點(diǎn)擊“發(fā)現(xiàn)”,三選一
d(text='發(fā)現(xiàn)').click()  # 點(diǎn)擊文字為“發(fā)現(xiàn)”控件
d(textContains='發(fā)').click()  # 點(diǎn)擊帶“發(fā)”的控件
# 通過WEditor獲得的xpath定位
d.xpath('//*[@resource-id="com.tencent.mm:id/e8y"]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[3]/android.widget.LinearLayout[1]').click()  
time.sleep(2)  # 等待2秒鐘
# 點(diǎn)擊“朋友圈”,三選一
d(text='朋友圈').click()  # 點(diǎn)擊文字為“朋友圈”控件
d(textContains='朋').click()  # 點(diǎn)擊帶“朋”的控件
# 通過WEditor獲得的xpath定位
d.xpath('//*[@resource-id="android:id/list"]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]').click()

其實(shí)還有很多各不相同的定位方式,只要能定位到唯一的特定的控件進(jìn)行點(diǎn)擊即可。例如在雙十一時,我在淘寶中切換到收集喵幣頁面的點(diǎn)擊事件:

import uiautomator2 as u2
import time
d = u2.connect()  # 連接設(shè)備
d.app_start("com.taobao.taobao")  # 打開淘寶
time.sleep(5)  # 等待5秒鐘
d.xpath('//*[@content-desc="雙11超級喵糖"]').click()  # 打開喵糖頁面

6. 其它細(xì)節(jié)

在雙十一淘寶活動中,打開喵糖頁面,會先彈出提示是否將此頁面加入收藏的彈框,點(diǎn)擊文字為“我再想想”的按鈕。注意要判斷此控件是否存在,點(diǎn)擊不存在的控件將會報錯。如果不確定一個控件是否存在,又不想判斷的情況下,則需要使用 try......catch...... 來將其包裹。

if len(d(textContains='我再想想')) > 0:  # 如果存在此控件
    d(textContains='我再想想').click()  # 點(diǎn)擊“我再想想”

點(diǎn)擊“賺糖”控件,因?yàn)檫@個控件經(jīng)常會被屏幕上出現(xiàn)的手指動畫所擋住,因此需要等待:

while len(d(textContains='賺糖')) <= 0:
    time.sleep(1)
d(textContains='賺糖').click()

然后點(diǎn)擊完后等會兒,再點(diǎn)擊“去瀏覽”按鈕:

while len(d(textContains='去瀏覽')) > 0:
    print("檢測到瀏覽按鈕...")
    d(textContains='去瀏覽').click()

等待15秒(算上反應(yīng)時間,需要多等一會兒)返回即可:

d.press("back")  # 相當(dāng)于手機(jī)返回鍵

7. 總結(jié)

其實(shí)具體的部分實(shí)現(xiàn)起來比較簡單,在此總結(jié)一下uiautomator2 的其它一些功能。

關(guān)于按鍵:

d.press("home")         # 點(diǎn)擊home鍵
d.press("back")         # 點(diǎn)擊back鍵
d.press("left")         # 點(diǎn)擊左鍵
d.press("right")        # 點(diǎn)擊右鍵
d.press("up")           # 點(diǎn)擊上鍵
d.press("down")         # 點(diǎn)擊下鍵
d.press("center")       # 點(diǎn)擊選中
d.press("menu")         # 點(diǎn)擊menu按鍵
d.press("search")       # 點(diǎn)擊搜索按鍵
d.press("enter")        # 點(diǎn)擊enter鍵
d.press("delete")       # 點(diǎn)擊刪除按鍵
d.press("recent")       # 點(diǎn)擊近期活動按鍵
d.press("volume_up")    # 音量+
d.press("volume_down")  # 音量-
d.press("volume_mute")  # 靜音
d.press("camera")       # 相機(jī)
d.press("power")        # 電源鍵

關(guān)于鎖屏與解鎖:

# 一個設(shè)備信息字典中的布爾值,為true時代表當(dāng)前屏幕亮起,為false代表當(dāng)前屏幕熄滅
d.info.get('screenOn')
# 僅點(diǎn)亮屏幕
d.screen_on()
# 點(diǎn)亮屏幕并解鎖,注意如果有密碼,則只能進(jìn)入密碼輸入頁面,需要輸入密碼才能解鎖
d.unlock()  
# 關(guān)閉屏幕
d.screen_off()

關(guān)于點(diǎn)擊等操作(支持百分比):

# 單擊屏幕
d.click(x,y)  # x,y為點(diǎn)擊坐標(biāo)
# 雙擊屏幕
d.double_click(x, y)
d.double_click(x, y, 0.1)  # 默認(rèn)兩個單擊之間間隔時間為0.1秒
# 長按
d.long_click(x, y)
d.long_click(x, y, 0.5)  # 長按0.5秒(默認(rèn))
# 滑動
d.swipe(sx, sy, ex, ey)
d.swipe(sx, sy, ex, ey, 0.5)  # 滑動0.5秒(默認(rèn))
#拖動
d.drag(sx, sy, ex, ey)
d.drag(sx, sy, ex, ey, 0.5)  # 拖動0.5秒(默認(rèn))
# 滑動點(diǎn) 多用于九宮格解鎖,提前獲取到每個點(diǎn)的相對坐標(biāo)(這里支持百分比)
# 從點(diǎn)(x0, y0)滑到點(diǎn)(x1, y1)再滑到點(diǎn)(x2, y2)
# 兩點(diǎn)之間的滑動速度是0.2秒
d.swipe((x0, y0), (x1, y1), (x2, y2), 0.2)
# 注意:單擊,滑動,拖動操作支持百分比位置值。例:
d.long_click(0.5, 0.5) 表示長按屏幕中心

當(dāng)然還有其它的一些功能,例如向上滑動屏幕,直到指定文字出現(xiàn)為止:

d(scrollable=True).scroll.to(text="3年級2班")

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 使用Python設(shè)置、更改及移除Word文檔密碼

    使用Python設(shè)置、更改及移除Word文檔密碼

    給Word文檔設(shè)置打開密碼是常見的Word文檔加密方式,如果我們需要對大量的Word文檔進(jìn)行加密、解密處理,Python是一個不錯的選擇,本文將介紹如何使用Python設(shè)置、更改或移除Word文檔的加密,需要的朋友可以參考下
    2024-03-03
  • Python讀取表格類型文件代碼實(shí)例

    Python讀取表格類型文件代碼實(shí)例

    這篇文章主要介紹了Python讀取表格類型文件代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • python自動化工具之pywinauto實(shí)例詳解

    python自動化工具之pywinauto實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了python自動化工具之pywinauto實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • python如何處理matlab的mat數(shù)據(jù)

    python如何處理matlab的mat數(shù)據(jù)

    這篇文章主要介紹了python如何處理matlab的mat數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 分享python機(jī)器學(xué)習(xí)中應(yīng)用所產(chǎn)生的聚類數(shù)據(jù)集方法

    分享python機(jī)器學(xué)習(xí)中應(yīng)用所產(chǎn)生的聚類數(shù)據(jù)集方法

    本文根據(jù) 機(jī)器學(xué)習(xí)中常用的聚類數(shù)據(jù)集生成方法 中的內(nèi)容進(jìn)行編輯實(shí)驗(yàn)和整理而得,有需要的朋友可以參考想,希望可以對大家在聚類數(shù)據(jù)方面有所幫助
    2021-08-08
  • 關(guān)于DataFrame中某列值的替換map(dict)

    關(guān)于DataFrame中某列值的替換map(dict)

    這篇文章主要介紹了關(guān)于DataFrame中某列值的替換map(dict),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python在不同目錄下導(dǎo)入模塊的實(shí)現(xiàn)方法

    Python在不同目錄下導(dǎo)入模塊的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄狿ython在不同目錄下導(dǎo)入模塊的實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • python中@contextmanager裝飾器的用法詳解

    python中@contextmanager裝飾器的用法詳解

    這篇文章主要介紹了python中@contextmanager裝飾器的用法詳解,@contextmanager 的作用就是我們可以把一個非自定義類改成一個上下文管理器,需要的朋友可以參考下
    2023-07-07
  • 淺析如何使用Python構(gòu)建桌面圖片瀏覽器

    淺析如何使用Python構(gòu)建桌面圖片瀏覽器

    這篇文章主要為大家詳細(xì)介紹了如何使用Python構(gòu)建一個簡單的桌面圖片瀏覽器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • 利用pygame完成動畫精靈和碰撞檢測

    利用pygame完成動畫精靈和碰撞檢測

    這篇文章主要介紹了利用pygame完成動畫精靈和碰撞檢測,代碼詳細(xì),內(nèi)容豐富,對于想要學(xué)習(xí)pygame的朋友來講是一個不錯的練習(xí),需要的朋友可以參考下
    2021-04-04

最新評論

太湖县| 忻城县| 山丹县| 灵寿县| 隆林| 垦利县| 徐州市| 安宁市| 清流县| 祁阳县| 汕尾市| 新龙县| 平阳县| 张家港市| 东丰县| 闽侯县| 崇州市| 毕节市| 株洲市| 嘉定区| 新闻| 扬州市| 房山区| 阿巴嘎旗| 安阳市| 平邑县| 伊吾县| 重庆市| 黄大仙区| 罗甸县| 内黄县| 深水埗区| 华安县| 金秀| 曲阜市| 扶绥县| 柘荣县| 梓潼县| 邯郸县| 汉寿县| 留坝县|