在App開發過程中,很容易用到第三方的WebView控件,這個屬於移動端混合型App。在我們做自動化測試的過程中,就要對這種情況進行處理,最通用的辦法就是先將appium切換到webview模式然后按查找web元素的方法對WebView里面的元素進行操作即可。具體實施方法,可以參考:http://www.tuicool.com/articles/bIBRZze
可是也有很多情況,如新浪微博第三方授權登錄頁面(如圖一),這個嵌入到App中的第三方WebView,在查上下文信息的時候,找不到對應的WebView。
圖一:網易新聞客戶端新浪微博授權
查找當前可用的上下文信息的時候,用如下代碼:
contexts=self.driver.contexts
for cotext in contexts:
print cotext
根據輸出的信息,如果有WebView信息的時候,可以切換:
driver.switch_to.context("WEBVIEW")
或是 driver.context(“WEBVIEW”)
但是一直找不到WebView信息,如圖二所示,此時就沒有辦法進行切換。
圖二,獲取上下文信息的顯示結果
於是嘗試了各種辦法,都沒有實現。最后只好用以下最笨的辦法了,模擬點擊屏幕:
def test_login(self):
#單擊網易新聞客戶端的登錄按鈕
time.sleep(10)
lgin=self.driver.find_element_by_id("com.netease.newsreader.activity:id/login_icon")
lgin.click()
time.sleep(2) lgbt=self.driver.find_element_by_id("com.netease.newsreader.activity:id/biz_pc_main_info_profile_avatar")
lgbt.click()
time.sleep(2)
#單擊新浪微博的登錄按鈕
sinalg=self.driver.find_element_by_id("com.netease.newsreader.activity:id/sinaweibo_name")
sinalg.click()
#***以下為模擬單擊屏幕操作
time.sleep(3)
#單擊輸入用戶名:sxf
self.driver.tap([(150,588),])
time.sleep(3)
self.driver.tap([(230,1516),])
self.driver.tap([(330,1681),])
self.driver.tap([(440,1516),])
#輸入密碼:123
self.driver.tap([(212,776),])
time.sleep(3)
self.driver.tap([(72,1236),])
self.driver.tap([(180,1236),])
self.driver.tap([(263,1236),])
time.sleep(3)
#單擊登錄按鈕
self.driver.tap([(520,912),])
time.sleep(10)
上面的模擬單擊操作,可以單擊輸入框調出鍵盤,然后再去單擊鍵盤上面的按鈕,達到輸入信息的目的。定位屏幕上面的座標,可以通過網頁:http://bbs.anjian.com/thread-519563-1-1.html 上面的方法。
通過模擬點擊鍵盤操作,可以實現對無法查找到的WebView上面的元素進行操作,可是無法獲取上面元素的內容,無法驗證操作后的結果。這是一個很大的問題,目前在網上查找了一下,也沒有找到好的辦法,可能隨着appium的發展會有解決辦法的。也許有好的辦法,我沒有找到,后續我會努力找到好的解決辦法,到時候再和大家共享。
原文:http://blog.sina.com.cn/s/blog_68f262210102v92p.html


