Time will tell.
1、 List定位
List 在python里面也是一个列表,如果你不是很理解,那么你暂且可以把它理解是一个数组或集合。List是一个集合,那么它的个数也就成了不确定性,所以这里需要用复数。
在定位时,我们不能接着用find_element_by_id
等定位方式,我们需要用它的复数形式find_elements_by_id
,所有的定位方式都一样需要采用复数形式加个 s 。如何使用 list 定位想定位的元素。来看一下下面的图片:
我们查看图片可以知道我们能够轻松地通过 id 定位到整个祖父节点,我们接下来需要做的事定位这个祖父节点下所有的 android.widget.RelativeLayout
父节点,同样,首先看一张图:
这里我们需要直接使用定位复数的方法来操作。
代码:
element= driver.find_element_by_id("com.taobao.taobao:id/rv_main_container")
elements = element.find_elements_by_class_name("android.widget.FrameLayout")
通过上面的代码我们直接定位了com.taobao.taobao:id/rv_main_container
父节点下的所有android.widget.FrameLayout
子节点,但是由于这个android.widget.FrameLayout
子节点下边还有许多相同的android.widget.LinearLayout
孙节点。
这里需要直接使用定位复数的方法来操作。
代码:
elements = element.find_elements_by_class_name("android.widget.FrameLayout")
elements1 = elements[1].find_elements_by_class_name("android.widget.LinearLayout")
现在需要怎么去操作这个子节点呢,这里有两种方法:
-
前面讲了 List 你可以理解为一个集合,这里定位的所有子节点最后就成了一个
list
,如果要访问这个list
里面的某一个元素我们可以像访问数组中的数据一样通过下标访问。代码:
element= driver.find_element_by_id("com.taobao.taobao:id/rv_main_container") elements = element.find_elements_by_class_name("android.widget.FrameLayout") elements1 = elements[1].find_elements_by_class_name("android.widget.LinearLayout") elements1[1].click()
代码最后的结果选择了 “聚划算” 这个标签页面,然后点击进入。
稍微说下,下标是从0开始,如果要访问
list
中的第一个元素就是i[0]
(这部分是Python基础的内容)。 -
如果要访问
List
里面的元素,那么我们是否可以通过for
循环来依次访问呢?这个在自动化中会经常用到。下面你可以通过这个思路自己去实战一下,看能否达到预期效果。代码:
element= driver.find_element_by_id("com.taobao.taobao:id/rv_main_container") elements = element.find_elements_by_class_name("android.widget.FrameLayout") elements1 = elements[1].find_elements_by_class_name("android.widget.LinearLayout") for ele in elements1: ele.click()
我们可以通过循环去访问这个
list
里的每个元素,每次循环得到的都是其中一个元素,那么只需在这个元素上加上想要的操作即可,所以这里可以直接点进去。
2、 内嵌H5定位
1.hybrid 常见定位问题
首看一张图片:
通过右边的结构图我们能够清晰的看见整个页面就是一个 webview ,无论从什么角度来定位我们都不能够很好的进行,如果这个时候我们需要操作页面的元素就需要通过切换contexts
来完成。在讲这个之前,先说说会遇见的问题:
-
可能你看到有的文章显示我们不需要通过切换
contexts
就能够完成定位,这样的情况有,但是那种情况作者只在微博登录、qq登录等第三方登录时遇见过,如果不是这样的情况而像上面的情况就没办法通过类似的方法进行完成,所以我希望读者遇见这种情况时自己动手去操作,看什么方式更加适合自己的项目。 -
需要切换
contexts
那么就需要获取页面的所有contexts
,此时你通过官网或者其他文章的知识通过下面的方法来获取,可能会报错,这种情况关系不大。webview = self.driver.contexts print webview
如果你通过上面的代码来调试但是却报错,但是其他资料却没问题时,先不要着急,这里你需要确定两件事情:
(1)app打包的时候需要开启webview
的debug
属性setWebContentDebuggingEnabled(true)
,这个直接让开发加上就好。一般情况是开启的,毕竟他们也要调试。
(2)用很多手机去调试,发现有一些可以有一些不可以,但是你用模拟器却都可以,根据官方给出的答案是,这时候你需要去将手机root
,然后再试。第二种我也是调试了很久才找到原因。
2.hybrid 定位讲解
这两个问题解决后那么定位 webview 就轻松搞定。
代码:
webview = driver.contexts
driver.switch_to.context(webview[1])
driver.find_element_by_link_text('PHP').click()
初学者对于上面的代码可能不是很理解,这里看一下日志:
这里不用管执行代码和之前的区别(多了一个self
),我们看下面控制台的输出,输出的是一个list
,前面说过list
和数组类似,在这个list
里面有两个元素NATIVE_APP
,WEBVIEW_cn_com_open_mooc
,第一个元素是我们原生的 ap p的contexts
,后面的则是我们的 webview 的context
,所以我们需要获取 webview 的context
时只需要通过这个list
的下表来进行访问。
我们获取到 webview 的context
后只需要通过driver.switch_to.context()
进行切换就好。当切换后我们就可以像定位 web 一样进行定位。
看下面一张图片我们通过浏览器将 h5 页面打开:
通过上面的图片我们就能够很轻松的像 web 一样进行定位,也就可以使用 web 的一些定位方式。看到这里是不是觉得解决了一个难题呢?动手去练练吧。
3.hybrid 问题实战
这里提一个问,我们获取到的contexts
每次一定是两个吗?如果不是两个那么我们上面的脚本是不是就没办法用了呢?可以思考一下这里怎么解决,在看我们下面的思路以及解决方案。
无论在什么页面我们去获取contexts
时,它无论有几个,但是它的类型是不是肯定都是一个list
呢?既然是list
那么我们是否可以取到里面的每一个值,然后把每一个值进行判断,只要找出我们的 webview 就可以了呢?
代码:
# 获取当前页面所有的contexts
webview = driver.contexts
# 在获取到的contexts list里面去挨个循环
for context in webview:
# 判断循环中单个的context是否是webview,如果是就进行切换,并且跳出循环
if 'WEBVIEW' in context:
driver.switch_to.context(context)
break
driver.find_element_by_link_text('PHP').click()
通过上面的代码我们是否就完美地解决了内嵌H5的定位问题了呢。
内容就到这里,如果你对Python自动化软件测试等更多内容感兴趣的话可以加入我们175317069扣裙一起学习。会有各项测试学习资源,更有行业深潜多年的技术人分析讲解。
测试工程师职业发展路线:
功能测试 — 接口测试 — 自动化测试 — 测试开发 — 测试架构师
学习犹如逆水行舟,不进则退。也许你今天拥有的技术,明天就会淘汰。我们需要开拓思维和眼界,积极拥抱变化,学习新知识、新方法、新技能、计算机领域讲究的是实践,学习更要讲究方式方法,学习和动手一定要结合。
觉得还不错就【点赞】、【评论】、【关注】吧~
Time will tell.(时间会说明一切)
网友评论