UI自动化中的重要工作就是元素定位了,高效精准的定位方法可以让工作事半功倍。

在过去的一段web自动化经历中,使用的​​selenium​​库支持了多种定位方法,我们可以利用这些定位方法来做进一步封装,写出符合项目更高效的定位器。

一、get_element() 与 get_elements()

那么在小程序的​​Minium​​框架中,是如何定位元素的呢?先来回归下上一节中演示用的代码:

import minium


class ComponentTest(minium.MiniTest):
def test_ui_op(self):
self.page.get_element("view", inner_text="视图容器").click()
self.page.get_element(".navigator-text", inner_text="swiper").click()
self.page.get_elements("switch")[0].click()
self.page.get_elements("switch")[1].click()
print("test_ui_op执行测试")
print(self.mini.get_system_info())

代码里的​​get_element​​​和​​get_elements​​​就是框架中​​Page​​接口提供的方法,可以用来获取元素。

  • ​get_element​​:在当前页面查询控件, 如果匹配到多个结果, 则返回第一个匹配到的结果
  • ​get_elements​​: 在当前页面查询控件, 并返回一个或者多个结果

顾名思义,​​get_elements​​​多加了个​​s​​​表示负数,方法返回的是元素​​element​​​对象组成的​​list​​​,在代码里​​print​​出来后是这样的(手动换行方便查看):

[
<minium.miniprogram.base_driver.element.FormElement object at 0x000002C26893AE50>,
<minium.miniprogram.base_driver.element.FormElement object at 0x000002C26893AAC0>
]

在这2个方法里还存在​​几个相同​​的参数:

【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()_选择器

以及​​一个不同​​​的参数,这个是​​get_elements​​方法用到的:

【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()_当前页_02

二、参数介绍

1.参数:selector

这是一个必填的参数,内容是​​css选择器​​​或以​​/​​​或​​//​​​开头的​​xpath​​,定位元素主要也是靠这个参数。

框架支持多种选择器,示例代码中的选择器就是​​".navigator-text"​​,关于选择器下一章再详细介绍。

而关于​​xpath​​​,目前看官方介绍是说暂时不支持一些​​[text()='xxx']​​这类xpath条件,目前就先不做优先介绍了,使用CSS选择器也足够了。

另外,也可以自行搜索​​xpath​​​语法进一步了解,以前在做web ui自动化的时候我是很热衷于使用​​xpath​​​定位的,辅以​​xpath轴​​,定位器写的很好用。

2.参数:inner_text

非必填参数,默认​​None​​,可以通过控件内的文字识别控件。

self.page.get_element("view", inner_text="视图容器").click()

在示例代码中,​​inner_text="视图容器"​​指的就是小程序上出现的控件文本内容,很多时候我们可以根据这种特征进一步帮助定位。

【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()_控件_03

3.参数:text_contains

非必填参数,默认​​None​​,可以通过控件内的文字模糊匹配控件。

跟上面的​​inner_text​​参数一样,只不过这里可以模糊匹配,也就是说在页面可以确定文本内容唯一的情况下,这2种写法是等价的。

self.page.get_element("view", inner_text="视图容器").click()
self.page.get_element("view", text_contains="图容").click()

4.参数:value

非必填参数,默认​​None​​,可以通过控件的 value 识别控件。

比如这个单选框控件,可以使用微信开发者工具的选择元素按钮,点击控件。

【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()_选择器_04

通过 value 值来定位的话可以这样写:

self.page.get_element("radio", value="radio1").click()

但是这里一直出现报错​​TypeError: 'str' object is not callable​​​,是在源码​​page.py​​第319行。

【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()_选择器_05

后来我去翻阅了官方issues,找到一个2年前有人提出的问题跟我这个很像,但是官方也没回复问题关闭了。这里我也就尝试修改了一下,才能正常定位。

【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()_选择器_06

我重新把这个问题提交了下,如果得到回复届时再更新出来。

5.参数:max_timeout

默认值是​​0​​​,表示超时时间,单位是​​s​​​ 。而在超时之前会​​每隔一秒重试一次​​。

示例中,我修改下定位,使其必然定位不到。那么加了​​max_timeout=5​​之后,就会等待5s,期间一直定位不到的话,则抛出元素不存在错误。

self.page.get_element(".navigator-text", inner_text="form1", max_timeout=5).click()

【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()_控件_07

6.参数:index

默认值为​​-1​​。

  • ​index==-1​​: 获取所有符合的元素,
  • ​index>=0​​​: 获取前​​index+1​​符合的元素。

简单来说,​​get_elements()​​​获取的是元素在一个​​list​​中,注意下列表中索引是从0开始的。

【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()_控件_08

上图中class为​​kind-list-item​​​存在9个元素,现在使用​​get_elements​​获取前2个元素:

    def test_ui_op(self):
print(self.page.get_elements("view.kind-list-item", index=2))

遗憾的是运行结果结束仍然返回了9个元素出来,继续给官方提了个issues,等待回复吧 T_T。

--不要用肉体的勤奋,去掩盖思考的懒惰--