帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:自动化  Webdriver  Nokogiri  WEB  AUTO  DSL  
Web automation DSL with multiple backend support

  • 源代碼名稱:pincers
  • 源代碼網址:http://www.github.com/platanus/pincers
  • pincers源代碼文檔
  • pincers源代碼下載
  • Git URL:
    git://www.github.com/platanus/pincers.git
  • Git Clone代碼到本地:
    git clone http://www.github.com/platanus/pincers
  • Subversion代碼到本地:
    $ svn co --depth empty http://www.github.com/platanus/pincers
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • Build Status

    鉗子是一個在webdriver或者普通 net/http之上啟發的ruby DSL 。 換句話說:一個容易使用的函數集,允許你在Javascript密集網頁上刷新或者自動導航。

    pincers diagram

    示例

    require'pincers'Pincers.for_webdriver :chromedo |pincers|
     pincers.goto "https://github.com" pincers.search("input[name=q]").set("pincers")
     pincers.search("form[action='/search']").submit
     pincers_repo = pincers.search(".repo-list-item").first
     name = pincers_repo.search("h3 a").text
     stars = pincers_repo.search("a[href$=stargazers]").text
     puts"The repo #{name} has #{stars} stars"end
    太棒了但我已經知道了。 ! 我為什麼需要這個?

    jQuery介面以非常實用的方式解決了DOM元素遍歷,大多數程序員都覺得很舒服。 當使用列出的任何選項 above 時,我們發現自己缺少使用jquery的易用性。

    另外,通過使用nokogiri的功能,鉗子可以以使用純資料庫的一小部分時間提取複雜數據。 看一下的只讀結果。

    插件功能:

    • 對jQuery選擇器的完全支持。
    • 簡單的介面,也像jQuery一樣,你只能與一個鉗子對象類型交互。
    • 為動態網頁構建的明智的等待約定。
    • 支持使用相同DSL的webdriver和 net/http + nokogiri後端。
    • 能夠 switch 到 nokogiri,用於解析( 保持相同的DSL ) 數據提取的。 看一下的只讀結果。
    • 模擬模擬當前瀏覽器( Cookies 和標頭)的隨機http請求的能力。

    安裝

    要安裝僅運行:

    gem install pincers

    或者添加到你的Gemfile並運行 bundle install:

    gem 'pincers'

    基本用法

    使用你喜愛的瀏覽器創建一個新的pincers root 上下文:

    Pincers.for_webdriver :chromedo |pincers|
     # do something, driver object will be discarded at the end of the block.end

    你還可以傳遞一個webdriver對象,或者另一個像 :firefox 或者 :phantomjs 這樣的符號。

    你也可以在我們的 backend上使用 pincers DSL DSL 。

    清理

    使用不帶 block的Pincers.for_webdriver 工廠方法是 posible,你需要在完成以下操作后通過調用 close 手動釋放相關資源:

    pincers =Pincers.for_webdriver :chrome# do somethingpincers.close # release webdriver resources

    基本導航

    要做的第一件事情是導航到某個網址:

    pincers.goto 'www.crabfarm.io'

    全文搜索

    如果你以前用過 jQuery,這對你來說很熟悉。

    請考慮以下示例 below的HTML結構:

    <body>
     <divid="first-parent"class="my-class">
     <pid="first-child"class="child-class other-class">Foo</p>
     <pid="second-child"class="child-class">Bar</p>
     </div>
     <divid="second-parent"class="my-class">
     <pid="third-child"class="child-class">Imateapot</p>
     </div>
     <pid="fourth-child"class="child-class">Imateapot</p>
    </body>

    通過使用 search 方法,大多數在鉗子中遍歷的元素都是通過擴展選擇器( ) 來完成的:

    # Select the second parent by jumping through loops:pincers.search(".my-class:has(p:contains('Imateapo'))")

    這裡調用將返回另外一個收費的上下文contaning所有匹配給定選擇器的元素。 英鎊上下文對象是可以枚舉單個元素上下文上下文的枚舉,因此你可以在單獨元素上使用鉗子方法:

    pincers.search('.my-class').map do |div|
     div.search('.child-class') # div is also a contex!end

    Pincers 上下文還有 firstlast 方法,返回在單獨的上下文上下文on第一個和最後一個元素。

    pincers.search('.my-class').first # first is also a context!

    的上下文搜索將搜索所有包含元素的子元素:

    parents = pincers.search('.my-class')
    parents.search('.child-class') # will select all childs except fourth-child

    使用可以讓你在使用 tagcontentsclass 或者任何屬性進行搜索時,也可以使用

    pincers.search(tag:'p', class:'some-class other-class')
    pincers.search(tag:'input', value:'email@crabfarm.io')
    pincers.search(content:'Title')

    上下文屬性

    檢索所有匹配元素的連接文本內容。

    pincers.search('#first-parent').search('.child-class').text # = 'FooBar'

    檢索所有匹配元素的連接的html內容。

    pincers.search('.child-class').to_html # will dump all p elements in our example.
    第一個元素屬性

    上下文調用的方法中有幾種方法只適用於該上下文所包含的第一個元素:

    從第一個匹配元素中檢索屬性:

    pincers.search('.child-class')[:id] # = 'first-child'pincers.search('.child-class').attribute('id') # same as above

    從元素中檢索標記名稱:

    pincers.search('.child-class').tag # = 'p'

    從第一個匹配元素中檢索具有所有類的array:

    pincers.search('.child-class').classes # = ['child-class', 'other-class']

    元素交互

    以下方法更改了元素或者文檔狀態,僅在某些後端可用。 元素屬性類似,當調用時,這些方法隻影響上下文中的第一個元素。

    設置文本輸入上的文本的步驟

    pincers.search('input#some-input').set 'sometext'

    選擇選擇框選項的標籤

    pincers.search('select#some-select').set 'Some Label'

    選擇選項文本選擇框選項

    pincers.search('select#some-select').set 'Option text'

    或者按選項值

    pincers.search('select#some-select').set by_value:'option-value'

    更改複選框或者單選按鈕狀態

    pincers.search('input#some-checkbox').set # checkpincers.search('input#some-checkbox').set false# uncheck

    單擊按鈕( 或者任何其他元素)

    pincers.search('a#some-link').click

    直接提交表單

    pincers.css('form').submit

    在元素上懸停

    pincers.search('div#some-menu').hover

    root-屬性

    root 上下文有一些特殊的方法來訪問文檔屬性。

    獲取文檔標題

    pincers.title

    獲取文檔 url

    pincers.url
    pincers.uri # same as url but returns an URI object

    獲取文檔驅動程序本身( java driver驅動程序或者 nokogiri root node )

    pincers.document

    高級主題

    只讀結果

    使用webdriver提取需要超過大列表或者大量 table 行的數據,可能會痛苦地緩慢。 為了處理大數據集,鑷子提供了 readonly 方法,它將 web a 備份結果轉換為一個備份的nokogiri 。

    list_contents = pincers.search('#long-list').readonly do |list|
     # operating over list is very fast list.search('li').map &:textend

    Chenso後端

    chenso後端提供了導航簡單頁面( 類似機械化)的高性能方法。 它使用了 net/http + nokogiri而不是,提供了對大多數鉗子功能的支持。

    Chenso不做 javascript 所以在Chenso備份的爪子對象上禁用等待。

    要使用chenso後端,只需使用 for_chenso 工廠方法生成一個新的鉗子上下文:

    Pincers.for_chenso do |pincers|
     # same DSL as the webdriver backed context.end

    Chenso還支持客戶端SSL證書,使用客戶端證書使用 ssl_certssl_key 選項:

    Pincers.for_chenso(
     ssl_cert:OpenSSL::X509::Certificate.new(File.read('./client.cert.pem')),
     ssl_key:OpenSSL::PKey::RSA.new(File.read('./client.key.pem'))
    )
    導航幀

    鉗子操作一次只能瞄準一個幀。 默認情況下,在更改位置時選擇頂部框架。 要使用 switch 到diferent幀,請使用帶有 frame: 選項的goto 方法:

    pincers.goto 'http://www.someurlwithfram.es'pincers.goto frame: pincers.search('#my-frame')
    pincers.text # this will return the '#my-frame' frame contents

    提示:你也可以直接使用選擇器

    pincers.goto frame:'#my-frame'

    要在使用子框架后導航回頂部幀,請使用特殊標識符 :top:

    pincers.goto frame::top
    正在等待條件

    在javascript中啟用後端,即使鑷子最好做等待,有時需要等待特殊條件才能與元素交互:

    pincers.search('#my-async-stuff').wait(:enabled)

    posible等待以下狀態:

    • :present: 等待元素可見
    • :actionable: 等待元素能夠接收輸入
    • :enabled: 等待輸入被啟用
    • 任何有效的DOM屬性,如 :disabled 或者 :value

    通過傳遞 block 還可以等待定製條件,進程將等待 block 停止返回 false ( 只有 false,不是 nil ) 。

    pincers.search('#my-async-stuff').wait { |r| r.count >10 }

    在使用自定義條件時,還可以等待 block 不引發導航錯誤。

    pincers.search('#async-button').wait { |r| r.click } # wait until click succeeds

    默認情況下,等待進程在 10秒內超時。 設置 Pincers.config.wait_timeout 屬性或者通過使用 timeout: 選項調用搜索函數,可以更改這裡屬性:

    pincers.search('#my-async-stuff').wait(:enabled, timeout:5.0)
    正在下載資源

    你可以使用 link link link image image或者任何其他有 src 屬性的元素,從當前載入的文檔下載資源。 這裡方法不支持 Javascript

    dl = pincers.search('#a-download-link').download
    dl.content # the resource data as stringdl.content_type # the resource content typedl.save('/some-file.txt') # store resource in file
    驅動程序選項

    鉗子嘗試以一種適合大多數用例的方式來配置webdriver橋。 如果需要為特殊情況進一步配置驅動程序,則使用 for_webdriver 方法時可以以使用以下選項:

    • :proxy: 像 www.myproxy.com:40 或者 selenium Proxy 對象的url 。
    • :wait_timeout: 元素查找的默認等待超時和任何對 context.wait的調用
    • :page_timeout: 頁面載入超時毫秒,默認值為 60秒。
    • 任何有效的webdriver配置鍵

    使用已經創建的webdriver對象調用 for_webdriver 也是 posible:

    pincers =Pincers.for_webdriver some_driver_object

    如果使用了這個創建方法,那麼只有 page_timeoutwait_timeout 是可用的。

    訪問後端對象的基礎

    有時( 希望不要太頻繁) 需要訪問原始的webdriver或者 nokogiri api 。 鉗子為你提供了幾種方法。

    若要使文檔處理程序本身在 root 上下文中調用 document,請執行下列操作:。

    pincers.document # webdriver driver or nokogiri root node

    要獲取鉗鉗上包含的節點,請用 elements

    pincers.search('foo').elements # array of webdriver elements or nokogiri nodes.

    • fork
    • 創建你的特徵分支( git checkout -b my-new-feature )
    • 提交你的更改( git commit -am 'Add some feature' )
    • 推送到分支( git push origin my-new-feature )
    • 創建新的拉請求

    Credits

    感謝你的貢獻者。

    Crabfarm

    pincer是 Crabfarm框架的一部分。

    許可證

    鉗子是 © 2015 Platanus,spa 。 它是免費軟體,可以根據許可協議文件中指定的MIT許可條款重新發布。



    文章标签:WEB  AUTO  自动化  DSL  Webdriver  Nokogiri  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语