1.这个项目是滑块缺口验证码,第一页点击滑块正常执行通过,第二页报错。
perform无法执行,网上找了很多办法,如下:
1.升级浏览器,本来就是权森版本
2.升级驱动,本来就是权森版本
3.升级selenium从3.1到3.4版本,说实话,惊呆我了,3.4特么的没有pause这个方法,手动滑稽~,没有这个方法,验证码也过不去,升级也没用
4.使用JS执行按钮点击操作,的确是可以,但是我不要点击,我要左键点击保持不释放,手动滑稽~
5.反正各种乱七八糟的方法都试过了,一团糟
下面说下自己尝试的方法和思路:
1.xpathhelper
一直检查页面跳转或者html元素变动的情况下是否持续能获取到需要的元素,其实可以长时间获取到,说明xpath是没问题的哈
2.查看页面html变化的规律,审查代码逻辑是否有失效的地方
3.在页面执行某些操作后,打印页面源码或者元素信息查看是否有效定位元素
4.如果还是不确定,还有几个办法
F12 elements界面
F12 Console界面
$x('xpath表达式'),箭头的位置可以看到这个元素是唯一的
元素获取都没问题的话,一起来看看这个错误是什么意思
perform是
from selenium.webdriver import ActionChains
这个类执行的,官方的解释如下:
再结合这个错误提示,大概意思就是ActionChains会产生类似于一个列表一样的东西,后面鼠标的操作都会按顺序提交到这个列表里,
然后交由perform()一次直接执行,但是现在ActionChains中出现了两个相同的操作,或者是同一个步骤出现了两次,那么在第一个序列的操作
执行完成之后,将此列表清空,上面的问题就可以处理掉了。
恰好在国外的欧ver浮lower上看到一个方法:
#action_chains.py文件中85行函数修改如下 """ Clears actions that are already stored locally and on the remote end """ if self._driver.w3c: self.w3c_actions.clear_actions() for device in self.w3c_actions.devices: device.clear_actions()
self._actions = []
简单来说思路和上面说的一样,看到这个注释,突发奇想,如果ActionChains本身没有进行清空处理,
那么在perform()执行之后再重申下清空掉之前的操作不就可以了吗
slider = self.browser.find_element_by_xpath("/html/body/div[last()]/div[2]/div[2]/div[2]/div[2]") # if slider.is_displayed(): self.action_chains.click_and_hold(slider) self.action_chains.pause(0.6) self.action_chains.move_by_offset(xoffset=xset, yoffset=0) self.action_chains.pause(0.9) self.action_chains.release() self.action_chains.perform() # 执行鼠标所有的操作之后,将ActionChains重置 self.action_chains.reset_actions()
于是很愉快了开始了摸鱼~~~~~