RN 开发的项目 iOS 端尝试过直接使用 find_element_by_id, find_element_by_accessibility_id 都获取不到元素的情况下,又不能在代码中添加多余的标识代码,所以就只能使用 xpath 去定位元素了,后面使用过程中,虽然存在有一些空间获取不到 xpath 层级路径(如下图),但也还是比较少的情况,暂时就使用 tap 来解决了,后面再看看具体为什么获取不到了。
在使用过程中刚开始用的绝对层级的,发现 xpath 实在太长,直接放脚本代码中太占地方,导致脚本也不易维护,后面将 xpath 抽到 conf 配置文件,通过 key-value 方式获取,这个问题似乎得到解决了
看看这货有多长
//XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[2]
随着用例写的越来越多,而之前按模块来管理 xpath 文件方式的弊端慢慢就出来了,文件越来越多,而且很多元素其实似乎都是重用的,但是每个模块的都写了遍,这种冗余和臃肿肯定是接受不了,还得改造,于是就去了解xpath 语法,最后总结了几条基类的 xpath,发现基本够用。
base_element_equal_text = //*[normalize-space(@name)="%s"]
base_element_last_equal_text = //*[normalize-space(@name)="%s"]| //*[normalize-space(@name)="%s"]
base_element_last_equal_text = (//*[normalize-space(@name)="%s"])[last()]
base_element_contains_text = (//*[contains(@name, "%s")])[last()]
preceding_sibling_element = //*[normalize-space(@name)="%s"]/preceding-sibling::*[1]
following_sibling_element = //*[normalize-space(@name)="%s"]/following-sibling::*[1]
parent_following_sibling_element = //*[normalize-space(@name)="%s"]/../following-sibling::*[1]
parent_preceding_sibling_element = //*[normalize-space(@name)="%s"]/../preceding-sibling::*[1]
封装对应的方法,调用时获取到 xpath 再拼接传入要查找的文案内容即可。
欢迎大家补充。