爬蟲學習日記(九)Selenium點選事件超時 改用執行JS

KIM曉峰發表於2019-03-04

在開發一個用selenium+chrome的爬蟲專案的時候,原先用點選事件是可以完成所有操作的,但是在deploy上伺服器的時候,在點選一個圖片的點選事件中,click操作一直超時,大佬說用selenium的xpath定位一直會出問題,讓我用By.id或則By.name來定位,但是那個element沒有ID和name屬性啊。。

爬蟲學習日記(九)Selenium點選事件超時 改用執行JS

然後我選擇了用cssSelector萬能神器來定位,這裡推薦一個偷懶的小竅門,如果是cssSelector和xpath語法寫不好的話,可以利用chrome裡面自帶的小工具來獲取

爬蟲學習日記(九)Selenium點選事件超時 改用執行JS

但是用了CSSSelector還是報的超時,click操作超時,我真的是很想吐槽一下,本地跑一直沒有問題,速度也很快。

後來大佬就說,直接跑裡面的js吧。

然後就是今天的主題了,利用chrome+selenium來跑js。

可以看到那個click時間點選的就是執行一個js方法,在selenium中是有方法可以執行js指令碼的。

((JavascriptExecutor) this.driver).executeScript(js);

直接傳進去js指令碼就行。

我剛開始的做法是,直接呼叫他的方法。

爬蟲學習日記(九)Selenium點選事件超時 改用執行JS

會發現是報這樣一個錯,clientY未定義。

看了一下報錯,報的是這樣子的。

爬蟲學習日記(九)Selenium點選事件超時 改用執行JS

問了一下前端大佬,才發現是因為原先的設計是觸發點選事件,然後獲取他滑鼠懸停的狀態,然後來設定新的視窗的位置的。我都沒有進行點選事件,那代表event都沒有,那clientY必然是獲取不到的。

知道原由後,我剛開始想的解決方法是,那就讓他獲取到滑鼠點選事件,讓他有這個event,但是想想就覺得不行,如果都能點選了,那之前就不會超時啦。然後就換了一種方案:重寫他的js方法,讓他的top屬性不通過clientY來獲取,而是給一個制定好的值,再重新呼叫這個方法。

在chrome裡面的console裡面先實驗:

爬蟲學習日記(九)Selenium點選事件超時 改用執行JS

也是第一次發現可以在chrome裡面這樣子操作,chrome真的是神器,有很多工具真的很好用。

然後換成在後臺操作:

爬蟲學習日記(九)Selenium點選事件超時 改用執行JS

爬蟲學習日記(九)Selenium點選事件超時 改用執行JS

跑unitTest,結果無誤。

狗子走丟了,以後就剩我一個人了,一個人也要加油啊。

相關文章