推薦序
Selenium 一直是網頁開發測試產業界的明星,從WebDriver 時代就獲得不少人的青睞,但是在Selenium 真正併購Webdriver 後,這個產品才算真正完整,再加上瀏覽器端的IDE 等完美結合,讓網路應用程式的測試之路好走不少。
在Stackoverflow 上看到大家的提問,Selenium 大部分是用Java 實作,但這三年,用Python 的有越來越多的趨勢,筆者在使用Selenium 的期間,一直納悶怎麼沒有一本完整的書來介紹這個好料,直到今年電子工業出版社,終於有人完成了。
我接觸Selenium 大約有三年的時間,但主要的用途不是測試,而是爬蟲。
對,就是爬蟲。爬蟲是大數據的資料來源之一,很多大數據的網站或教學,都是以爬蟲開始的。筆者早期使用Ruby 的Nokogiri,也使用了Mechanize,都能滿足大部分的需求了,但在這幾年,網頁程式的功能越來越複雜,Nokogiri或是Mechanize 慢慢已經無法滿足要求了。
首先就是使用原理上的大相逕庭。Nokogiri 或Mechanize, 主要只是把HTML 下載回客戶端,然後再來分析HTML 中的元件,就先不說Captcha了,連一個簡單的Ajax Call,當你Refresh 網頁時,整個HTML 的內容都變了,Nokogiri/Mechanize 在遇到這種情況時,就會有很多問題,更不要說麻煩的Javascript 或是jQuery 了。
Selenium comes to the rescue!
Selenium 是一個以瀏覽器為基礎的爬蟲軟體( 對,不是測試軟體,是爬蟲)。
換句話說,你必須安裝了瀏覽器,才能執行Selenium。WebDriver 支援的瀏覽器預設為Firefox,但Chrome 和其它瀏覽器都可以,只要你有安裝該瀏覽器,並且對應到應有的Driver 即可。
有瀏覽器之後,什麼事就變的簡單了。你可以利用WebDriver 提供的各種方法來和網頁上的任何元件互動。要找元素?沒問題,用findElemendById。
要找Javascript ?沒問題,用XSpath 來找,要按「同意授權」?沒問題,用.click 或是.submit。要抓螢幕上的截圖?沒問題,用save_screenshot。
Selenium 出現之後,我相信你真的不會想再用Nokogiri 或Mechanize 了( 當然簡單的爬蟲還是可以不用牛刀啦)。
Selenium 更提供了非常強大的Python 函數庫, 你可以自定Exception Condition,可以使用Wait 來等某一個元件的出現( 這在Javascript 流行的當今太重要了! ),更可以設定重新刷新頁面,或是等待一下,讓你的操作更符合真人的操作,有了Selenium,不要說灌票了,訂票系統,搶購系統,秒殺系統,對你來說真的輕而易舉,快速搶上n 隻新的iPhone 7 都不會太難了。
本書真的算拋磚引玉,因為很多重要的東西也沒提到。和Selenium 搭配最棒的PhantomJS 就沒提。大家都知道許多hardcore 的宅男,他們的開發環境是完全沒有圖型介面的。有了PhantomJS 不但可以不安裝瀏覽器,Selenium 本身沒提供的可變User Agent Header,就可以靠PhantomJS 完成,筆者在使用了PhantomJS 之後,也不再使用Firefox Driver。當然你也可以用Xvfb 來Export Display 給Firefox 使用,稱之為Headless,但還得安裝一大堆有的沒的dependencies,PhantomJS 太方便了。
筆者在配合了OpenCV 之後, 成功破解許多網站的Captcha 機制, 讓Selenium 搖身一變成為註冊機器人,配合ipython 可以線上開發機器人,配合numpy 可以算出不同圖型的相似度,Selenium 的好處說不完!
更變態的用法,在搭配了Sikuli( 一個MIT 畢業的台灣人寫的) 之後,真的可以說天下無敵了!連Windows/Mac/Linux 的桌面操作或Terminal 操作都能自動化了!這已經超脫了自動化測試或爬蟲的高度,而朝向電腦Robot 的境界前進,當然這一切,你還是要從熟悉Selenium 開始。
本書作者為中國大陸籍,因此全書使用百度為範例,為保留全書的完整性,圖的部分就保持簡體中文介面,相信這小小的差別,是不會影響本書的可看性的。
我,極力推薦這本書!
胡嘉璽