Selenium 翻页后, 如何确定列表被刷新?

醋精测试媛 · 2020年12月24日 · 最后由 小邹 回复于 2021年03月02日 · 2255 次阅读
  • 测试需求:翻页,并获取所有数据信息

  • 做法:获取该页行元素的个数 n(1,2,...,i,..,n),获取第 i 个元素的文本即第 i 行的信息,翻页,继续上一步操作

  • 问题:翻页后,元素未来得及刷新,便去获取了个数,可能还是上一页的个数,因此,最后一页总是会失败,并显示错误 index error。

  • 主要难题:对列表进行信息获取操作之后翻页,如何确保当前页码被刷新了呢?

  • 初步尝试:尝试过 wait until 当前页码的 text 为期待的翻页后的页码,然后获取当前页的文本,但是还是出现了 index error。->即隐式等待
    在最后一页中,信息只有一两条时,仍然会去获取前一页的信息数目那么多的数据。
    错误信息如下:

    它回去获取第三条信息,因为它获取到的信息总数还是刷新前的。

除了 sleep 之外,还有什么办法吗?

  • 不用 sleep 的原因:由于网络的快慢,可能有时候 sleep1 秒就可以了,有时候需要 2 秒,容错性差。
共收到 22 条回复 时间 点赞

没完全懂你想做什么,贴出来完整的测试用例吧,注意脱敏。

Thirty-Thirty 回复

(1)翻页,并获取列表中所有数据
(2)由于翻页后,元素未来得及刷新就开始获取了,因此,元素获取了前一页的 20 个,但是,最后一页只有 2 个,当它获取第三行的文本时,发生了 index error
(3)不用 sleep 如何避免

@ 醋精测试媛 意思是说翻页的时候,后台数据可能没被加载或者已加载但还没被前台渲染,并且元素是存在的,然后获取出现了问题?

数据刷新的时候 应该有个 loading 的状态吧, 试着定位 loading,当 loading 不可见的时候,再去试着获取表格数据

闲云野鹤 回复

是的

幺叁叁 回复

没有 loading 的

@ 醋精测试媛 哈哈,如果是这样,我没想到好办法,我之前是写个工具类,简单封装下 sleep 方法,让等待的时间可以配置。看看坛子里的大神有没有什么好办法😂 😂 😂 😂

8楼 已删除

和接口配合下不就完了

如果不需要看 UI 动的话,我觉得可以用 request。

自娱自乐 回复

仅 iu

写一个方法,判断点击翻页后获取的的一个信息是否等于上次获取的第一个信息。如果相等就在等待一秒后继续判断。信息里面最后又唯一标识的数据??

弄个必然被更新的数据当锚点

自娱自乐 回复

好的,我试试。

翻页的方法单独抽出来,你判断一下是否是最后一页,最后一页单独处理,list 中元素能获取到多少个算多少个。
关于等待的问题,用 driver 的隐式等待可行吗?

由于翻页后,元素未来得及刷新就开始获取了

人肉是如何确认元素刷新完的?把这个标志也引入到自动化里面作为确认刷新完成的标志?不用 sleep 的话必须找到合适的标志表明刷新完毕。你现在问题是找到的标志不可靠。

另外,也可以换个思路,只要出现 IndexError ,那么就捕获这个异常,并在捕获异常后的逻辑里二次校验此刻表示界面共有多少条数据的标志是否等于当前 index +1(这个时候如果这个标志还没刷新,可以直接给研发报 bug 了)。如果是,那就直接吃掉这个异常当做用例成功就好。虽然有点坏味道(把异常当做业务逻辑处理),但这个场景下这种方法会比较简单

可以加一个” 等待 “
1、强制等待(执行到某一条语句后,然后 sleep(3),等待 3 秒后,才会继续执行后面的语句)

2、隐式等待(是等待页面加载完,才会继续执行后面的语句)

3、显示等待(是等待需要加载的元素加载完,就会继续执行后面的语句)

8楼 已删除
陈恒捷 回复

人肉是如何确认元素刷新完的?
浏览器上面有一个进度条,但是好像无论什么页面都有的。

20楼 已删除
江涛依旧 回复

好的,谢谢您,我去试试。

try 啊,失败再来一次⛅

其实你这个需求我觉得就是测试一个翻页功能的用例,如果你把数据判断啥的都放到 UI 自动化会很难搞(个人觉得)
如果是前后端分离的那么通过接口自动化的方式会轻松很多,
如果不是前后端分离的,借用 17 的 等待处理

你这里 i 等于 3,前面几页获取第 3(i) 行信息是没问题的,因为每页信息是 n(>3) 行。最后一页信息只有一两条,这时候脚本试图获取第 3(i) 行信息就会报错,因为提供的 index 超出范围,也就是 index error

不过我也遇到过类似的问题。
我的解决办法是控制列表数据信息的总数量,如果每页显示 10 条信息,我就把总数量控制在 11-19;
进行翻页操作后,循环获取第二页数据的总数量,直到获取的数量<10 即可;

控制列表数据信息的总数量有两个办法:
1.如果测试环境完全由自己控制,那么这个列表的数据可以通过接口或者数据库操作,控制数据数量
2.如果测试环境是多人公用的,数据不能随意修改,那么可以通过搜索 (如果有的话) 功能实现列表数据数量的控制

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册