如何在Python中使用Appium滚动

6 投票
3 回答
11702 浏览
提问于 2025-04-30 16:58

你好,我想知道如何在Appium中使用Python进行滚动。

我之前在Java中做过这个,效果很好。

driver.scrollTo("Destination");

不过我在Python中似乎做不到同样的事情。我对Python还比较陌生,尝试了很多种方法来滚动。

我尝试的第一种方法是

el1 = self.driver.find_element_by_name('Starting')
el2 = self.driver.find_element_by_name('Ending')
self.driver.scroll(el1, el2)

我尝试的第二种方法是

self.driver.find_element_by_android_uiautomator('new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text("DesinationText").instance(0));').

第二种方法滚动了一次,但没有完全滚到底,所以出现了NoSuchElementException的错误。

另外,有人能解释一下UiSelector中的实例是什么吗?我看了描述,但没太明白。

实例:设置搜索条件,通过实例编号来匹配小部件。

暂无标签

3 个回答

-1

instance(i) 就像 index(i),但不知道为什么效果更好。

那它有什么用呢?假设在当前的活动中(也就是现在屏幕上显示的内容),有10个 TextView 视图。在这种情况下,下面这个选择器:

new UiSelector().className("android.widget.TextView")

可以很好地匹配到我们屏幕上所有的10个 TextView 视图,但如果你不明确指定想要匹配哪个实例或索引,它默认会返回第一个。

但是,假设你想专门匹配第10个 TextView,只需使用下面这个选择器:

new UiSelector().className("android.widget.TextView").instance(10)

你写的代码很好,而且是有效的。我还加了一些处理错误的示例:

def scroll_to_text(text):
try:
    element = driver.find_element_by_android_uiautomator(
        'new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text("'+text+'").instance(0));')
    return element
except NoSuchElementException:
    logger.error('it was not found')
    return None
except Exception, e:
    logger.error("Unexpected error:")
    logger.exception(e)
    return None

所以我想你遇到的问题和你最初想的不同。请注意:

  1. new UiSelector().text("DesinationText") 会尝试匹配一个文本完全是 "DesinationText" 的元素。如果这个文本是更大文本的一部分,它就不会被匹配。
  2. 你代码中的 'new UiScrollable(new UiSelector().scrollable(true).instance(0)' 假设当前屏幕上只有一个可滚动的元素。也许你有两个列表视图,而文本在另一个列表视图或者其他可滚动的项目中?

希望这些对你有帮助。

Gil.

4

虽然使用坐标不是最好的解决办法,但目前对我来说还是有效的,所以我选择了它。

action = TouchAction(self.driver)
el = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.NAME, loc)))
action.press(el).move_to(x=10, y=-500).release().perform()
5

self.driver.scroll(el1, el2) 对我来说也不管用。

我开始使用

self.driver.swipe(470, 1400, 470, 1000, 400)

driver.swipe(start_x, start_y, end_x, end_y, duration) 这个方法会在 _touch.py 文件中找到。

慢慢向下滑动,添加一个逻辑来检查元素是否存在 - 直到找到这个元素为止。

撰写回答