1. 程式人生 > >selenium重複執行move by offset時位移值自動累加的問題

selenium重複執行move by offset時位移值自動累加的問題

  為了模擬人工操作實現加速—>減速的效果,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()