Appium 移动端自动化,无法获取全部元素,只能获取页面中能看到的元素,请问各位大佬,该如何解决?

Duke · April 27, 2025 · Last by Duke replied at April 30, 2025 · 3854 hits
  1. 通过 appium 想拿到一个页面中全部的内容,但是实际发现, 只能拿到页面当前展示的部分,如果想拿到其他部分,需要进行滑动滚动条,让其他内容先展示在界面上,才可以。 尝试使用 find_elements 方法, 但是并没有拿到全部的部分。

  2. 如下图所示,通过 DOM 元素://androidx.recyclerview.widget.RecyclerView [@resource-id="com.uu898.uuhavequality:id/recyclerview"]//android.view.ViewGroup 定位到 8 个元素

  3. 当我滚动滚动条后,其他新的内容展示出来,再通过相同的 DOM 元素定位,查找到的内容数量变化了(例如,我故意让界面展示 6 个元素,定位到的也只有 6 个元素)

  1. 这个页面上相同的元素有很多很多,我如何可以一次性获取到所有的元素呀, 通过滚动滚动条的方式,并不太准确可靠,有大佬了解这个地方的嘛,跪求,多谢。
共收到 12 条回复 时间 点赞

如果只是要点击,那拿显示区的内容没毛病,想爬内容抓不到包?
滑动,元素都捞出来,去重

Duke #2 · April 28, 2025 Author
wupengfeng 回复

嗯,预期情况是,想爬所有内容。
您说的滑动去重,目前是这一个方法。 所以想看看有没有大佬处理过类似的情况, 也许有其他方法可以 拿到全部内容。

Duke 回复

1、正常都有分页的
2、完全不管分页的话,改 ios

Duke #4 · April 28, 2025 Author
wupengfeng 回复

嗯嗯,明白,感谢您的回答。

网易的 airtest 工具 你试试

Duke #6 · April 28, 2025 Author
JHY 回复

也不行,和 appium 一样, 只能找到 移动端页面 展示出来的 内容。

自己改造下,uiautomator 底层是把不可见的过滤了

如果爬数据,为啥不用接口爬; 如果是做 UI 自动化,那就屏幕上滑,加载下一页的元素;
# 模拟用户向上滑动 # 返回当前页,支持链式调用
@allure.step("向上滑动")
def swipe_up(self):
log.info("向上滑动")
size = self.app_driver.get_window_size()
x = size['width'] * 0.5 # 横向中点
start_y = size['height'] * 0.8 # 起点:顶部 80% 位置
end_y = size['height'] * 0.3 # 终点:顶部 30% 位置
self.app_driver.swipe(x, start_y, x, end_y, 200)
return self

Duke #9 · April 29, 2025 Author
哲豪 回复

嗯,好的,这个研究研究,多谢。

Duke #10 · April 29, 2025 Author
xpcs 回复

因为最开始是想学习一下 appium 工具, 是他 UI 自动化嘛,所以遇到了这个问题。

你可以使用 js 语句跳过不可见元素的操作限制,这个的前提是你的 app 是支持 webview 的。如果你使用的框架是需要可见,可操作限制的那么你只能像正常操作一样去操作页面。正常我们框架封装这种都会加上类似 js 的 scrollIntoView() 去跳转到元素窗口,避免元素不可见的异常

Duke #12 · April 30, 2025 Author

明白,多谢

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up