在web测试中,可以使用F12辅助元素定位,但在app中没有这样的工具,需要安装第三方的工具
目前主流的工具有:
- android uiautomatorviewer
- weditor
- appium inspect
这三种都不是特别好用,所以才会介绍三种一块辅助进行元素定位
1.appium inspect打开后,设置所需能力(就是我们代码中编写的cpas内容),设置完成后点击【启动会话】按钮
可以看到跟我们手机端上的首页是一致的,点击左边的某个元素,可以显示出对应的元素相关内容
可以看到App Source中一层一层嵌套很多层内容,这个是xml格式代码,跟html树型结构类似
xml和html区别:
- 第一点:html是用来展示内页,xml格式展示的是安卓页面,
- 第二点:xml中的标签名称是可以随便命名的,而html中每个标签名称是固定好的,作用也是固定好的
安卓的源码结构:
元素属性:
- emementid 每个元素都有一个,没太大作用
- index 索引
- package 包名
- class 是元素种类,对应于html的tagname
- text 属于元素的属性
- resource-id 不一定唯一(柠檬班app中菜单的id都一样)
- checkable 可以被选中
- clickable 可以被点击
- focusable 可以放光标、文本或输入框
- long-clickable 可以长点击
- password 星号显示
- scrollable 可以上下滚动
- bounds 边界坐标值,[300,1500][600,1600],类似于html的盒模型
- displayed 是不是可以显示
- content-desc 声音的时候使用
元素布局和控件:
- imageview 存放图片 ==> tagname ()
- textview 文本标签
- layout 用来布局 相当于html中的div
- button 按钮
- checkbox 多选框
- switch 开关(如手机中设置的开关,蓝牙、wifi等开关)
- ratingbar 评分条
- seekbar 拖动条(音量条)
- toast d出
- webview 显示网页,类似iframe,在一个网页中嵌套另一个网页
- 原生空间里面套网页
- 其他组件很多
元素定位注意项:
- id属性:几乎每个元素都有id属性
- 每个元素的属性都是固定的
- class属性:指的不是web当中的class,而是指的是组件类型(ImageView,TextView 标签名称)
- text属性:app中编写xpath表达式://*[@text='']或//*[contains(@text='')] html中编写xpath表达式://*[text()='']或//*[contains(text(),'')]
- resource-id:com.lemon.lemonban:id/navigation_my(一般来说,元素中都会有resource-id,但在app当中不一定是唯一的,可以重复的)
- 如果resource-id不唯一,尝试定位父级元素
如何搜索元素:
点击某个元素后,复制id,点击【搜索元素】按钮
选择定位策略id,粘贴id,点击【查找】按钮
选中返回的元素,点击【点击元素】按钮,可以 *** 作跳转到对应页面
同样使用xpath表达式也可以查找到元素并进行点击
appium inspect 中还有录制功能,也没太大作用,比较鸡肋,可以转换成python语言,来提示如何编写元素定位
使用python编写代码如下:
import time from appium.webdriver import Remote # 启动一次请求 # 1.指明需要连接的服务地址和端口号 # 2.You must include a platformName capability caps = {"platformName": "Android", "udid": "emulator-5554", "appPackage": "com.lemon.lemonban", "appActivity": ".activity.WelcomeActivity" } driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub', desired_capabilities=caps) # 设置隐性等待 driver.implicitly_wait(10) # 查找元素 # id查找 # driver.find_element('id', 'com.lemon.lemonban:id/navigation_my') # xpath查找 el = driver.find_element('xpath', '//*[@resource-id="com.lemon.lemonban:id/navigation_my"]') el.click() time.sleep(3) driver.quit()
元素定位优先使用什么方法:
- 优先使用id,id不是唯一的 (appium inspect 元素搜索)
- xpath:组合使用id和其他属性(text,索引)
这个工具要比appium inspectg速度快很多,打开方式如下:找到安卓SDK的安装路径-->tools-->bin-->uiautomatorviewer.bat,双击打开,还可以创建快捷方式放到桌面,方便打开
优点:比appium inspect 速度快
缺点:不能验证元素表达式是不是唯一的
3.weditorweditor是python的第三方库,所以要安装:pip install weditor
缺点:不能和appium同时打开(可以跟airtest一块使用)
安装完成之后,在python命令窗口中输入weditor回车,会自动代开网页如下(如果打开的页面连接不上,提示服务错误之类的,关闭重新输入命令 python -m weditor)
选择系统,默认是安卓,然后输入设备名称,点击连接按钮即可,如果切换了页面可以,点击刷新页面按钮,点击某个元素,会显示对应的内容,还显示出了xpath表达式
总结:三种元素定位工具各有各的优点和缺点,注意事项一定要三再记住,我一开始打开weditor又忘记关闭appium,就不能使用,想使用哪个工具看自己的选择
4. appium客户端和selenium为何如此相似点击看一下Remote的源码,可以看到是调用的WebDriver类,但为什么又叫Remote,因为进行了重命名,点击看一下webdriver的源码
appium中,WebDriver类中继承了很多类,最重要的是AppiumSearchContext类,点击查看源码
AppiumSearchContex类,又继承了很多类,其中重要的是WebDriver.Remote,点击Remote查看源码
实际上继承的是WebDriver类,下面有很多方法
最后可以看到Remote类的路径如下:
点击selenium中的webdriver查看源码,可以看到也是进行了重命名Chrome
点击import后面的WebDriver查看源码,可以看到跟appium的还是不一样的
点击RemoteWebDriver类查看源码,可以看到跟appium最后继承的类是一样的
最后可以看到WebDriver类的路径如下:
放到一块可以看到,两个路径是一模一样的,所以说Chrome跟Remote转来转去,继承的是同一个父类WebDriver,所以有好多方法的用法跟selenium中一样
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)