12.1 什么是混合App
12.1.1 混合app定義
什么是混合app,其實這個不言而喻,我們的app正常來說應該都是native的,但是實際工作中卻不是,反正種種原因我們的app會有native的而且中間還會有H5頁面,這其實就是我們常說的混合,當然還有一種就是純H5的,但是這里我們不做過多的講解。
12.2 混合app實戰思路
12.2.1 代碼實戰
在前面的的章節內嵌h5頁面定位我們就已經講過這個問題,其實本講的內容大家可以仔細把定位的內嵌h5定位問題再回顧一遍那么你就能夠理解這里面的東西,這里會有一個問題是,在我們的app自動化中和web自動化中會有一些區別,這里一些api的用法上需要注意一下。下面我們還是來看一個流程,看下面兩張圖片:
第一張圖片是我們app的原生頁面:
第二張圖片是我們的webview的界面:
我們在前面的章節講過如果我們需要從第一個頁面切換到第二個頁面的時候我們需要進行“context”的切換,只有當我們切換了之后才能夠進行進一步對該頁面進行操作,看下面代碼:
def view(self):#獲取當前頁面所有的contexts time.sleep(5) webview = self.driver.contexts #在獲取到的contexts list里面去挨個循環 for context in webview: #判斷循環中單個的context是否是webview,如果是就進行切換,並且跳出循環 if 'WEBVIEW' in context: self.driver.switch_to.context(context) break self.driver.find_element_by_link_text('JAVA').click()
到目前為止我們是不是就能夠很輕松自由的操作app內嵌的H5頁面了呢。動手操作一下
備注:如果你用真機一直無法切換,不要激動這個很正常,用模擬器試一試,因為真機有很多限制,你可以嘗試root后去試一試。
12.3 混合app實戰
上面的知識我相信大家很容易都懂了,但是在實際操作中大家會遇見一個起碼的問題,上面問題看我們下面講解,在我們正常的操作情況下我們是不是操作完第二個頁面是否應該關閉該頁面然后直接去操作其它頁面呢?於是乎就有了我們下面的代碼:
def view(self):#獲取當前頁面所有的contexts time.sleep(10) webview = self.driver.contexts #在獲取到的contexts list里面去挨個循環 for context in webview: #判斷循環中單個的context是否是webview,如果是就進行切換,並且跳出循環 if 'WEBVIEW' in context: self.driver.switch_to.context(context) break self.driver.find_element_by_link_text('JAVA').click() #關閉按鈕定位 self.driver.find_element_by_id("cn.com.open.mooc:id/left_icon").click
動了手的小伙伴就知道問題了,你們無論如何都操作不了這個關閉按鈕或者是關閉了操作不了其他頁面的元素,上面的代碼無論如何到關閉的時候都報錯,對吧!但是你仔細思考會發現,我們前面講了在我們從原生的app中切換到h5頁面的時候都經過了切換,那么現在的driver是不是還是處於h5的呢?思考思考思考!!!你driver都還在h5家里,然后你讓他去操作原來家里的東西能行嗎?答案肯定是否定的,所以這個時候你又需要將driver切換到原來的driver。
思考:如果你的app有超級多的h5 頁面然后在測試過程中你是不是需要進行不斷的切換?麻煩嗎?肯定啊。你每次切換都需要去寫這個方法你不嫌棄累我都嫌棄累。so,我們這里是不是需要思考解決方案?那么之前我們python說的函數封裝是不是起到作用了呢?這里給大家留一個思考題,如果做到高效的封裝。
備注:這個在工作中經常用到,大家一定去動手練習一下這個思考題。
提示:笨一點的方法是封裝成兩個方法,好一點封裝成一個方法,然后通過傳遞參數的形式去實現。