测试基础 请教 selenium drag_and_drop 拖拽无效的情况下,怎么完成拖拽?

醋精测试媛 · 2021年02月03日 · 最后由 醋精测试媛 回复于 2021年02月07日 · 4269 次阅读

遇到了两次这个问题:

如图所示,这个功能是通过拖拽将这些块进行排序,更新后,表格中将呈现的是排序后的结果。

通过拖拽改变它们的顺序很简单,只要通过action_chains.drag_and_drop(drag1, drag2).perform()就可以。
整个测试的流程设计是点击排序 -> 将顺序打乱 -> 保存打乱后的顺序,那么测试点有几个①打乱后并保存的顺序和表格中一致,②排序后的顺序与预期一致。

但是我在做的过程中有如下几个疑问:

1.如何保证排序后的顺序和自己想要的一致呢?即如何拖拽?只拖拽一次还是随机拖拽?

2.如果随机拖拽能保证这个拖拽过程准确吗?

共收到 9 条回复 时间 点赞

思路:
元素截图对比,和预置的图片进行对比(像素级别的)

通过接口来验证更好吧,直接断言 ID 就行了,ui 貌似也就楼上说的图片比对了。

少年已老 回复

@ 少年已老 @yiwang 为什么需要像素对比,我对比文字就可以了吧。另外就是如何保证排序后的顺序和自己想要的一致?

4楼 已删除

我说的对比就是图片,不管你是文字还是啥,在图片里面都是像素。可以了解一下:PIL 库里面的 Image 方法
自己想要:就是你的预期结果,可以提前截图(get_screenshot_as_file)预置在一个目录
排序后的顺序:就是你用例执行的实际结果。断言就是和预置的图片进行对比啊 1

拖拽后,这些块的文字虽然变了。但是每一个位置的块的元素定位(id or xpath)没变。你可以根据定位获取这些位置的块的文字。有个方法叫做 getattributefromelement?我 app 的自动化玩的多,appium 里是有的。web 自动化 selenium 应该有这个方法。通过 id 获得元素的文字写一个 list,和你自己预期的 list 对比断言

黑山老妖 回复

其实我不太知道的是如何拖拽,拖拽后的效果不太能预料到

补充:action_chains.drag_and_drop(drag1, drag2).perform()拖动无效

觉得可能是无头模式的原因,参考了博客https://blog.csdn.net/weixin_45477907/article/details/108751664
使用了
ActionChains(self.driver).click_and_hold(source).pause(2).move_to_element(target).release(target).perform()
但是仍然拖动无效。

这是什么原因呢?

我的尝试 2:

pyautogui.moveTo(source.location['x'] + source.size['width'] / 2, source.location['y'] + source.size['height'] / 2)
# 实现拖拽功能
pyautogui.dragTo(target.location['x'] + source.size['width'] / 2, target.location['y'] + source.size['height'] / 2, duration=1)

但是还是不行。

经过很多次的尝试,我发现都不行,猜测是否是元素定位除了问题
发现了一个问题,当把第一个元素移动到第四个时,移动的过程中产生了新元素,第一个元素往右移动,第二个元素便占据了第一个元素的位置,这时 ,由于是使用的 find_elements()[0] 的方法定位的第一个元素,所以拖拽不成功。

我考虑到的想法是:
①获取目标元素的坐标
②长按 source 元素【预拖拽元素】
③获取到移动中的 source 元素【class 会发生变化,或者其他属性会发生变化】
④click and hold 移动中的 source 元素, 并移动到目标元素坐标点
。。但是还是不行,请问大家有什么办法吗?

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