帮酷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  |  如果智培  |  酷兔英语