Android自動(dòng)化學(xué)習(xí)5--對(duì)uiautomator2常用操作進(jìn)行封裝

前言

本次我們將會(huì)對(duì) uiautomator2 的一些基本操作進(jìn)行簡單的封裝捺癞,以便更好的應(yīng)用到UI自動(dòng)化中省艳。

重復(fù)多次滑動(dòng)

在 uiautomator2 中朽色,給我們提供了一些滑動(dòng)的操作 swipe(),以及滑動(dòng)擴(kuò)展的操作 swipe_ext(),基于此我們可以對(duì)重復(fù)多次的滑動(dòng)操作進(jìn)行簡單封裝水泉。

    def up(self, scale=0.9, times=1, duration=1.0, **kwargs):
        """
        上滑操作
        :param scale: 滑動(dòng)單位,默認(rèn)0.9個(gè)單位
        :param times: 滑動(dòng)次數(shù)窒盐,默認(rèn)1次
        :param duration: 滑動(dòng)時(shí)間草则,默認(rèn)1.0秒
        :return:
        """
        for i in range(times):
            self.d.swipe_ext("up", scale, duration=duration, **kwargs)

    def down(self, scale=0.9, times=1, duration=1.0, **kwargs):
        """
        下滑操作
        :param scale: 滑動(dòng)單位,默認(rèn)0.9個(gè)單位
        :param times: 滑動(dòng)次數(shù)蟹漓,默認(rèn)1次
        :param duration: 滑動(dòng)時(shí)間,默認(rèn)1.0秒
        :return:
        """
        for i in range(times):
            self.d.swipe_ext("down", scale, duration=duration, **kwargs)

    def left(self, scale=0.9, times=1, duration=1.0, **kwargs):
        """
        左滑操作
        :param scale: 滑動(dòng)單位葡粒,默認(rèn)0.9個(gè)單位
        :param times: 滑動(dòng)次數(shù)份殿,默認(rèn)1次
        :param duration: 滑動(dòng)時(shí)間,默認(rèn)1.0秒
        :return:
        """
        for i in range(times):
            self.d.swipe_ext("left", scale, duration=duration, **kwargs)

    def right(self, scale=0.9, times=1, duration=1.0, **kwargs):
        """
        右滑操作
        :param scale: 滑動(dòng)單位嗽交,默認(rèn)0.9個(gè)單位
        :param times: 滑動(dòng)次數(shù)卿嘲,默認(rèn)1次
        :param duration: 滑動(dòng)時(shí)間,默認(rèn)1.0秒
        :return:
        """
        for i in range(times):
            self.d.swipe_ext("right", scale, duration=duration, **kwargs)

間隔等待元素

我們?cè)谧鯱I自動(dòng)化時(shí)夫壁,如果需要在進(jìn)入某個(gè)APP頁面后點(diǎn)擊元素拾枣,那么一般先會(huì)等待一段時(shí)間,然后再進(jìn)行點(diǎn)擊操作盒让,但是在這個(gè)過程中梅肤,到底等待多長時(shí)間才比較合適,這個(gè)就不太好判斷邑茄。

因此姨蝴,我們可以用另一種思路來實(shí)現(xiàn):

  • 檢查定位元素是否存在
  • 如果定位失敗就間隔一段時(shí)間后重試
  • 循環(huán)以上操作,直到元素定位成功就點(diǎn)擊肺缕,或超時(shí)拋出異常
    def wait_until_element_found(self, param, timeout=30.0, retry_interval=2, wait_after_found=0.0):
        """
        定位元素左医,如果不存在就間隔若干秒后重試授帕,直到元素定位成功或超時(shí)
        :param param: xpath字符串 或 元素對(duì)象
        :param timeout: 超時(shí), 默認(rèn)30秒
        :param retry_interval: 間隔時(shí)間, 默認(rèn)2秒
        :param wait_after_found: 找到元素后,原地等待時(shí)間
        :return:
        """
        element = self.d.xpath(param) if isinstance(param, str) else param
        max_time = time.time() + timeout
        while True:
            try:
                assert element.exists
                if wait_after_found:
                    print("Element found炒辉,then sleep {} seconds".format(wait_after_found))
                time.sleep(wait_after_found)
                return element
            except AssertionError:
                param = param if isinstance(param, str) else param.selector
                print("Element 【 {} 】 Not found, Retry...".format(param))
                if time.time() > max_time > 0:
                    raise AssertionError("Element 【 {} 】 located failed after {} timeout".format(param, timeout))
                time.sleep(retry_interval)

    def wait_for_click(self, param, wait_after_click=0.0, **kwargs):
        """
        判斷UI元素是否存在, 不存在則等待UI元素在一定時(shí)間內(nèi)出現(xiàn)豪墅,再進(jìn)行點(diǎn)擊
        :param param: xpath字符串 或 元素對(duì)象
        :param wait_after_click: 點(diǎn)擊后等待時(shí)間
        :return:
        """
        element = self.wait_until_element_found(param, **kwargs)
        element.click()
        if wait_after_click:
            print("Element found and click泉手,then sleep {} seconds".format(wait_after_click))
        time.sleep(wait_after_click)

重復(fù)多次點(diǎn)擊

