文章目录
- 1、先了解什么是Hybrid(混合)?
- 2、识别webview
- 3、context上下文
- 4、webview和原生页面之前的切换
- 5、综合练习
我们之前说过的所有操作,都是对原生页面的操作。
在手机APP中,除了原生页面,还是有webview页面(也就是H5页面),下面我们就说说对webview页面的操作。
1、先了解什么是Hybrid(混合)?
移动混合应用程序的App,即在移动应用程序中嵌入了Webview
,通过Webview
访问网页。
移动应用和Webview
分别属于两个不同的上下文,移动应用默认的Context
为”NATIVE_APP”
,Webview
默认的Context
为”WEBVIEW_被测进程名称”
。
在测试Webview
中的网页内容时,需要切换到Webview
的Context
下。(就相当于在app中开启了一个新的页面。)
2、识别webview
- 用
UI Automator Viewer
定位工具查看页面,发现页面上有些区域无法定位到,如下图左边红色区域,只能定位到这个大框框,红色框里面的元素是无法识别的。
- 这时候可以查看元素属性,如图它的
class
属性,上面写着android.webkit.WebView
,那毫无疑问这种页面就是webview了。
3、context上下文
(1)context是中文翻译是上下文,环境。
当然学过selenium的同学,也可以理解为句柄(handle),其实是一回事,反正知道是两个不同的环境就行了。
(2)先获取页面是contexts环境,如下图红色区域,获取的是一个list列表,这个列表包含了该界面中所有的页面,包括原生页面(native)和webview页面。
NATIVE_APP
:这个就是native,也就是原生的页面。
WEBVIEW_com.xxxx
:这个就是webview页面。
(3)当看到打印出来如有['NATIVE_APP', 'WEBVIEW_com.baidu.searchbox']
的信息,就说明获取到webview的context了(当然也有的app有坑,可能明明有webview,却通过contexts获取不到,这种需要特殊处理了)
4、webview和原生页面之前的切换
要想操作webview
上的元素,第一步需要切换环境(跟selenium的切换iframe,切换handle思路是一样)
- 原生页面切换webview方法:
switch_to.context(参数是具体webview的context)
- webview切换原生页面方法:
switch_to.context(原生页面的context)
driver.switch_to.context(contexts[1])
driver.switch_to.context(contexts[0])
5、综合练习
提示:下面练习中,我把android虚拟机的系统换成5.1.1版本了,7.1.2版本的android虚拟机获取不到webview页面的context,未找到原因。
"""
1.学习目标必须掌握APP中webview页面的操作方法
2.操作步骤2.1 webview页面概念----H5页面2.2 识别webview页面借助元素定位工具,如果无法获取页面局部元素,只能定位整个页面,该页面他的class属性值=android.webkit.webview,则该页面是webview页面2.3 操作webview页面---相当于selenium中iframe操作步骤1.获取到webview页面的context获取所有contexts包括原生页面和webviewdriver.contexts获取当前contextdriver.current_context2.进入webviewdriver.swith_to.context(具体webview页面的context值)3.操作webview页面中的元素操作方法和selenium中操作web页面是一致的借助chrome://inspect(需要梯子)操作过程中,注意chromedriver和手机本身浏览器内核版本匹配4.退出webview 等同于进入native回到原生页面driver.switch_to("NATIVE-APP")3.需求在百度appl操作webview页面:微博登录页面
"""
import time
from appium import webdriver
desired_caps = {"platformName": "Android", "platformVersion": "5.1.1", "deviceName": "127.0.0.1:21503", "appPackage": "com.baidu.searchbox", "appActivity": ".MainActivity"
}
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
driver.wait_activity(".MainActivity", 10)
driver.find_element_by_android_uiautomator('new UiSelector().text("未登录")').click()
driver.wait_activity(".MainActivity", 10)
driver.find_element_by_accessibility_id("微博登录").click()
driver.wait_activity("com.sina.weibo.sdk.web.WeiboSdkWebActivity", 15)
contexts = driver.contexts
print(contexts)
driver.switch_to.context(contexts[1])
print(driver.current_context)
time.sleep(5)
username = driver.find_element_by_id("loginName")
username.send_keys("123456")
driver.switch_to.context(contexts[0])
print(driver.current_context)
time.sleep(3)
driver.find_element_by_android_uiautomator('new UiSelector().text("关闭")').click()
time.sleep(3)
driver.quit()