什么是Selenium?
WebDriver是主流Web應用自動化測試框架,具有清晰面向對象 API,能以最佳的方式與瀏覽器進行交互。
支持的瀏覽器:
- Mozilla Firefox
- Google Chrome
- Microsoft Internet Explorer
- Opera
- Safari
- Apple iPhone
- Android browsers
具體學習相關的地址:
簡書:https://www.jianshu.com/search?q=c%23%20Selenium&page=1&type=note(針對C#)
51testing:http://www.51testing.com/zhuanti/selenium.html
如何破解呢?
1. 破解思路/方案
首先我也是在網上找了很多破解滑動驗證的文章,主要看了下Github上面滑動驗證破解學習的代碼(python):https://github.com/dzhongyi/crack-geetest
代碼雖然是python的,但是思路很明確,於是我就去看了下菜鳥教程的語法,大致思路如下
1.找到滑動驗證碼的原圖與出現缺塊凹槽的驗證碼圖片
2.兩張圖片循環進行像素點對比,然后找到像素點色差比較大點就能
確定缺塊凹槽的位置,計算偏移度
3.根據計算的偏移度將滑塊移動到缺塊凹槽處
如何找到對應的原圖和凹槽圖呢?
F12看了下QQ控件滑動驗證的對應的圖片,去查找元素里面去找這個圖片地址
凹槽圖很容易被我們找到,
凹槽圖查找元素直接在頁面上可以找到
同樣【Network】中也能找到請求的地址圖片
例如
圖片地址:
然后我們目前只能看到凹槽圖,有人會發現【Network】中還有一個地址后面index=2的圖片,其實它不是原圖,它是滑塊
於是大家回去【source】去找,也會發現都沒有看到原圖的地址呢?
難道沒法找到原圖的地址嗎?
其實不是的,大家可以試試把上面那么長的地址后面index=1改為index=0,你就會發現這個圖就是原圖哦!
那么接下來就是對比像素得到缺塊凹槽的位置
代碼如下:
1 /// <summary> 2 3 /// 比較兩張圖片的像素,確定陰影圖片位置 4 5 /// </summary> 6 7 /// <param name="oldBmp"></param> 8 9 /// <param name="newBmp"></param> 10 11 /// <returns></returns> 12 13 public static int GetArgb(Bitmap oldBmp, Bitmap newBmp) 14 15 { 16 17 //由於陰影圖片四個角存在黑點(矩形1*1) 18 19 for (int i = 0; i < newBmp.Width; i++) 20 21 { 22 23 24 25 for (int j = 0; j < newBmp.Height; j++) 26 27 { 28 29 if ((i>=0&&i<=1)&&((j>=0&&j<=1)||(j>= (newBmp.Height-2)&&j<=(newBmp.Height - 1)))) 30 31 { 32 33 continue; 34 35 } 36 37 if ((i >= (newBmp.Width-2) && i <= (newBmp.Width - 1)) && ((j >= 0 && j <= 1) || (j >= (newBmp.Height - 2) && j <= (newBmp.Height - 1)))) 38 39 { 40 41 continue; 42 43 } 44 45 46 47 //獲取該點的像素的RGB的顏色 48 49 Color oldColor = oldBmp.GetPixel(i, j); 50 51 Color newColor = newBmp.GetPixel(i, j); 52 53 if (Math.Abs(oldColor.R - newColor.R) > 60 || Math.Abs(oldColor.G - newColor.G) > 60 || Math.Abs(oldColor.B - newColor.B) > 60) 54 55 { 56 57 return i; 58 59 } 60 61 62 63 64 65 } 66 67 } 68 69 return 0; 70 71 } 72 73
其中細心的同學會發現為啥比較像素點的時候,出現continue跳出的情況的呢?
在凹槽圖的四個角,有四個黑點,如果每個單位點去判斷,會導致導致像素會0的時候跳出循環,得到的偏移量自然就是0了,所以這肯定是有問題的,那么我是把這四個角的理解成1*1的矩形塊,所以在這個塊里的像素點直接跳出,不用比較
那么我們計算出了偏移量,如何移動滑塊呢?
不用急,了解Selenium就知道,它提供的有Actions這個類,下面有很多可以移動的方法
你可以直接調用DragAndDropToOffset移動元素到一定的偏移量
或者你可以使用ClickAndHold鼠標左鍵單擊並不松開,然后MoveByOffset移動一定的偏移量,最后Release釋放即可
然后中途我遇見一些bug
在使用PhantomJS+Selenium的時候,iframe中Actions對象所有的移動相關的方法都對元素不起任何作用,很痛苦呀,我在stackoverflow中發現很多人也都遇到這樣的情況,但是也都沒有明確的答案,最后還是放棄了PhantomJS+Selenium,選擇了Chrome+ Selenium形式進行測試,發現也還是沒有效果,於是換了其他電腦的Chrome瀏覽器試了試,發現居然可以了,可以肯定的是這個可能跟Chrome版本有關,高版本反而沒法玩,哎……,最近Selenium.Chrome.WebDriver這個組件更新到了2.35,貌似解決了這個問題
其實破解驗證碼是進行爬蟲系列操作的第一步也是最為關鍵的一步
源碼:https://github.com/0zhouquan0/QQ_LoginTest
效果圖: