坚持原创输出,点击蓝字关注我吧

作者:清菡

博客:oschina、云+社区、知乎等各大平台都有。

文章总览图

一、往期回顾

  1. loc='new UiSelector().text("全程班")'
    WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ANDROID_UIAUTOMATOR,loc))
    driver.find_element_by_android_uiautomator(loc).click()

这个步骤后进入了这个页面:

进入这个页面也是需要时间的。WebView 这个元素当中,放的才是 html 页面。真的等到 html 页面加载出来之后,再去获取所有相关的内容,这样比较好。

万一切过来的时候,html 页面还没有开始加载,我就马上去获取当前所有可以操作的对象,这样很容易丢失,所以也一样要讲究等待。

讲究等待,首先等到 WebView 这个元素出现。等到 WebView 这个 class 控件出现,class 值代表它的控件。

  1. # 等待Web View元素出现  -Web View里面放的是Html
    WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.CLASS_NAME,'android.webkit.WebView')))

sleep1 秒钟,确保里面的 html,所有的都能加载完成。

time.sleep(1)

二、怎么切换?

用什么样的语句来获取我们的 WebView、获取我们的原生控件呢?

它这个东西在我们 App 当中叫做context,翻译成中文就是上下文。

上下文在我们自动化中就是指可以切换的东西,就是我们的原生控件。 原生控件是我们默认的,就像窗口切换就是我们默认的窗口是一样的。原生控件是它的默认上下文。打开 app,默认就是在它的原生控件当中。

WebView 就是它的第二种context

只要当前页面中有 WebView,它就会显示出来,有 2 个就会显示 2 个。如图片中这个例子中只有一个 Webview,所以它只显示一个 WebView。

这就是context上下文。

只有这种情况下需要切换,其它情况下都是原生控件就不需要切换,不用管它,一旦有 html 页面就需要考虑这些事情了。

三、上下文切换

可用的上下文(Contexts)

列出所有可用的上下文(contexts)

driver.contexts

driver.window_handles 获取所有窗口的 handle,返回 list 列表。

当前上下文(context):列出当前的上下文(context)

driver.current_context

切换至默认的上下文(context)

切换回默认的上下文(context)。(译者注:一般就是原生上下文 “NATIVE_APP”)

driver.switch_to.context(None)

当前 Activity:获取当前的 Acticity。仅支持 Android。

driver.current_activity

当前包名(package):获取当前包名(package)。仅支持 Android 。

driver.current_package

上下文的操作方式在这里,和 Windows 窗口是一模一样的。和 Web 自动化中所谓的窗口是一样的。

首先列出所有可用的上下文。就像列出目前所有打开的窗口是一样的。

这个上下文,有 WebView 的时候,也是在执行代码的时候,它进入了有 WebView 的页面当中,才会有多个,没有进入有 WebView 的页面当中只有一个 WebView 的(相当于一个大箱子,箱子打开后有多个)。

列出所有可用的上下文,再去切换至需要的上下文。怎么切换呢?他们得到的结果也是个列表啊。

列表当中放的值呢,不是原生控件就是 WebView。所以它也有下标。如果要切换的话就是driver.switch_to.context(None)

None 表示什么呢?

表示切换回默认的上下文,按照 Web 自动化的讲法就是默认的窗口,在我们这里就是默认的原生控件里面。

如果你想切换到 WebView 的话,driver.contexts返回值 0,列表取下标 1,2,3,4 都是可以取得。也可以将你得到的 Web 名称放在driver.switch_to.context(None)中替换 None 就可以了。

driver.switch_to.context(None)可以切进去,也可以切出来。如果你想获取当前的窗口,当前的上下文,叫做driver.current_context

它的做法与窗口是一模一样的。Web 自动化中叫做窗口,这里叫做上下文。 其它的时候不需要切换,但是有窗口需要交替的时候就必须要切换。有 iframe,需要更换 html 页面的时候就需要切换,其它情况下就不切换。

现在在这个地方已经等到了这个所有的 WebView 出现了,所以接下来这样做:

button[@class="bottom-btn buy"]

相当于 App 自动化和 Web 自动化组合起来用了,无缝切换,不需要改什么,照着套路用就好了:

  1. # 切换之后:当前的操作对象:html页面。
    # 等待元素可见
    # 因为是通用的,所以接下来的代码是web自动化的代码
    WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.XPATH,'//button[@class="bottom-btn buy"]')))
    # 这个用Mobileby或者By都无所谓。
    driver.find_element_by_xpath('//button[@class="bottom-btn buy"]').click()

列出了当前的上下文:

