appiumマルチデバイス、再接続最適化オープンソース

7881 ワード

前にPageObject+Python+Appiumを共有しました
このバージョンは前回のバージョンに対して大きく変更され、主に解決されました.
  • 失敗再接続1回(デフォルト1回)複数回構成可能
  • appium 1に基づく.7.1 uiautomator2
  • uiautomator 2起動タイムアウト
  • の解決
  • 新しいチェックポイントキーワード、contrary_getval,exceptsl,contraryはymlプロファイルにしばらく書かずpageレイヤに直接書かれています
  • チェックポイントキーワードcontrary:反対にチェックポイント、伝1はチェック要素が存在する場合は失敗を示し、削除後も
  • が存在する.
  • チェックポイントキーワードtoast:プロンプトボックスチェックポイント
  • を示す.
  • チェックポイントキーワードcontrary_getval:反対の値チェックポイント、比較に成功した場合は
  • に失敗しました.
  • チェックポイントキーワードcheck:カスタムチェック結果
  • チェックポイントキーワードexcepts:1の場合、操作に異常が発生したことを示すチェックポイントが成功します.削除に成功した場合、このデータが存在しない場合は真
  • 試験報告書は複数台の試験機の結果統計(アンドロイド)
  • を追加した.
  • mac、windowsプラットフォーム
  • 適切iosテスト(簡単なデバッグに合格し、後で実際に使用し、最適化する機会がある)
  • コードプロファイル
    ymlテスト例
    testinfo:
        - id: test004
          title:           
          info:     
    testcase:
    
        - element_info: com.huawei.works.knowledge:id/title
          find_type: ids
          index: 0
          operate_type: get_value
          info:              
        - element_info: com.huawei.works.knowledge:id/title
          find_type: ids
          index: 0
          operate_type: click
          is_time: 3
          info:              
        - element_info: h5-scroll
          find_type: id
          is_webview: 1 #    webview
          info:           
        - element_info: com.huawei.works.knowledge:id/vtb_img_left
          find_type: id
          is_webview: 2 #    native
          operate_type: click
          info:       
        - element_info: com.huawei.works.knowledge:id/vtb_img_right2
          find_type: id
          operate_type: click
          info:           
    check:
        - element_info: com.huawei.works.knowledge:id/browser_knowledge_history_text
          find_type: ids
          index: 0
          operate_type: get_value
          info:           
    

    ある例のpageレイヤ
    from PageObject import Pages
    
    
    class DayNewHistoryPage:
        '''
                
        '''
    
        def __init__(self, kwargs):
            _init = {"driver": kwargs["driver"], "path": kwargs["path"], "device": kwargs["device"],
                     "logTest": kwargs["logTest"], "caseName": kwargs["caseName"]}
            self.page = Pages.PagesObjects(_init)
    
        def operate(self):  #     
            self.page.operate()
    
        def checkPoint(self):  #    
            self.page.checkPoint()
    
  • pagesは再び1層パッケージされ、主に再接続メカニズムの実現を見ることができる.
  • 実は主にlaunchを使っています.app+setupclass、もう一つの利点は、使用例依存を回避し、session
  • を再起動しないことです.
      if result is not True and be.RE_CONNECT:
                self.msg = "         ,    :" + self.testInfo[0]["msg"]
                self.logTest.buildStartLine(self.caseName + "_    ")  #     
                self.operateElement.switchToNative()
                self.driver.launch_app()
                self.isOperate = True
                self.get_value = []
                self.is_get = False
                self.operate() #     
                result = self.check(kwargs) #    
                self.testInfo[0]["msg"] = self.msg
            self.operateElement.switchToNative()
    

    testcaseレイヤ呼び出しpageレイヤ
    class HomeTest(ParametrizedTestCase):
        #     
        def testAHomeSwipeDown(self):
            app = {}
            app["logTest"] = self.logTest
            app["driver"] = self.driver
            app["path"] = PATH("../yaml/home/HomeSwipeDown.yaml")
            app["device"] = self.devicesName
            app["caseName"] = sys._getframe().f_code.co_name
    
            page = HomeSwipeDownPage(app)
            page.operate()
            page.checkPoint()
    
        # banner      
        def testB0annerHistory(self):
            app = {}
            app["logTest"] = self.logTest
            app["driver"] = self.driver
            app["path"] = PATH("../yaml/home/BannerHistory.yaml")
            app["device"] = self.devicesName
            app["caseName"] = sys._getframe().f_code.co_name
            page = BannerHistoryPage(app)
            page.operate()
            page.checkPoint()
    
        @classmethod
        def setUpClass(cls):
            super(HomeTest, cls).setUpClass()
    
        @classmethod
        def tearDownClass(cls):
            super(HomeTest, cls).tearDownClass()
    

    コードエントリ
    def runnerCaseApp(devices):
        starttime = datetime.now()
        suite = unittest.TestSuite()
        suite.addTest(ParametrizedTestCase.parametrize(HomeTest, param=devices))
        suite.addTest(ParametrizedTestCase.parametrize(TestWeiQunTest, param=devices))
        unittest.TextTestRunner(verbosity=2).run(suite)
    

    面倒なケース
  • いくつかの使用例に遭遇すると、交換空間位置
  • を長押しするなど、page層を単独で書かなければならない.
  • カスタムpageレイヤ
  • .....
        def operate(self):
            for item in self.testCase:
                m_s_g = self.msg + "
    " if self.msg != "" else "" result = self.operateElement.operate(item, self.testInfo, self.logTest, self.device) if not result["result"]: msg = " , " + item["element_info"] print(msg) self.msg = m_s_g + msg self.testInfo[0]["msg"] = msg self.isOperate = False return False if item.get("operate_type", "0") == "location": app = {} web_element = self.driver.find_elements_by_id(item["element_info"])[item["index"]] start = web_element.location # app["startX"] = start["x"] app["startY"] = start["y"] # size1 = web_element.size width = size1["width"] height = size1["height"] # endX = width + app["startX"] endY = height + app["startY"] app["endX"] = endX - 20 app["endY"] = endY - 60 self.location.append(app) # self.driver.swipe(endX, endY, starty, endY) if item.get("operate_type", "0") == be.GET_VALUE: self.get_value.append(result["text"]) if item.get("is_swpie", "0") != "0": print(self.location) self.driver.swipe(self.location[0]["endX"], self.location[0]["endY"], self.location[1]["endX"], self.location[1]["endY"]+10)
  • yamlの例では、page用
  • のキーワードをカスタマイズできます.
    testinfo:
        - id: test019
          title:         
          info:     
    testcase:
        - element_info: com.huawei.works.knowledge:id/vtb_img_right
          find_type: id
          operate_type: click
          info:         
        - element_info: com.huawei.works.knowledge:id/my_card_item_name_text
          find_type: ids
          index: 1
          operate_type: get_value
          info:          
        - element_info: com.huawei.works.knowledge:id/drag_item_image
          find_type: ids
          index: 0
          operate_type: location
          info:          
        - element_info: com.huawei.works.knowledge:id/drag_item_image
          find_type: ids
          index: 1
          operate_type: location
          is_swpie: 1 #      ,    
          info:              
        - element_info: com.huawei.works.knowledge:id/vtb_img_left
          find_type: id
          operate_type: click
          info:       
    check:
        - element_info: com.huawei.works.knowledge:id/title_txt
          find_type: id
          operate_type: get_value
    

    その他
  • ちなみにフロートに遭遇してクリックできません
  • フローティングレイヤは、要素を認識することができ、クリックをトリガーしたが失効する処理方法は、要素座標を取得し、adb shell方式でトリガーすることであり、興味のあるものはadb_を見ることができる.tapキーワードのパッケージ
  • 他の最適化は私のCHANGELOG
  • を見ることができます
  • オープンソースアドレス
  • 関連ディスカッション:https://testerhome.com/topics/11720