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()
於是很愉快了開始了摸魚~~~~~