['NATIVE_APP', 'WEBVIEW_com.tencent.mobileqq:mini', 'WEBVIEW_com.保密']

NATIVE_APP 是当前的原生控件,按照 web 自动化来说,是默认的主窗口。

是因为这段代码:

  1. # 1、先列出所有的context
    cons=driver.contexts  #列表
    #也是按照出现的先后顺序,WebView是操作过程中才出现的,所以它肯定排队。
    print(cons)

一定要开启 webview debug 属性,如果你没有开启它,那么这 2 项,在这里获取的时候是看不到的:

就只有一个了,就是 NATIVE_APP。只能看到 NATIVE_APP 是切换不到 WebView 的。一定要保证能够识别得到,才能够去切换。

技巧: 报错的时候先看第一行代码,看看在你自己当前脚本当中到底是哪一行出错了。

四、样例代码

手机设置中开启着显示布局边界的情况下,然后 run 代码。因为 App 界面有变更,所以代码和现有界面不一致,即立即购买现在成了报名截止并跳转至 QQ 界面。代码提示找不到元素请不要奇怪,因为为了便于理解,放的元素还是立即购买的元素。

此代码只是样例,不一定保证在你的电脑上就能运行成功,请根据实际情况修改。

  1. from appium import webdriver
    import time
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from appium.webdriver.common.mobileby import MobileBy

    desired_caps={}
    # 平台类型
    desired_caps["platformName"]="Android"
    # 平台版本号
    desired_caps["platformVersion"]="10"
    # 设备名称
    desired_caps["deviceName"]="2NSDU20410017297"
    # app 包名
    desired_caps["appPackage"]="输入appPackage"
    # app 入口 acitivity
    desired_caps["appActivity"]="输入appActivity"

    # 连接Appium server。前提:appium desktop要启动。有监听端口。
    # 将desired_caps发送给appium server。打开app
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

    loc='new UiSelector().text("全程班")'
    WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ANDROID_UIAUTOMATOR,loc)))
    driver.find_element_by_android_uiautomator(loc).click()

    # 等待Web View元素出现  -Web View里面放的是Html
    WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.CLASS_NAME,'android.webkit.WebView')))
    # 因为只是等它这个元素出现了,至于里面的html有没有加载完成,并不是很确定。
    time.sleep(1)#为了稳定起见,稍微sleep 1秒,确保里面的Html,所有的都能加载完成。

    # 前提:可以识别到WebView,
    # 这个识别不是肉眼识别,而是通过调用代码的时候可以识别。需要开启app的webview debug调试属性,对外可见。

    # context  #原生控件 #webview

    # 1、先列出所有的context
    cons=driver.contexts  #列表
    #也是按照出现的先后顺序,WebView是操作过程中才出现的,所以它肯定排队。
    print(cons)

    # 2、切换至WebView,要确保chromedriver的版本要与webView的版本匹配。也要放置在对应的位置。
    driver.switch_to.context(cons[-1])#这个地方没有给你提示,不代表你错了,照着操作就好了。
    # 先写个-1,因为现在不知道WebView的名字。但是知道WebView一定是出现在最后的就可以了。

    # 3、切换之后:当前的操作对象:html页面。
    # 等待元素可见
    # 因为是通用的,所以接下来的代码是web自动化的代码
    WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.XPATH,'//button[@class="bottom-btn buy"]')))
    # 这个用Mobileby或者By都无所谓。
    driver.find_element_by_xpath('//button[@class="bottom-btn buy"]').click()
    # 这里为什么用MobileBy.XPATH而不是By.XPATH?
    # MobileBy这个类继承了By,所以这个用Mobileby或者By都无所谓。
    # 原理:大家背后走的都是同一套逻辑,同一段请求,同一种命令。都是find_element
    # 只不过我们查找元素的方式不一样。所以它只是一个外部的形式而已,在内部也是一样的。
    # 即便用Selenium Webdriver 写代码,也可以把MobileBy引进来,只要我不去用移动端的定位方式,都是可以做的。

遇到的问题

appium 报错 session not created: This version of ChromeDriver only supports Chrome version 84

靠谱链接: https://www.codenong.com/jsb8d9e8746809/

温馨提示: 如果你的代码没问题,还报错,那么就换 Appium 版本吧,Appium 的 bug 很多。

上篇文章 中此处代码错了,应该改成这样:


公众号 清菡软件测试 首发,更多原创文章:清菡软件测试 95+原创文章,欢迎关注、交流,禁止第三方擅自转载。

