selenium重复执行move by offset时位移值自动累加的问题

  这几天在他人代码(使用python的OpenCV模块识别滑动验证码的缺口)的基础上写如下滑动验证码的破解:

  为了模拟人工操作实现加速—>减速的效果,selenium的move by offset这个方法需要执行多次。实际执行的时候我发现滑块总是会滑过头,而且偏差很大,直接滑到原图外面了。核心代码如下(另外说句题外话,网页上的图片是原图缩小过的,注意distance需要乘上缩放比例,一开始我卡在这里):

#取得距离
distance = get_distance()
#根据生成轨迹
track = get_track(distance)
action = ActionChains(browser)
#按住滑块不放
action.click_and_hold(slide).perform()
#根据轨迹执行滑动动作
for step in track:
    action.move_by_offset(xoffset=step, yoffset=0).perform()
#释放滑块
action.release().perform()

  我同样以为是总位移distance计算错误的问题,但是对比查看之后发现distance没有问题。于是在for循环里的最后面加上了这一句:

print(step,slide.location['x'])  

  作用是显示本次循环设置的移动的距离以及移动之后滑块的x坐标,得到如下序列(部分):

1 23
1 25
2 29
2 35
2 43
3 54
3 68
3 85

  左列是原本设置的想要让滑块移动的距离,右列是x坐标。不难看出来,滑块每次移动的距离,实际是之前所有移动距离之和。为什么会出现这种情况?该怎么解决呢?

  我尝试过原来代码里的reset actions,但是这样会出现新的问题:click and hold 这个动作一并清除,也就是滑块被释放了,所以不可行。本想通过打断点看selenium源码解决问题,囿于水平遂转向搜索引擎,最后在Github上的一个issue中找到了解释(when use MoveByOffset repeatedly ,the real offsetX value auto increase):action会自动累加位移,除非reset这个action。他给出的另外一个方案是新建一个action,我采用之后果然能够很好地解决我的问题。

  最终代码如下,加上一句就可以了:

#取得距离
distance = get_distance()
#根据生成轨迹
track = get_track(distance)
action = ActionChains(browser)
#按住滑块不放
action.click_and_hold(slide).perform()
#根据轨迹执行滑动动作
for step in track:
    action.move_by_offset(xoffset=step, yoffset=0).perform()
    #新建ActionChains对象防止累加位移
    action = ActionChains(browser)
#释放滑块
action.release().perform()

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vansl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值