推薦序 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 開始。
本書作者為中國大陸籍,因此全書使用百度為範例,為保留全書的完整性,圖的部分就保持簡體中文介麵,相信這小小的差彆,是不會影響本書的可看性的。
我,極力推薦這本書!
鬍嘉璽