在開發一個用selenium+chrome的爬蟲專案的時候,原先用點選事件是可以完成所有操作的,但是在deploy上伺服器的時候,在點選一個圖片的點選事件中,click操作一直超時,大佬說用selenium的xpath定位一直會出問題,讓我用By.id或則By.name來定位,但是那個element沒有ID和name屬性啊。。
然後我選擇了用cssSelector萬能神器來定位,這裡推薦一個偷懶的小竅門,如果是cssSelector和xpath語法寫不好的話,可以利用chrome裡面自帶的小工具來獲取
但是用了CSSSelector還是報的超時,click操作超時,我真的是很想吐槽一下,本地跑一直沒有問題,速度也很快。
後來大佬就說,直接跑裡面的js吧。
然後就是今天的主題了,利用chrome+selenium來跑js。
可以看到那個click時間點選的就是執行一個js方法,在selenium中是有方法可以執行js指令碼的。
((JavascriptExecutor) this.driver).executeScript(js);
直接傳進去js指令碼就行。
我剛開始的做法是,直接呼叫他的方法。
會發現是報這樣一個錯,clientY未定義。
看了一下報錯,報的是這樣子的。
問了一下前端大佬,才發現是因為原先的設計是觸發點選事件,然後獲取他滑鼠懸停的狀態,然後來設定新的視窗的位置的。我都沒有進行點選事件,那代表event都沒有,那clientY必然是獲取不到的。
知道原由後,我剛開始想的解決方法是,那就讓他獲取到滑鼠點選事件,讓他有這個event,但是想想就覺得不行,如果都能點選了,那之前就不會超時啦。然後就換了一種方案:重寫他的js方法,讓他的top屬性不通過clientY來獲取,而是給一個制定好的值,再重新呼叫這個方法。
在chrome裡面的console裡面先實驗:
也是第一次發現可以在chrome裡面這樣子操作,chrome真的是神器,有很多工具真的很好用。
然後換成在後臺操作:
跑unitTest,結果無誤。
狗子走丟了,以後就剩我一個人了,一個人也要加油啊。