来自 APP Android 端自动化测试初学者的笔记,写的不对的地方大家多多指教哦。
当前很多 APP 都存在滑动操作,但这些元素一般无法单独定位到,多为一个数组或列表,这边介绍了几种方法,使元素滑动到你想要的位置后停止。
Appium 中 webdriver 提供 scroll() 方法来滚动页面,该方法只适用于屏幕上已经显示的两个元素,从一个元素滚动到另一个元素。若元素不存在当前屏幕或被遮挡,则无法使用该方法。
方法介绍:
scroll(self, start_el, stop_el, duration=None):
参数:
- start_el- 开始要滚动的元素
- stop_el- 要滚动到的元素
- 即从元素stop_el滚动至元素start_el
- duration 即滚动的持续时间
上栗子:使用 scroll() 方法实现从 “2008” 滑动到 “2012”,即方向为向上滑动,将 2012 滑动到 2008 的位置。
具体代码如下:
def scroll():
stop_el = self.driver.find_element_by_xpath("//android.widget.TextView[@text='2008']")
start_el = self.driver.find_element_by_xpath("//android.widget.TextView[@text='2012']")
self.driver.scroll(start_el, stop_el)
注意:以上方法无法实现从 2008 滑动到 2013,因为 2013 未显示在屏幕中,被遮挡了。
UiScrollable 是 UiCollection 的子类,专门处理滚动时间,提供各种滚动方法,下面只介绍了滚动到固定的对象。
相关概念:
上栗子:使用上一个方法 scroll() 的栗子图片,实现从 “2008” 滑动到 “2012”。
def test():
self.driver.find_element_by_android_uiautomator(
'new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(new UiSelector().text("2012")).scrollToEnd(10,5)')
# text("2012"):表示需要滑动的位置
# scrollToEnd(10,5):以步长(速率)5滚动到列表底部,最多滚动10次。
注意:该方法会直接滑动到列表最底部或最顶部,在中间时比较不好判断,如果列表的数据比较长的话,建议不使用哦。评论区有没有哪位大神,有好的方法来解决这个局限性,感谢!!
参考文章:https://blog.csdn.net/yiwaChen/article/details/53370632
之前已经有发布 swipe() 方法的封装类,具体位置:https://testerhome.com/topics/27828
上栗子:仍然以方法一的图片作为例子,当前的年份为 2008,需要滑动或点击 2020。
使用循环实现,具体实现方法为:
def swipe():
is_find = False # 默认没找到元素
is_sequential_search = True # 默认顺序查找,即上滑
while is_find is not True:
try:
self.driver.find_element_by_xpath("//android.widget.TextView[@text='1995']").click()
is_find = True # 找到了,退出循环
except NoSuchElementException:
if is_sequential_search: # 顺序查找
# 该方法调用已封装的向上滑动类
self.slide.swipe_up(2500)
# 所有年份,获取屏幕列表中最底部的一个年份的text值
years = self.driver.find_elements_by_class_name("android.widget.TextView")
years_text = years[9].text
# 到列表的最后一个,但没找到
if years_text == "2021":
is_sequential_search = False # 转换为逆序查找,即下滑
else:
# 该方法调用已封装的向下滑动类
self.slide.swipe_down_search(2500)
注意:scroll() 与 swipe() 的区别,swipe 是可以根据自己需要设置滑动的距离,而 scroll 是根据页面中两个元素位置距离进行滑动。