selenium + firefox/chrome/phantomjs登錄之模擬點擊

登錄之模擬點擊

工具:python/java + selenium + firefox/chrome/phantomjsjavascript

(1)windows開發環境搭建

默認已經安裝好了firefox
php

  • 安裝pip

pip是一個python的軟件包管理工具,用於自動下載並安裝、更新python 包,python3以後的某些版本已經自帶pip,在python 2.7以前的話,須要本身安裝,如今的安裝方法已經很是簡單,直接查看官方doc:http://pip.readthedocs.org/en /stable/installing/,下載get-pip.py並執行python get-pip.py便可一鍵安裝。其餘方法可參考《怎麼在windows下安裝pip。爲了便於使用,最好添加到系統變量PATH中。
css

  • 安裝phantomjs

從官網下載windows版本的壓縮包(http://phantomjs.org/download.html)。下載以後,直接解壓到本地。建議使用最新版phantomjs-2.0.0-windows.zip,由於有些狀況下phantomjs不能正確的解析僅僅是由於版本兼容性很差,這種bug基本無解,繞來繞去最終換過版本就行了。html

  • 安裝selenium

若是是python環境,安裝好pip以後,直接使用java

[plain] view plain copy
  1. pip install selenium  
  2. pip install --upgrade selenium # 升級到最新版本  


若是是java環境,下載一個完整的selenium-server-standalone-2.48.2.jar包便可,這個包很大,已經包含了全部依賴包和各類driver如(htmlunit driver之類的)
python

(2)linux(debian)開發環境搭建

  • 安裝firefox

版權問題,debian自帶的瀏覽器並非firefox。若是想在debian環境下,使用firefoxDriver進行模擬點擊,就必須先安裝firefox。我在debian服務器上試了幾種方法均失敗,不過下面仍是說一下找到的幾種方法。linux

方法一:從firefox官網下載linux版以後,直接解壓firefoxgit

方法二:命令行安裝。github

參考
web

1.

  •              libsqlite3-dev libfontconfig1-dev libicu-dev libfreetype6 libssl-dev \   
  •              libpng-dev libjpeg-dev python libx11-dev libxext-dev  
  • b. 編譯,大約須要半個小時,請耐心等待

[plain] view plain copy
  1. git clone git://github.com/ariya/phantomjs.git   
  2. cd phantomjs   
  3. git checkout 2.0   
  4. ./build.sh  

具體可參考phantomjs的官網:http://phantomjs.org/build.html

  • 安裝selenium

跟windows同樣簡單,直接pip install selenium就搞定,前提是pip可用。

(3) selenium的使用介紹

selenium是一個自動化測試工具,支持多種編程語言java/python /javascript/ruby/php/C#/perl。咱們在爬蟲中主要用於抓取動態頁面時模擬瀏覽器行爲,繞事後臺執行js的複雜過程,用「所見 即所得」的方式進行頁面點擊、截屏、懸浮窗拖拽等。以前中文資料比較少,加上selenium 2.0和1.0巨大的區別,csdn上的中文博客大多很差使。剛搜了一下,好像有些中文社區和更正式一點的博客,感受不錯,先貼出來:

1. 《webDriver中文教程 & 中文社區》貌似是今年的,比較官方的樣子,還沒細看

2. 《Selenium Webdriver 簡易教程

3.  官網的webdriver使用文檔,也屬於入門級別,有些複雜操做須要從其餘有經驗的使用者的博客裏邊略窺一二。

4.《The Selenium Browser Automation Project》介紹比較全面。

 下面主要介紹一下可能遇到的坑,別人的經驗能夠參考《記錄我遇到的使用selenium讓人摸不着頭腦的問題 》,下面是我碰過幾回的

  • iframe & window

Selenium2(webdriver)在使用get(url)方法打開一個網頁的時候,是不會繼續加載裏面的iframe中的頁面源碼,這與selenium 1的使用不一樣。當碰到有些元素不可選的時候,可使用開發者工具查看是否有iframe元素。

 

[python] view plain copy
  1. # 切換iframe  
  2. driver.switch_to.frame("frameName") # 還有其餘api  
  3. # 切換window  
  4. for handle in driver.window_handles:  
  5.    driver.switch_to.window(handle)  


  • 不一樣的webdriver

     官網已經有使用webdriver的優缺點的比較,例如firefox一般比ie快,而無界面的HtmlUnitDriver一般會比firefox快,但對js的支持並非那麼好。而且不一樣driver對xpath語法的支持也不同。

    就我的使用經驗來看,即使是一樣的webdriver差異仍是有點大的。例如在某些firefox的版本是能夠抓取數據的,但在另一些版本就不 行,selenium在這兩年的演化過程當中,中途出現過對最新firefox各類報錯、但對老版本firefox就正常,以及對老phantomjs不能 抓取,最新版本phantomjs就OK的狀況。當遇到各類很詭異的關於瀏覽器不能抓取問題的時候,須要考慮嘗試不一樣的webdriver,以避開 selenium對個別型號的瀏覽器支持不良的狀況。

 

  • 隱式等待與顯示等待

    當網頁上有ajax等動態元素時,webdriver.get(url)只會等待html和js文件加載完成,但不必定會等待js生成的元素都出如今頁面 源碼中。使用xpath或者css選擇器的時候,若是js產生的代碼沒有加載完成,就會報錯,這種咱們用開發者工具能發現的元素,但webdriver找 不到的狀況,一般都是由於等待時間不夠形成的。一般有兩種方法:

第一種隱式等待,優勢是想法簡單,缺點是不一樣的頁面須要的加載時間不一樣,爲了保證數據正確,須要取一個最大的等待時間,拖慢代碼執行效率。python中的源碼以下

[python] view plain copy
  1. <span style="font-size:12px;"># 每次獲取頁面都設置10秒鐘的超時時間</span>  

driver.implicitly_wait(10) 第二種是顯示等待。用於指定等待到頁面加載到某些爲真的可控條件,例如出現某個元素以後,就認爲須要的頁面內容已經加載完成了,python代碼以下:

[python] view plain copy
  1. <span style="font-size:12px;"># 構建WebDriverWait,設置最大超時時間是30秒</span>  

wait = WebDriverWait(driver, 30)

[python] view plain copy
  1. <span style="font-size:12px;"># 等待頁面出現id=authFrame的元素出現,一旦出現就進入下一步</span>  

wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,'authFrame'))) 關於數據等待能夠參考:如何等待頁面元素加載完成》java實現,同時舉了個須要頁面等待的栗子。

