如果你还想从头学起Appium,可以看看这个系列的文章哦!

https://www.cnblogs.com/poloyy/category/1693896.html

webview 简介

  • WebView是android中一个非常重要的控件
  • 它的作用是用来展示一个web页面,它使用的内核是 webkit 引擎,Android 4.4版本之后,直接使用 Chrome 作为内置网页浏览器
  • 简单理解:就是App 中内嵌了一个浏览器
  • 类比:Web 浏览器里面的 iframe

做 webview 自动化测试前的准备

需要让开发在app中添加 webview 调试代码,yinw

 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); WebView myWebView = (WebView) findViewById(R.id.jcywebview); # 添加这一行
myWebView.setWebContentsDebuggingEnabled(true);
};

注意:从应用市场下载的app不具备此条件哦

跟开发说一声:帮我开启 webview debug 模式就可以啦~

查看 webview 里面的网页元素

第一种情况:被测试应用webview不依赖app

  1. 把webview 的 url 复制出来,在Web 中打开
  2. 按F12,进入开发者模式
  3. 选择手机模式

第二种情况:被测应用webview与app原生有交互,依赖app

方法:通过chrome 浏览器的远程调试功能(前提是本电脑可以爬梯子上网)

  • app 已打开
  • 打开chrome 浏览器,地址输入 chrome://inspect (如下图)
  • 确认 webview 版本【下图:66.0.3359.158就是版本】
  • 点击对应app 的 inspect 按钮

注意:有的系统比较老的,比如android 4.4 对应的 webview 的版本比较老 ,比如33.0 的,可能不能inspect, 所以尽可能使用新一些的android 版本

点击 inspect 之后,就可以像看网页一样啦!可以随意定位 webview 页面的元素了

确认手机 webview版本

方式一:电脑chrome浏览器访问 chrome://inspect

翻上去,前面已经讲啦【注意标红文字】

方式二:手机设置

在手机设置页面,搜索webview就可以啦

方式三:报错信息

如果前两种方式都不行,只能通过报错了,先随便下一个 webdriver,然后运行;如果版本不匹配就会有报错信息,上面就有版本信息,如下图

81.0.4044 就是我的版本信息,后面还友好的跟着版本对应列表,下面有讲到

下载对应版本的 webdriver

webview 版本对应哪个 webdriver 版本,具体可以看下面这个链接哦

https://raw.githubusercontent.com/appium/appium-chromedriver/master/config/mapping.json

然后下载对应版本的 webdriver 可以看这个链接

https://npm.taobao.org/mirrors/chromedriver

注意这里有个坑

如果你在做 app 自动化测试,然后就手机装了chrome 浏览器,需要删掉;不然webview 版本和 chrome 版本不一样的话,即使你提供的驱动版本符合 webview 版本,也会报错。。

针对 webview 自动化测试

其实满简单的,和Selenium 切换至 iframe 差不多的顺序,先看看伪代码的步骤

  1. 查看app 当前有哪些的 context
  2. 要了解app 原生控件的 context 命名
  3. 然后了解 webview 控件的 context 命名
  4. 切换到  webview context
  5. 操作 webview 页面内容
  6. 操作完了,切换回app context

context 是啥?

  1. 可以理解成 appium 操作的作用域
  2. 原生app context 就是 appium 默认操作的作用域,而 webview 是一个独立的作用域,appium 可以切换到里面进行操作
  3. 和selenium 一样,iframe 是独立的一个作用域,所以要切换到 iframe,才能对iframe里面的元素进行操作

原生app控件的 context 名字是啥?

NATIVE_APP

webview 控件的context 名字是啥?

  • 前缀:WEBVIEW_
  • 后面跟当前 app 的 package名字
  • 结合起来:WEBVIEW_package名字

这里提供一个有 webview 的 app

链接:https://pan.baidu.com/s/1CsXz0JbaDIoAMVBOFvorcg

提取码:a9lc

完整 webview 测试代码

根据上面说的伪代码去理解这段完整的代码哦

from appium import webdriver

caps = {
"platformName": "Android",
"platformVersion": "",
"deviceName": "test",
'appActivity': '.MainActivity',
'appPackage': 'com.example.jcy.wvtest',
# 设置命令超时时间
'newCommandTimeout': 6000,
# 确保自动化之后不重置app
'noReset': True,
# 底层驱动
'automationName': 'UiAutomator2',
# 查看webviwe版本方式2:通过代码的报错来查看
# 指定chromedriver路径 需要自己改成自己的
'chromedriverExecutableDir': r'C:\Users\user\Desktop\py\sq_appium\d5'
# chromedriver版本匹配地址
# https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md } driver = webdriver.Remote('http://localhost:4723/wd/hub', caps) # 查看当前app的context(appium操作的作用域)
# context-NATIVE_APP的时候-只能操作原生控件
# context-WEBVIEW_包名,只能操作web元素 # 查看context的名称
print(driver.contexts) # 当前处于哪个context?
print(driver.current_context) # 如何切换context
driver.switch_to.context('WEBVIEW_com.example.jcy.wvtest') # 打印切换后的context
print(driver.current_context) # 访问百度页面
driver.get('http://baidu.com')
driver.find_element_by_id('index-kw').send_keys('渣油\n') # 操作原生控件
driver.switch_to.context('NATIVE_APP') print(driver.current_context) # 点击通知
driver.find_element_by_accessibility_id('通知').click() input()
driver.quit() # app的类型
# 原生_app
# 混合app
# web_app

webview 自动化测试的总结

  • 只有开启 debug 模式的 app 才能自动化 webview 的内容
  • 自动化 webview 界面内容需要指定匹配 webview 版本的驱动

Appium自动化(15) - 针对 webview 进行自动化测试的更多相关文章

  1. appium自动化测试之UIautomatorviewer元素定位

    appium自动化测试之UIautomatorviewer元素定位 标签(空格分隔): uiautomatorviewer元素定位 前面的章节,已经总结了怎么搭建环境,怎样成功启动一个APP了,这里具 ...

  2. WiFi无线连接真机进行Appium自动化测试方法

    有时需要测试APP 产品的耗电问题,但用自动化又面临了一个USB接电脑供电的问题,从而导致计算出来的功耗与手动跑,存在有很大的误差,因此可使用wifi无线连接到手机进行自动化测试,解决功耗问题. 前提 ...

  3. appium自动化的工作原理(1)

    用appium开发移动端自动化测试脚本这么长时间,还没有认证的了解下它的原理是什么,到底是如何实现的呢? 1.先看一个Appium加载的过程图解(来自:了解appium自动化的工作原理--https: ...

  4. Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 前面介绍过根据id,clas ...

  5. 使用Appium进行iOS的真机自动化测试

    windows不支持appium连接ios,只适用于mac 使用Appium进行iOS的真机自动化测试 安装类库 Homebrew 如果没有安装过Homebrew,先安装[ homebrew ] np ...

  6. Appium自动化部署及连接Appium服务

    Appium自动化部署: 1)安装appium桌面程序安装:超链接 2)安装客户端 pip install appium-python-client 3)安装服务器 安装 Nodejs 4)连接app ...

  7. [转]RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第一篇【安装】

    前言:关于RobotFrameWork+APPIUM实现对安卓APK的自动化测试的文章都是取自于乐于分享知识于网络的好心人们,所以我也希望我的知识可以分享给大家. 首先我们先罗列一下我们要安装的软件 ...

  8. RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第一篇【安装】

    文章来源http://blog.csdn.net/deadgrape/article/details/50563119 前言:关于RobotFrameWork+APPIUM实现对安卓APK的自动化测试 ...

  9. Appium+Robotframework实现iOS应用的自动化测试

    Appium+Robotframework实现iOS应用的自动化测试 连接地址: 地址:https://blog.csdn.net/wd168/article/month/2016/06 1.http ...

随机推荐

  1. python学习03字符串基本操作

    '''字符串可以用单引号,双引号,三引号表示 '''#1.读取str1='I am a student!'#每一个字符对应一个下标,可以利用下标的方式来读取字符串对应的值——索引print(str1[ ...

  2. [Batch脚本] if else 的格式

    必须写成一行 ) else (,否则报错. if %abc%=="yes" ( ... ) else ( ... )

  3. java中FutureTask的使用

    文章目录 FutureTask简介 Callable和Runnable的转换 以Runnable运行 java中FutureTask的使用 FutureTask简介 FutureTask是java 5 ...

  4. java中的daemon thread

    java中的daemon thread java中有两种类型的thread,user threads 和 daemon threads. User threads是高优先级的thread,JVM将会等 ...

  5. android 动画学习总结

    本文内容是本人阅读诸多前辈的学习心得后整理的,若有雷同,请见谅 Android 动画 分类:帧动画,补间动画,属性动画  . 1.帧动画 将一张张单独的图片连贯的进行播放,从而在视觉上产生一种动画的效 ...

  6. CS Requirements and Resources

    有感于国内令人发指的CS教育,决定以自学为主. 路线会按照计算机科学与技术的技能树,主要学习四大的比较完整的课程,video没时间看,但reading会仔细看.lab会认真做,对于一些比较有意义.代码 ...

  7. RF(数据库测试)

    1.下载 DatabaseLibrary 库 pip install robotframework-databaselibrary 2.下载 pymysql 库(作为中间件) pip install ...

  8. 5分钟入门pandas

    pandas是在数据处理.数据分析以及数据可视化上都有比较多的应用,这篇文章就来介绍一下pandas的入门.劳动节必须得劳动劳动 1. 基础用法 以下代码在jupyter中运行,Python 版本3. ...

  9. redis关闭报没有权限No auth

    Redis安装之后,如果设置了密码,需要在关闭服务的时候也提供密码,否则无法关闭服务,可以直接通过修改/etc/init.d/redis启动脚本解决. Redis服务的启动和关闭脚本,只需要在关闭的脚 ...

  10. C. Two Arrays(思维DP或组合数学)

    \(首先很容易想到一个O(n^4m)的DP\) \(设dp\ [i]\ [j]\ [q]\ 为长度i,a数组以j结尾,b数组以q结尾(q>=j)\) for(int i=1;i<=n;i+ ...