Appium 上下文和 H5 测试 (二)
坚持原创输出,点击蓝字关注我吧
作者:清菡
博客:oschina、云+社区、知乎等各大平台都有。
文章总览图
一、往期回顾
这个步骤后进入了这个页面:
进入这个页面也是需要时间的。WebView 这个元素当中,放的才是 html 页面。真的等到 html 页面加载出来之后,再去获取所有相关的内容,这样比较好。
万一切过来的时候,html 页面还没有开始加载,我就马上去获取当前所有可以操作的对象,这样很容易丢失,所以也一样要讲究等待。
讲究等待,首先等到 WebView 这个元素出现。等到 WebView 这个 class 控件出现,class 值代表它的控件。
sleep
1 秒钟,确保里面的 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】。文章转载请联系作者。
评论