(4)itunes登錄的代碼示例

一切不上代碼的演示都是耍流氓。

 

[python] view plain copy
  1.         import selenium,platform  
  2.         from selenium import webdriver  
  3.         from selenium.webdriver.common.by import By  
  4.         from selenium.webdriver.common.desired_capabilities import DesiredCapabilities  
  5.         from selenium.common.exceptions import TimeoutException  
  6.         from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0  
  7.         from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0  
  8.         from selenium.webdriver.common.by import By  
  9.           
  10.         driverPath = '/home/phantomjs/bin/phantomjs'  
  11.         if platform.system()=='Windows':  
  12.             driverPath = 'D:/python_tool/phantomjs-2.0.0-windows/bin/phantomjs.exe'  
  13. #         driver = webdriver.PhantomJS(executable_path=driverPath) #使用phantomJs進行驅動  
  14.         driver = webdriver.Firefox() #使用FireFox進行模擬點擊,運行此段代碼的時候,會啓動firefox  
  15.          
  16.         url = 'https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa' # itunes登錄頁面  
  17.         driver.get(url) # 跟瀏覽器同樣加載頁面  
  18. #        driver.implicitly_wait(10) #每次加載頁面的時候等待10秒鐘  
  19.         wait = WebDriverWait(driver, 30) # 頁面加載時間可能比較長  
  20.         try: # 等待頁面加載完成  
  21.             wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,'authFrame'))) # 等待出現id爲authFrame的元素載入完成  
  22.             wait.until(EC.element_to_be_clickable((By.ID,'appleId'))) # 等待出現id爲appId的元素能夠點擊  
  23.             print driver.title   
  24.         except:   
  25.             print 'error'*20  
  26.             driver.quit()  
  27.         # 輸入帳號、密碼並點擊提交  
  28.         driver.find_element_by_id('appleId').send_keys(self.account)  
  29.         driver.find_element_by_id('pwd').send_keys(self.password)  
  30.         driver.find_element_by_id('sign-in').click()  
  31.         # 顯示等待一段頁面跳轉  
  32.         time.sleep(5)  
  33.   
  34.         print '---  login success  ----'  
  35.         #print driver.get_cookies()#打印cookie  
  36.         for cookie in driver.get_cookies():   
  37.             print "%s -> %s" % (cookie['name'], cookie['value'])  
  38.         return  

若是想訪問別的數據頁面,能夠driver.get(url)和click方法逐步訪問、點擊。這個效率會比較低,selenium也可使用多線程操做,但selenium並不保證多線程的數據一致性,簡單的講對多線程的支持不是很好。

相關文章
相關標籤/搜索