Appium 上下文和 H5 测试 (二)

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

作者:清菡
博客:oschina、云+社区、知乎等各大平台都有。
文章总览图

一、往期回顾
这个步骤后进入了这个页面:

进入这个页面也是需要时间的。WebView 这个元素当中,放的才是 html 页面。真的等到 html 页面加载出来之后,再去获取所有相关的内容,这样比较好。
万一切过来的时候,html 页面还没有开始加载,我就马上去获取当前所有可以操作的对象,这样很容易丢失,所以也一样要讲究等待。
讲究等待,首先等到 WebView 这个元素出现。等到 WebView 这个 class 控件出现,class 值代表它的控件。
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 自动化组合起来用了,无缝切换,不需要改什么,照着套路用就好了:

列出了当前的上下文:
['NATIVE_APP', 'WEBVIEW_com.tencent.mobileqq:mini', 'WEBVIEW_com.保密']
NATIVE_APP 是当前的原生控件,按照 web 自动化来说,是默认的主窗口。
是因为这段代码:

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

就只有一个了,就是 NATIVEAPP。只能看到 NATIVEAPP 是切换不到 WebView 的。一定要保证能够识别得到,才能够去切换。
技巧: 报错的时候先看第一行代码,看看在你自己当前脚本当中到底是哪一行出错了。
四、样例代码
手机设置中开启着显示布局边界的情况下,然后 run 代码。因为 App 界面有变更,所以代码和现有界面不一致,即立即购买现在成了报名截止并跳转至 QQ 界面。代码提示找不到元素请不要奇怪,因为为了便于理解,放的元素还是立即购买的元素。
此代码只是样例,不一定保证在你的电脑上就能运行成功,请根据实际情况修改。
遇到的问题
appium 报错 session not created: This version of ChromeDriver only supports Chrome version 84
靠谱链接: https://www.codenong.com/jsb8d9e8746809/
温馨提示: 如果你的代码没问题,还报错,那么就换 Appium 版本吧,Appium 的 bug 很多。
上篇文章 中此处代码错了,应该改成这样:

公众号 清菡软件测试 首发,更多原创文章:清菡软件测试 95+原创文章,欢迎关注、交流,禁止第三方擅自转载。
版权声明: 本文为 InfoQ 作者【清菡】的原创文章。
原文链接:【http://xie.infoq.cn/article/1aa3437ab1dae6db7ad995635】。文章转载请联系作者。












 
    
评论