今天上线发现还是有人对appium这块感兴趣的,先谢谢大家的关注和收藏了,您的收藏就是对我最大的支持
今晚也终于有空来水一下 文章了,这一次讲详细介绍appium中的元素定位。
书接上文【appium】appium自动化入门之API(下)——两万字API长文,建议收藏
环境搭建篇【appium】appium自动化入门之环境搭建(上)
2.7 appium 元素定位
前言
appium 定位 app 上的元素,可以通过 ==id,name.class ==这些属性定位到
2.7.1 id 定位
- appium 的id属性也就是通过== UI Automator ==工具查看的 resource-id 属性
- 如上图的定位,就可以通过 id 来定位格式 :
driver.find_element_by_id(" #这 里 是 resource-id")
driver.find_element_by_id("#com.taobao.taobao:id/home_searchedit")
2.7.2 name 定位
-
name 定位就是通过 UI Automator 工具查看的== text 属性== (注意的是:如果 text 属性为空,那就不能通过 name 属性定位了)
-
如上图的定位,就可以通过 name 来定位 格式:driver.find_element_by_name("#这里是 text") driver.find_element_by_name("#搭配新宠不能缺")
2.7.3 class 属性
-
class 定位就是通过 UI Automator 工具查看的 class 属性
-
如上图的定位,就可以通过 class 来定位
格式 :driver.find_element_by_class_name("class 属 性 ") driver.find_element_by_class_name(“android.widget.EditText”)
(注意的是:一般一个页面上的 class 属性不唯一,元素不唯一的话定位会报错了)
2.7.4 accessibility_id
-
accessibility_id 定位就是通过 UI Automator 工具查看的 content-desc 属 性(当然下图这个元素的 content-desc 属性为空,就不能通过这个属性定位了, 这里只是举个例子)
-
如上图的定位,看到 content-desc 属性有值,就可以通过 accessibility_id 来定位了格式:driver.find_element_by_accessibility_id(“#content-desc 的值”) driver.find_element_by_accessibility_id(“#xxx”)
(注:一般一个页面上的 class 属性不唯一,元素不唯一的话定位会报错了)
一般来说上面的这几个定位的,相对而言比较基础,适合一些没代码基础,依靠工具来进行定位的同学
复杂一点的还可以通过== xpath 和 CSS定位==,八大元素里个人觉得就这两个是最全面好用的定位方式。
不过说起来也比较多,就不在这里面细讲了,需要这方面的视频教程可以点击并输入暗号:CSDN或者看大家的收藏吧,收藏高可以出一期八大元素定位专栏
2.8 native 和 webview 切换
前言
现在大部分 app 都是混合式的 native+webview模式,对应 native 上的元素通过 uiautomatorviewer 很容易定位到,webview 上的元素就无法识别了。
2.8.1 识别 webview
-
用定位工具查看页面,发现页面上有些区域无法定位到,如下图左边红色区域, 只能定位到这个大框框,红色框里面的元素是无法识别的。
-
这时候可以查看元素属性,如右图它的 class 属性,上面写着 WebView,那毫 无疑问这种页面就是 webview 了。
2.8.2 contexts
-
context 是中文翻译是上下文,环境,当然学过 selenium 的同学,也可以理解为句柄(handle),其实是一回事,反正知道是两个不同的环境就行了。
-
先获取页面是 contexts 环境,如下图红色区域,获取的是一个 list 列表:
NATIVE_APP:这个就是 native,也就是原生的 WEBVIEW_com.xxxx :这个就是 webview -
当看到打印出来有下图两个,就说明获取到 webview 的context 了(当然也有 的 app 有坑,可能明明有 webview,却通过 contexts 获取不到,这种需要特殊 处理了)
2.8.3 切换到 webview
1.要想操作 webview 上的元素,第一步需要切换环境(跟 selenium 的切换 iframe, 切换 handle 思路是一样)
2.切换方法:switch_to.context(参数是 webview 的context) 由于第二步已经获取到 contexts 是一个 list 对象,取这个 list 的第二个参数 就行,也就是 contexts[1]
2.8.4 切回 native
- webview 上操作完后,想回到native 上操作,这时候需要先切回来,切回native 有两个方法:
方法一
driver.switch_to.context("NATIVE_APP")
# 这个 NATIVE_APP 是固定的参数
方 法 二 :
driver.switch_to.context(contexts[0])
# 从 contexts 里取第一个参数
2.8.5 参考代码
#coding:utf-8
from appium import webdriver
import time
desired_caps = {
'platformName': 'Android',
'deviceName': '30d4e606',
'platformVersion': '6.0',
'appPackage': 'com.baidu.yuedu',
'appActivity':
'com.baidu.yuedu.splash.SplashActivity'}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
time.sleep(30)
# 点图书按钮
driver.find_element_by_id("com.baidu.yuedu:id/righttitle").click()
time.sleep(3)
# 切换到图书界面后获取所有的环境
contexts = driver.contexts
print contexts
# 切 换 到 webview
driver.switch_to.context(contexts[1])
# 获取当前的环境,看是否切换成功
now = driver.current_context
print now
# 切 回 native
driver.switch_to.context(contexts[0])
#driver.switch_to.context("NATIVE_APP") 这样也是可以的
#获取当前的环境,看是否切换成功
now = driver.current_context
print now
2.9 查看 webview 元素
前言
app 上webview 的页面实际上是启用的 chrome 浏览器的内核加载的,如何把手 机的网页加载到电脑上,电脑的 chrome 浏览器上有个开发模式 DevTools,是可 以方便调试的。
环境准备
1.手机上装一个 chrome 浏览器
2.电脑上装 chrome 浏览器
3.手机连电脑 第
2.9.1 启动 adb 服务
- 电脑上打开 chrome 浏览器输入:chrome://inspect/#devices
- 要是没加载到手机设备,就先启动 adb 服务,cmd 输入: >adb devices
2.9.2 DevTools
1.电脑上打开 chrome 浏览器输入:chrome://inspect/#devices
2.Discover USB devices 这个要勾选的,可以检查到手机设备
3.Discover network targets 这个勾选,检查到网络
4.下图箭头指向的,是手机的设备名称
5.Webview in com.baidu.yuedu(39.0.00)这个是手机上浏览器的内核版本号 39 (一般电脑上的 chrome 版本号最好要大于等于这个版本号)
2.9.3 查看元素
-
上图红色框框的两个地址就是加载到的 webview 的网页地址了,点地址下的 inspect 按钮,进入调试界面 (注:这个是需要梯子的)
-
不会爬梯子的也没关系,把对应的 url 地址复制出来,重新打开一个浏览器标 签,输入地址后,按 F12 也可以进调试界面。
-
接下来的元素定位就跟 selenium 的定位是一回事了。
不清楚selenium元素定位的可以点击并输入暗号:CSDN问一下selenium元素定位的视频,或者等我完结appium的文章,再写appium吧(挖坑)
2.9.4 手机版调试
- 上面浏览器打开的是 web 版页面,怎么弄成手机版调试呢?
点下面箭头那个按钮,可以切换成手机版
后话
最后的最后上述代码有出错的,可以先根据错误先百度查看一下,还是解决不了可以点击并输入暗号:CSDN,把你的问题截图发一下,会有大佬带你的
转载:https://blog.csdn.net/Chaqian/article/details/109262791