Splinter學習——不僅僅是自動化測試哦


  前兩天,想搶購一個小米MIX,結果,一開始搶就沒有了。於是想,作為程序猿,總得有點特殊手段吧,比如說一個小腳本。最近在學習python,百度了一下,發現了Splinter這個強大的東東!用了不到兩小時的時間,就可以實現許多令人點贊的功能,真讓人很興奮吶!

首先,官網(https://splinter.readthedocs.io/en/latest/index.html)介紹,一句話,一個開源工具用來通過python自動化測試web,讓電腦自動操作網頁:

Splinter is an open source tool for testing web applications using Python. It lets you automate browser actions, such as visiting URLs and interacting with their items.

既然可以自動操作網頁,當然不局限於自動化測試嘍!

 

第一步,下載Splinter模塊和Chrome或FireFox的驅動(就是強大的開源web自動化測試框架selenium的驅動

Splinter模塊是python egg,下載當然很簡單:pip install splinter

由於基於selenium,所以,FireFox和Chrome的驅動,都依賴於pip install selenium,不過好像執行pip install splinter之后默認就已經安裝了,沒有的話再安裝一下。

我這個用Chrome的驅動chromedriver,注意版本要對應,不然基本上會有unknown error,打不開瀏覽器!

官網下載地址:https://sites.google.com/a/chromium.org/chromedriver/downloads  當然這里需要可以連接上google!

selenium 3.x開始,webdriver/firefox/webdriver.py的__init__中,executable_path="geckodriver",所以火狐瀏覽器需要這個驅動!

下載地址:https://github.com/mozilla/geckodriver/releases/

上述驅動也可以在selenium官網中查找並下載:http://docs.seleniumhq.org/download/

下載之后,放在任意目錄,配置該目錄到系統環境變量的path中,讓電腦可以找到即可:
 

這樣,Splinter就可以自動打開瀏覽器,並進行操作了!

另外注意:1. Splinter的Browser類默認優先調用的驅動是firefox,所以用chrome的話需要在初始化Browser時候指定driver_name="chrome"參數,建議都明確指定瀏覽器!
      2. 如果chrome或者firefox的安裝目錄不是默認目錄,selenium可能會找不到瀏覽器,此時只要把瀏覽器的安裝路徑配置在電腦的path路徑中,讓selenium可以自動找到即可!
     例如報錯:
WebDriverException: Message: Expected browser binary location, but unable to find binary in default location, no 'moz:firefoxOptions.binary' capability provided, and no binary flag set on the command line
第二步,你可以根據官網的例子用python IDLE運行,打開瀏覽器並進入指定網頁,操作網頁。
我這邊有寫了一個自動登錄163郵箱的小腳本:
  1) 創建一個Browser實例,就會打開相應的瀏覽器。
  2) visit(url): 故名思議,訪問指定網站
  3) find_by_id("控件的id").first: 根據控件的屬性id找到控件,一般控件都有獨立唯一的id。不然,Splinter api還提供by_name,by_id,by_tag等方法!first表示返回第一次找到的控件。
  4) fill("要填充的內容"): 用指定的內容填充相應控件
  5) click(): 點擊控件   
  6) 登錄后,browser.cookies.all()中保存了本次登錄的cookie信息(dict類型),可以打印出來或者保存下次使用
7) quit_browser(browser)函數: 要求用戶交互輸入q再退出。否則,程序跑完之后就直接退出了,釋放Browser的實例,調用quit()方法,瀏覽器也就關閉了。
#coding:utf-8
from splinter import Browser
import time, threading
def qq_mail_login(url=None, username=None, password=None):
    with Browser(driver_name="chrome") as browser:
        browser.visit(url)
        browser.find_by_id(u"userNameIpt").first.fill(username)  
        browser.find_by_id(u"pwdInput").first.fill(password)  
        browser.find_by_id("btnSubmit").first.click()
        
        for k, v in browser.cookies.all().items():
            print (k, ":", v)         
            
        quit_browser(browser)
def quit_browser(browser=None):
    flag = input("Input q when you want to quit: ")
    if 'q' == str(flag):
        quit(browser)
    
if __name__=='__main__':
    url="http://email.163.com/"
    username="你的郵箱地址"
    password="你的郵箱密碼"
    #t1 = threading.Thread(target=qq_mail_login,args=(url,username,password))
    #t1.start()
    #t1.join()
    qq_mail_login(url,username,password)

 運行效果就是,你什么都不用管,可以自動用指定瀏覽器打開你的郵箱:

 

第三步,好了,言歸正傳,splinter這么強大,肯定不僅僅能做用來打開郵箱這么簡單事情。下來就想想,怎么用它來搶東西吧!
    於是,對上述代碼稍作修改:首先,登錄小米官網,登錄后,模擬點擊去搶購即可。
    在購買界面,J_chooseResultInit控件,是下一步操作的按鈕,在貨物不足的時候是隱藏的,所以,我這里用一個while循環,每10秒檢查一次,一直等待該按鈕可用。之后點擊進行下一步購買操作:
#coding:utf-8
from splinter import Browser
import time, threading
def qq_mail_login(url=None, username=None, password=None):
    with Browser(driver_name="chrome") as browser:
        browser.visit(url[0])
        #進入登錄界面
        browser.click_link_by_href("//order.mi.com/site/login?redirectUrl=http://www.mi.com/")
        #輸入用戶名密碼,完成登錄
        browser.find_by_id(u"username").first.fill(username)
        browser.find_by_id(u"pwd").first.fill(password)  
        browser.find_by_id("login-button").first.click()
        time.sleep(1)
        #進入購買界面
        browser.visit(url[1])
        #點擊購買“下一步”    
        count = 1
        while not browser.is_element_not_present_by_id('J_chooseResultInit'):
            print ("",count,"次: ",browser.is_element_not_present_by_id('J_chooseResultInit'))
            time.sleep(10)
            count += 1
        browser.find_by_id("J_chooseResultInit").first.click()
        quit_browser(browser)
        
def quit_browser(browser=None):
    flag = input("Input q when you want to quit: ")
    if 'q' == str(flag):
        quit(browser)
    
if __name__=='__main__':
    url=["http://www.mi.com/","http://item.mi.com/buyphone/mix/"]
    username="你的用戶名"
    password="你的密碼"
    #t1 = threading.Thread(target=qq_mail_login,args=(url,username,password))
    #t1.start()
    #t1.join()
    qq_mail_login(url,username,password)
    
因為現在只能進入到這個購買界面,也不知道下個界面有什么控件,所以該例子只是為了學習強大的splinter工具包!至少可以做些日常生活中的小工具嘛!
真想做好搶購工作,當然還有一個重要的問題是圖片驗證碼的處理。最理想的是多線程模擬請求發送,不過需要事先抓包構造請求數據,還是比較麻煩的。
不過現在網上都有或多或少的解決方案,感興趣的話,我會繼續研究並持續更新,不過這篇博客還是為了學習為主哦!
玩蛇網有一篇搶購火車票的帖子,我覺得也蠻不錯的,可以參考: http://www.iplaypython.com/news/a260.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM