热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

APP自动化基础之混合应用测试

什么是混合应用?一句话:Html5页面+原生页面。混合应用不是在app上直接写HTML5的页面,而是把HTML5页面放进一个webview的原生控件中。什么是webview?web




什么是混合应用?

一句话:Html5页面 + 原生页面。
混合应用不是在app上直接写HTML5的页面,而是把HTML5页面放进一个webview的原生控件中。


什么是webview?

webview是原生应用的一个控件,可以嵌套h5页面,另外还有可以嵌套图片的imageview等。webview能做到和web页面进行交互的功能。


拓展:安卓原生组件有哪些?
  • imageview,用于显示图片

  • textview,用于显示文本

  • layout,相当于html中的




  • button,用于显示按钮

  • checkbox,多选框:
    在这里插入图片描述

  • switch,开关:
    在这里插入图片描述

  • ratingbar,评分条
    在这里插入图片描述

  • seekbar,拖动条
    在这里插入图片描述

  • toast,弹出后瞬间消失的提示框:
    在这里插入图片描述

  • webview,用于显示网页,相当于html中iframe,网页中又套了个网页


如何快速辨别当前页面为webview?
  • 通过uiautomator2或appium inspector等原生app定位工具,当定位到整个页面的class为:android.webkit.WebView,即可证明当前页面为webview;
    在这里插入图片描述

  • 通过页面的一些特征识别。如当前页面左上角有一个X等在这里插入图片描述

  • 用uc-Devtools、chrome-inspect等H5开发者工具可查看到app信息,则证明当前进入了webview页面。
    在这里插入图片描述


测试web app的前提

apk中设置setWebCOntentsDebuggingEnabled=True。这里如果不设置或者设置为false时,H5的开发者工具是无法检测到当前的H5页面的。所以得找开发开启webview调试模式。


webview测试步骤
  • 通过uiautomatorviewer、appium inspector等原生app开发者工具定位原生应用的控件时,发现class为android.view.View,或其他一些方法判断出当前是H5页面;
  • 通过uc-Devtool等H5开发工具定位到web页面;
  • 此时已从原生环境进入webview中的H5环境,原生app开发者工具就失去了作用,得用H5开发者工具进行元素定位。但在代码中,并不能立刻在H5中进行元素定位、元素操作,得进行上下文切换,即从原生环境切换至webview中的H5环境(类似于selenium中切换iframe):
    1.从原生环境切换至webview中的H5环境:driver.switch_to.context(context)(这里的context是webview的context)
    2.从H5切回到原生:driver.switch_to.context(None)
  • 在desired_capacities中提供web浏览器的驱动:
    • chromedriverExecutableDir:r"浏览器驱动所在目录"
    • chromedriverExecutable:r"浏览器驱动所在路径,得包括驱动"
  • 在H5页面执行元素定位、元素操作

代码实战

场景分析

我们要实现的场景如下。
首先,进入首页后,点击师资团队。这里需要注意的是,这个元素并不能通过id进行定位。
在这里插入图片描述
我们在找id时,可以发现有8个元素的id都是同一个:
在这里插入图片描述
在这里插入图片描述
id不行,content-desc也为空,那么只有通过uiautomator或xpath方式进行定位,两种方式的定位都有一个相似点,就是找元素的一个或多个独有的属性。
这里我们使用xpath进行定位。那么看下它有哪些独特的属性。可以看到这里的text是独一无二的:
在这里插入图片描述
接下来通过xpath表达式,可找到的元素只有一个:
在这里插入图片描述
在这里插入图片描述
定位师资团队元素并点击后,就跳转到了师资团队页面。在这个页面中,在看APP Source中,可以看到有一个webview,说明这个原生页面中嵌套了一个h5页面:
在这里插入图片描述
那么原生app的开发者工具就不管用了,我们要接着转到H5的开发者工具来进行元素定位。这里我们用的是谷歌浏览器自带的inspect。
在浏览器中输入:chrome://inspect,即可进入H5开发者工具的界面。在这里检测到了H5的页面:
在这里插入图片描述
点击inspect后,进入了H5的控制台。这里我们要定位柠檬班这个元素并打印出来。可以看到,它是一个h1标签,它的文本是柠檬班,我们可以通过这两个特征使用xpath进行定位:
//h1[text()=“柠檬班”]
在这里插入图片描述

场景分析走完之后,接着就可以开始写代码了:


代码

import time
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
from appium.webdriver.common.multi_action import MultiAction
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
package = "com.lemon.lemonban"
caps = {
"platformName": "Android",
"deviceName": "emulator-5554",
"appPackage": package,
"appActivity": ".activity.MainActivity",
"automationName": "UiAutomator1",
"chromedriverExecutableDir":r"C:\chromedriver"
}
# 初始化客户端
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4723/wd/hub',
desired_capabilities=caps,
)
# 隐式等待
driver.implicitly_wait(20)
#定位元素并点击
element = driver.find_element_by_xpath('//*[@text="师资团队"]')
element.click()
#打印当前页面的上下文环境
print(driver.contexts)
#切换至webview的context
driver.switch_to.context('WEBVIEW_' + package)
#定位webview中的元素
element_in_webview = driver.find_element_by_xpath('//h1[text()="柠檬班"]')
print(element_in_webview)

这里需要注意的是,在原生页面中,文本text是元素的属性,所以要用@text=“XXX”;而到了H5,文本text就成了函数,所以要用text()=“XXX”。
在这里插入图片描述


chromedriver版本问题

在执行时报了个错:

['NATIVE_APP', 'WEBVIEW_com.lemon.lemonban']
Traceback (most recent call last):
File "C:/Users/rainstar/PycharmProjects/pyproject/APP_project_v0/混合应用.py", line 36, in
driver.switch_to.context('WEBVIEW_' + package)
File "C:\Users\rainstar\PycharmProjects\pyproject\venv\lib\site-packages\appium\webdriver\switch_to.py", line 34, in context
self._driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {'name': context_name})
File "C:\Users\rainstar\PycharmProjects\pyproject\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\rainstar\PycharmProjects\pyproject\venv\lib\site-packages\appium\webdriver\errorhandler.py", line 31, in check_response
raise wde
File "C:\Users\rainstar\PycharmProjects\pyproject\venv\lib\site-packages\appium\webdriver\errorhandler.py", line 26, in check_response
super().check_response(response)
File "C:\Users\rainstar\PycharmProjects\pyproject\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: No Chromedriver found that can automate Chrome '52.0.2743'. See https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md for more details.
Process finished with exit code 1

报错的原因是,没有与52.0.2743版本相匹配的chromedriver。所以得下载一个52.0.2743版本的chromedriver。
那么遇到chromedriver版本不兼容的问题该怎么解决呢?


  • 首先,先在H5开发者工具中查看app所需要的chromedriver版本:
    在这里插入图片描述
    接着去https://npm.taobao.org/mirrors/chromedriver/下载一个版本一致的chromedriver即可。
    在这里并没有高版本匹配低版本的规则,下载高版本的chromedriver照样还是会报错,所以得下跟app要求一致的版本。


推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 如何压缩网站页面以减少页面加载时间
    本文介绍了影响网站打开时间的两个因素,即网页加载速度和网站页面大小。重点讲解了如何通过压缩网站页面来减少页面加载时间。具体包括图片压缩、Javascript压缩、CSS压缩和HTML压缩等方法,并推荐了相应的压缩工具。此外,还提到了一款Google Chrome插件——网页加载速度分析工具Speed Tracer。 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
  • struts2重点——ValueStack和OGNL
    一、值栈(ValueStack)1.实现类:OGNLValueStack2.对象栈:CompoundRoot( ... [详细]
author-avatar
用户qqpgrvet8m
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有