selenium.common.exceptions.JavascriptException: Message: javascript error: Failed to execute 'elementsFromPoint' on 'Document': The provided double value is non-finite.

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()

于是很愉快了开始了摸鱼~~~~~

自有风云来时雨, 似有风霜沾蓑衣
原文地址:https://www.cnblogs.com/meipu/p/13749836.html