12.1 什么是混合App
12.1.1 混合app定义
什么是混合app,其实这个不言而喻,我们的app正常来说应该都是native的,但是实际工作中却不是,反正种种原因我们的app会有native的而且中间还会有H5页面,这其实就是我们常说的混合,当然还有一种就是纯H5的,但是这里我们不做过多的讲解。
12.2 混合app实战思路
12.2.1 代码实战
在前面的的章节内嵌h5页面定位我们就已经讲过这个问题,其实本讲的内容大家可以仔细把定位的内嵌h5定位问题再回顾一遍那么你就能够理解这里面的东西,这里会有一个问题是,在我们的app自动化中和web自动化中会有一些区别,这里一些api的用法上需要注意一下。下面我们还是来看一个流程,看下面两张图片:
第一张图片是我们app的原生页面:
第二张图片是我们的webview的界面:
我们在前面的章节讲过如果我们需要从第一个页面切换到第二个页面的时候我们需要进行“context”的切换,只有当我们切换了之后才能够进行进一步对该页面进行操作,看下面代码:
def view(self):#获取当前页面所有的contexts time.sleep(5) webview = self.driver.contexts #在获取到的contexts list里面去挨个循环 for context in webview: #判断循环中单个的context是否是webview,如果是就进行切换,并且跳出循环 if ‘WEBVIEW‘ in context: self.driver.switch_to.context(context) break self.driver.find_element_by_link_text(‘JAVA‘).click()
到目前为止我们是不是就能够很轻松自由的操作app内嵌的H5页面了呢。动手操作一下
备注:如果你用真机一直无法切换,不要激动这个很正常,用模拟器试一试,因为真机有很多限制,你可以尝试root后去试一试。
12.3 混合app实战
上面的知识我相信大家很容易都懂了,但是在实际操作中大家会遇见一个起码的问题,上面问题看我们下面讲解,在我们正常的操作情况下我们是不是操作完第二个页面是否应该关闭该页面然后直接去操作其它页面呢?于是乎就有了我们下面的代码:
def view(self):#获取当前页面所有的contexts time.sleep(10) webview = self.driver.contexts #在获取到的contexts list里面去挨个循环 for context in webview: #判断循环中单个的context是否是webview,如果是就进行切换,并且跳出循环 if ‘WEBVIEW‘ in context: self.driver.switch_to.context(context) break self.driver.find_element_by_link_text(‘JAVA‘).click() #关闭按钮定位 self.driver.find_element_by_id("cn.com.open.mooc:id/left_icon").click
动了手的小伙伴就知道问题了,你们无论如何都操作不了这个关闭按钮或者是关闭了操作不了其他页面的元素,上面的代码无论如何到关闭的时候都报错,对吧!但是你仔细思考会发现,我们前面讲了在我们从原生的app中切换到h5页面的时候都经过了切换,那么现在的driver是不是还是处于h5的呢?思考思考思考!!!你driver都还在h5家里,然后你让他去操作原来家里的东西能行吗?答案肯定是否定的,所以这个时候你又需要将driver切换到原来的driver。
思考:如果你的app有超级多的h5 页面然后在测试过程中你是不是需要进行不断的切换?麻烦吗?肯定啊。你每次切换都需要去写这个方法你不嫌弃累我都嫌弃累。so,我们这里是不是需要思考解决方案?那么之前我们python说的函数封装是不是起到作用了呢?这里给大家留一个思考题,如果做到高效的封装。
备注:这个在工作中经常用到,大家一定去动手练习一下这个思考题。
提示:笨一点的方法是封装成两个方法,好一点封装成一个方法,然后通过传递参数的形式去实现。