在 uiautomator2 中黔寇,給我們提供了一些點(diǎn)擊的操作,如 單擊click()斩萌,雙擊double_click()缝裤,長按long_click() 等,基于此我們可以對(duì)重復(fù)多次的點(diǎn)擊操作進(jìn)行簡單封裝颊郎。

    def repeat_click(self, param, times, wait_after_repeat_click=0.0):
        """
        重復(fù)多次點(diǎn)擊UI元素
        :param param: xpath字符串 或 元素對(duì)象
        :param times: 點(diǎn)擊次數(shù)
        :param wait_after_repeat_click: 重復(fù)點(diǎn)擊后等待時(shí)間憋飞,默認(rèn)為0.0
        :return:
        """
        element = self.wait_until_element_found(param)
        for i in range(times):
            element.click()
        if wait_after_repeat_click:
            print("Element click,then sleep {} seconds".format(wait_after_repeat_click))
        time.sleep(wait_after_repeat_click)

滑動(dòng)查找元素

我們?cè)谧鯱I自動(dòng)化時(shí)姆吭,有時(shí)需要進(jìn)行多次上滑操作榛做,比如我進(jìn)入某個(gè)APP頁面,需要定位是否某個(gè)元素内狸,而這個(gè)元素可能位于頁面中間部分检眯,也可能位于頁面最底部,需滑到頁面底部時(shí)才出現(xiàn)昆淡,又或者頁面上不存在該元素锰瘸,在整個(gè)過程中,我們需在滑動(dòng)的過程中對(duì)元素進(jìn)行定位昂灵。

因此避凝,我們可以用以下思路來實(shí)現(xiàn):

  • 檢查定位元素是否存在
  • 如果定位失敗就進(jìn)行一次滑動(dòng),滑動(dòng)后重試
  • 循環(huán)以上操作眨补,直到滑動(dòng)到頁面底部管削,若該過程中元素定位成功就點(diǎn)擊
    def swipe_until_element_found(self, param, wait_after_found=0.0, **kwargs):
        """
        檢查元素是否存在,若不存在則進(jìn)行上滑撑螺,滑動(dòng)后再次檢查佩谣,直到滑動(dòng)到頁面底部
        若找到元素則返回,否則滑動(dòng)到頁面底部后实蓬,仍未找到元素茸俭,則拋出異常,提示找不到元素
        :param param: xpath字符串 或 元素對(duì)象
        :param wait_after_found: 找到元素后安皱,原地等待時(shí)間
        :param kwargs:
        :return:
        """
        element = self.d.xpath(param) if isinstance(param, str) else param
        param = param if isinstance(param, str) else param.selector
        while True:
            try:
                assert element.exists
                if wait_after_found:
                    print("Element found调鬓,sleep {} seconds".format(wait_after_found))
                time.sleep(wait_after_found)
                return element
            except AssertionError:
                print("Element 【 {} 】 Not found, Continue to swipe up...".format(param))
                # 獲取滑動(dòng)前頁面下半部分的所有元素
                page_content = self.d.dump_hierarchy()[(len(self.d.dump_hierarchy()) // 2):]
                self.up(**kwargs)
                time.sleep(0.5)
                # 獲取滑動(dòng)后頁面下半部分的所有元素,并與上一次滑動(dòng)前的頁面元素對(duì)比酌伊,頁面元素沒有變化時(shí)跳出循環(huán)
                if self.d.dump_hierarchy()[(len(self.d.dump_hierarchy()) // 2):] == page_content:
                    break
        if not element.exists:
            raise AssertionError("Element 【 {} 】 located failed in this page".format(param))

    def swipe_for_click(self, param, wait_after_click=0.0, **kwargs):
        """
        判斷UI元素是否存在, 不存在則持續(xù)向上滑動(dòng)到底部腾窝,直到UI元素在頁面內(nèi)出現(xiàn)缀踪,再進(jìn)行點(diǎn)擊
        :param param: xpath字符串 或 元素對(duì)象
        :param wait_after_click: 點(diǎn)擊后等待時(shí)間
        :return:
        """
        element = self.swipe_until_element_found(param, **kwargs)
        element.click()
        if wait_after_click:
            print("Element found and click,then sleep {} seconds".format(wait_after_click))
        time.sleep(wait_after_click)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虹脯,一起剝皮案震驚了整個(gè)濱河市驴娃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌循集,老刑警劉巖唇敞,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咒彤,居然都是意外死亡疆柔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門镶柱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旷档,“玉大人,你說我怎么就攤上這事歇拆⌒” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵故觅,是天一觀的道長厂庇。 經(jīng)常有香客問我,道長逻卖,這世上最難降的妖魔是什么宋列? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮评也,結(jié)果婚禮上炼杖,老公的妹妹穿的比我還像新娘。我一直安慰自己盗迟,他們只是感情好坤邪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罚缕,像睡著了一般艇纺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邮弹,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天黔衡,我揣著相機(jī)與錄音,去河邊找鬼腌乡。 笑死盟劫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的与纽。 我是一名探鬼主播侣签,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼塘装,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了影所?” 一聲冷哼從身側(cè)響起蹦肴,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猴娩,沒想到半個(gè)月后阴幌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胀溺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年裂七,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皆看。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仓坞。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腰吟,靈堂內(nèi)的尸體忽然破棺而出无埃,到底是詐尸還是另有隱情,我是刑警寧澤毛雇,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布嫉称,位于F島的核電站,受9級(jí)特大地震影響灵疮,放射性物質(zhì)發(fā)生泄漏织阅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一震捣、第九天 我趴在偏房一處隱蔽的房頂上張望荔棉。 院中可真熱鬧,春花似錦蒿赢、人聲如沸润樱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壹若。三九已至,卻和暖如春皂冰,著一層夾襖步出監(jiān)牢的瞬間店展,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工秃流, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赂蕴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓剔应,卻偏偏與公主長得像睡腿,于是被迫代替她去往敵國和親语御。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容