UI自動化測試-彈窗處理

最近在解決歷史遺留問題-彈窗,也是感觸頗多。以前由於趕項目,就把彈窗問題的優先級下降了,如今到了多設備(幾十臺)並行執行,彈窗問題就變成了當務之急了。那麼,先看看彈窗類型:安裝彈窗、系統彈窗、應用內部彈窗。通常來講須要處理的是這三種類型的彈窗。python

  • 安裝彈窗: 通常出如今小米手機上。安裝時候會提示是否安裝的彈窗;
  • 系統彈窗:啓動的應用的時候,系統會彈GPS、獲取聯繫人信息之類的彈窗。這個要具體問題具體分析,要看你應用須要獲取哪些權限 ;
  • 應用內部彈窗:使用應用的過程當中出現的彈窗

在安裝彈窗中須要處理的有:1.Appium默認安裝的apk彈窗,2.安裝被測應用時出現的彈窗。如何處理這類型的彈窗?咱們的處理方法是交給UI框架去處理。android

  1. 把appium運行時須要安裝的settings_apk_debug.apk與unlock_apk_debug.apk這兩個APK抽取出來又UI框架去安裝,這兩個APK安裝時候出現的彈窗由UI框架處理,處理方式是:線程,一邊安裝一邊檢測是否有彈窗。
    def install_unlock_apk(device,useless):
        # the unlock_apk path
        unlock_apk_path = the_path + os.path.join(os.path.sep, "TEST", "bin", "unlock_apk-debug.apk")
        packageList = []
        packages = os.popen('adb -s {0} shell pm list packages'.format(device))
        for package in packages:
            packageName = package.split(':')[-1].splitlines()[0]
            packageList.append(packageName)
    
        if 'io.appium.unlock' not in packageList:
            os.popen('adb -s {0} install {1}'.format(device, unlock_apk_path))
    def protect(device,useless):
    
         path_to_jar = the_path + os.path.join(os.path.sep,"TEST","data","xiaomiJar.jar")
         os.popen('adb -s {0} push {1} /data/local/tmp' .format(device, path_to_jar))
         os.popen('adb -s {0} shell uiautomator runtest  xiaomiJar.jar --nohup -c  com.ppmoney.testcases.InstallButtonClicker' .format(device))
    install_unlock_apk = threading.Thread(target=install_unlock_apk, args=(device, ""))
    protect1 = threading.Thread(target=protect, args=(device, ""))

    備註:這裏須要用到jar包,這個jar包是具體的處理彈窗的方法。因爲python沒有自帶的uiautomator庫,因此用回Java去處理,總得來講,彈窗是由uiautomator去處理。shell

  2. 被測應用的安裝也由UI框架去處理,appium不負責安裝應用,安裝時出現的彈窗也由UI框架去處理,處理方式是:線程,一邊安裝一邊檢測是否有彈窗:
    install = threading.Thread(target=install_apk, args=(device, apk))
    protect3 = threading.Thread(target=protect, args=(device, ""))

     

系統彈窗:啓動應用時,出現的權限彈窗。處理方式:啓動應用以後,去判斷彈窗是否存在,若是存在就點擊,不存在就開始執行用例。windows

def click_shoot_windows(self):

         try:

            els = self.driver.find_elements_by_class_name('android.widget.Button')
            for el in els:
                if el.text == u'容許':
                    self.driver.find_element_by_android_uiautomator('new UiSelector().text("容許")').click()
                elif el.text == u'始終容許':
                    self.driver.find_element_by_android_uiautomator('new UiSelector().text("始終容許")').click()
                elif el.text == u'肯定':
                    self.driver.find_element_by_android_uiautomator('new UiSelector().text("肯定")').click()
         except:

             pass

 

應用內部:同上處理方式。用例執行的時候,一邊執行一邊判斷是否有彈窗。app

相關文章
相關標籤/搜索