如何在 Python 中使用 appium 进行滚动

Posted

技术标签:

【中文标题】如何在 Python 中使用 appium 进行滚动【英文标题】:How to scroll using appium in Python 【发布时间】:2014-12-26 23:10:42 【问题描述】:

您好,我想知道如何使用 python 在 appium 中滚动

我以前用 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 中有哪些实例吗? 看了说明还是不太明白

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

【问题讨论】:

@Ganwk ,您的 UI 自动查询应该具有滚动视图中的任何一种,例如 listview、gridview 或 recyclerview。请查看此视频,其中包含 appium 1.5.3 版本命令:youtube.com/watch?v=bT3tqaLNn-Y 【参考方案1】:

我最终使用了坐标,尽管它目前不是最适合我的解决方案

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()

【讨论】:

负值对你有用吗?因为当给出负 y 轴时我得到The coordinates provided to an interactions operation are invalid.【参考方案2】:

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​​ 文件中可用

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

【讨论】:

【参考方案3】:

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

所以我猜你的问题与你最初的想法不同。 请注意:

    new UiSelector().text("DesinationText") 将尝试匹配一个元素 这将具有确切的文本“DesinationText”。如果包含 在较大的文本中它不会被匹配。 'new UiScrollable(new UiSelector().scrollable(true).instance(0)' 在您的代码中 假设当前只有一个可滚动元素 屏幕。也许你有两个列表视图,文本在另一个 listview 或任何其他可滚动项?

希望这会有所帮助。 吉尔。

【讨论】:

以上是关于如何在 Python 中使用 appium 进行滚动的主要内容,如果未能解决你的问题,请参考以下文章

Appium python自动化测试系列之等待函数如何进行实战

测试新人如何使用Python代码封装自动化测试的用例?

python怎么安装nose

如何使用appium和python控制Android设备?

Appium环境部署(三)——python的下载、安装与配置

Appium python unittest pageobject如何实现加载多个case