常規方法
正常來說,常規的方法應該是使用UI Automator Viewer來探測頁面的元素,比如下面這樣:

但是,如果是混合開發,就會出現只有一個webview元素的情況,正常的方法無法定位。比如這樣: 
常規的方法是沒辦法定位出這部分內容,只有一個webview,無法像原生一樣獲取內容。
取巧的辦法
如果針對H5的元素,只需要點擊的話,可以這么做,比如上文我們的開戶頁面,我們需要做的只是在這個頁面上點擊立即開戶,跳轉到下一個頁面,我們可以用這種取巧的方法:
1.self.driver.get_name('立即開戶').click()
這樣的代碼,也是可以實現的,當然,上面的get_name我是進行封裝了的,原來的代碼是:
1.def get_name(self, name): 2.element = self.driver.find_element_by_name(name) 3.return element
更優化的處理方式
既然是H5頁面,如果能夠獲取HTML代碼就好了,那么就可以使用操作DOM的方式來操作這個H5。
谷歌瀏覽器:版本 49.0.2623.87 (64-bit)
我用的谷歌瀏覽器是這個版本,把手機連接上電腦,在谷歌瀏覽器中輸入這個代碼:
1.chrome://inspect
點擊這個按鈕:

神奇的一幕出現了,所有的代碼都展示在你面前。就像web一樣調試混合APP中的H5.
切換webdriver
雖然解決了html代碼的問題,但是另一個問題出現了,我們要怎么去操作DOM。常規的方法是沒辦法了,只能操作原生的,這個時候我們需要把webdriver切換成H5的,而不是原生的。
其實原理很簡單,只要把webdriver切換到H5的方式就行了。使用如下代碼:
contexts
contexts(self):
Returns the contexts within the current session. 返回當前會話中的上下文,使用后可以識別H5頁面的控件
:Usage: driver.contexts 用法 driver.contexts
調用這個方法后,把結果打印出來,你會發現是一個列表,列表中的第一個是NATIVE_APP,這個就表示現在的webdriver是調用原生的功能,我們使用這個命令切換一下就行了。
def switch_h5(self): self.driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {"name": "WEBVIEW_com.weizq"}) def switch_app(self): self.driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {"name": "NATIVE_APP"})
第一個函數就是封裝切換到H5的方法,name對應的東西就是通過contexts列表中打印出來的東西,當然你也可以使用其他的方法封裝。
切換到H5的webdriver之后,再使用driver.find_element_by_id試試?現在就變成查找DOM相關的功能了,再調用第二個函數,又切回原生的webdriver了。