Appium上下文和H5测试(二)的更多相关文章

  1. Appium上下文和H5测试(一)

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.混合应用-H5 1.混合应用是什么? 2.怎么样分辨一个 App 页面究竟是原生的还是 We ...

  2. APP,H5测试要点

    APP测试重点 一,运行测试 运行过程中,是否有加载提示: 运行速度是否流畅: 各个模块之间的切换是否正常: 二,更新测试:打开旧版app时,是否有更新提示,且在不同的手机版本上都能更新成功:打开新版 ...

  3. H5测试(转载)

    可能有些朋友不明白啥是H5,但其实生活中我们经常会碰到. 比如,你经常收到的朋友虐狗第一式—结婚请贴. 你的朋友圈,可能会经常看到宝妈们虐狗第二式—晒可爱宝宝的相册. 你有可能也收到过这样,非常直观, ...

  4. H5测试

    H5是什么? H5的全称是HTML5,其实就是:移动端WEB页面. H5与原生 APP的区别: APP是使用原生系统内核的,相当于直接在系统上操作,是我们传统意义上的软件,更加稳定. H5的APP先得 ...

  5. Android APP压力测试(二)之Monkey信息自动收集脚本

      Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 上一篇Monkey介绍基本搬抄官方介绍,主要是为了自己查阅方便.本文重点介绍我在进行Monkey时如何自动收集相关信息 ...

  6. 如何搭建基于C#和 Appium 的 Android自动测试环境

    本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 如果想做手机端的自动化测试,Appium是首选的测试框架,因为网上使 ...

  7. 一张图玩转H5测试

    背景 随着各种H5页面的普及和运用,并深深的影响着我们各个业务的发展,前两年也对H5测试的有着不少积累,但都是根据项目的要求,这里测试下,那里测试下,今年上半年专门成立了H5测试研究虚拟小组,专门研究 ...

  8. Appium 在 Android UI 测试中的应用

    原文地址:https://blog.coding.net/blog/Appium-Android-UI Android 测试工具与 Appium 简介 Appium 是一个 C/S 架构的,支持 An ...

  9. H5生成二维码

    要用H5生成二维码: 1.引入js库,可自行点击链接复制使用 <script type="text/javascript" src="http://static.r ...

随机推荐

  1. Optimal binary search trees

    问题 该问题的实际应用 Suppose that we are designing a program to translate text from English to French. For ea ...

  2. CodeForces 1344D Résumé Review

    题意 给定一个长度为 \(n\) 的序列 \(a\) 和一个整数 \(k\),构造一个序列 \(b\) 使得满足以下条件: \(0\leq b_i\leq a_i\) \(\sum\limits_{i ...

  3. Photoshop如何安装蓝湖插件

    Photoshop如何安装蓝湖插件 下载蓝湖插件 直通车:蓝湖Photoshop插件: Photoshop版本要求为cc2017以上, 下载后是一个zip格式的文件,我们需要解压. 下载的文件 解压后 ...

  4. Azure DevOps 扩展之 Hub 插件的菜单权限控制配置

    这是 Hub 插件的描述配置代码片段: { "contributions": [ { "id": "feature-hidden-fields-man ...

  5. hdu3974 Assign the task线段树 dfs序

    题意: 无序的给编号为1-n的员工安排上下级, 操作一:给一个员工任务C,则该员工以及他的下级任务都更换为任务C 操作二:询问一个员工,返回他的任务   题解: 给一个员工任务,则他所在组都要改变,联 ...

  6. 分库分表的 9种分布式主键ID 生成方案,挺全乎的

    <sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...

  7. python数据分析02语法基础

    在我来看,没有必要为了数据分析而去精通Python.我鼓励你使用IPython shell和Jupyter试验示例代码,并学习不同类型.函数和方法的文档.虽然我已尽力让本书内容循序渐进,但读者偶尔仍会 ...

  8. C语言I博客作业3

    这个作业属于哪个课程 <https://edu.cnblogs.com/campus/zswxy/SE2020-1 > 这个作业要求在哪里 https://edu.cnblogs.com/ ...

  9. Cephfs的快照功能

    前言 Cephfs的快照功能在官网都很少提及,因为即使开发了很多年,但是由于cephfs的复杂性,功能一直没能达到稳定,这里,只是介绍一下这个功能,怎么使用,并且建议不要在生产中使用,因为搞不好是会丢 ...

  10. mysql 数据库存储路径更改

    使用了VPS一段时间之后发现磁盘空间快满了.本人的VPS在购买的时候买了500gb的磁盘,提供商赠送了20GB的高性能系统磁盘.这样系统就有两个磁盘空间了.在初次安装mysql 的时候将数据库目录安装 ...