9 webview查找元素
9.1 webview 简介
WebView是android中一个非常重要的控件,它的作用是用来展示一个web页面。它使用的内核是webkit引擎,4.4版本之后,直接使用Chrome作为内置网页浏览器。
9.2 移动端应用
移动端,一般分为三种应用:
Native应用:就是安卓的原生应用,普通APP。文件自带的文件管理、设置等APP
Web应用:需要依托浏览器展示的网页应用,比如微信里的公众号、商城
混合应用:也就是结合了原生和网页应用,在原生应用中嵌入网页。很多APP都是这样的,比如淘宝等
那么为什么是要使用webview呢?前面第二章讲过UIAutomatorViewer的使用,UIAutomatorViewer是用来识别安卓原生应用的,它识别不到web网页的内容。所以如果你要测试的APP有网页应用,就需要用到webview来识别控件的id、name等信息。
ps:如果确定这个APP的页面是不是网页,一般情况下,长按文字可以出现复制粘贴的,网络不好的时候会出现一个缓慢加载的过程等一般都是web应用。
9.3使用webview查找元素
第一种方式需要翻墙:
1.将手机连接到电脑上,打开USB调试,去cmd中输入adb devices会显示你的设备已连接
2.然后你打开要测试的网页版的APP,比如我打开微信里的一个商城
3.从电脑端,打开chrome浏览器,输入chrome://inspect,打开,会显示你的手机型号,以及你打开的网页
注意:1.如果你查找的不是web网页,webview是不会显示的,所以如果没显示,首先看下自己的页面是不是网页版;2.如果连手机型号都没出来,那说明手机没有连接上,重新关闭usb调试再打开试试,还是不行确定一下自己的驱动是不是装好了;3.这个只能适用安卓4.4版本以上的手机
4.点击inspect,就会出来如图:
5.点击图中的箭头,左侧是页面,右侧显示的是控件的信息。想看哪个APP,在手机上打开哪个APP即可。
如果不能翻墙,还有一个方法就是将网页链接复制到电脑的浏览器,从电脑浏览器打开网页,点击右键--检查/查看元素,也可以找到元素信息。和之前selenium一样。
9.4 appium查找网页元素
找到了元素信息后,如何写代码让appium自动去找呢?
连接手机的代码和find_element_XX都是一样的,只是有一个地方需要注意,appium默认都是按照原生应用查找的,如果想让它查找网页应用,就要告诉它接下来要查找网页应用了,用switch_to.context()方法:
#coding=utf-8 from appium import webdriver import time """连接手机,获取driver""" server = r'http://localhost:4723/wd/hub' # Appium Server, 端口默认为4723 desired_capabilities = { 'platformName': 'Android', 'deviceName': '127.0.0.1:62001', 'platformVersion': '10', 'appPackage': 'com.ddsy.songyao', 'appActivity': '.activity.MainActivity', 'unicodeKeyboard': True, 'reserKeyBoard': True, 'noReset': True, 'fullReset': False } driver = webdriver.Remote(server, desired_capabilities) # 连接手机和APP time.sleep(3) # 点击首页某个元素进入到某个网页版页面 driver.find_element_by_xpath("//*[contains(@bounds, '[360,676][720,837]')]").click() time.sleep(5) # 获取当前网页页面的contexts contexts = driver.contexts for i in contexts: print(i) # 打印的contexts结果: # NATIVE_APP # 一般情况原生的应用都是这个context # WEBVIEW_com.android.browser # 网页应用的context都是‘WEBVIEW_’开头的 # 如果你的当前页面是原生的,那么只会打出来NATIVE_APP # 告诉appium接下来找到元素是网页的元素 driver.switch_to.context("WEBVIEW_com.android.browser") # 下面的方法就一样了
driver.find_element_by_id("网页元素的id").click()
driver.find_element_by_xpath("//*[contains(@text, 'xxx").sendkeys('xx') #接下来回到原生应用
driver.switch_to.context("NATIVE_APP")
driver.find_element_by_id("安卓原生的id")