发布新日志

  • Watir WedDriver支持的浏览器操作

    2013-01-27 15:26:02

    Watir Webdriver的工作方式是:

    Watir 脚本 -> Browser Driver -> Browser ->Screen (or headless)

    目前支持的Browser Driver 有IEDriver, ChromeDriver, FFDriver,SafariDriver, HeadlessDriver

    我们来看一下对各个browser的支持:

    Chrome

    标准创建
    browser = Watir::Browser.new :chrome

    带profile的创建,下例为设置不弹出download窗口,并设置下载默认路径

    profile = Selenium::WebDriver::Chrome::Profile.new
    profile['download.prompt_for_download'] = false
    profile['download.default_directory'] = "/path/to/dir"

    browser = Watir::Browser.new :chrome, :profile => profile

    带switch的创建,下例为忽略证书错误,关闭popup窗口弹出,禁止自动翻译
    browser = Watir::Browser.new :chrome, :switches => %w[--ignore-certificate-errors --disable-popup-blocking --disable-translate]

    设置代理
    browser = Watir::Browser.new :chrome, :switches => %w[--proxy-server=myproxy.com:8080]

    Firefox

    标准创建
    browser = Watir::Browser.new :firefox

    使用默认的profile
    browser = Watir::Browser.new :firefox, :profile => 'default'

    设置所需的profile
    profile = Selenium::WebDriver::Firefox::Profile.new
    profile['browser.download.dir'] = "/tmp/webdriver-downloads"
    profile['browser.download.folderList'] = 2
    profile['browser.helperApps.neverAsk.saveToDisk'] = "application/pdf"
     
    browser = Watir::Browser.new :firefox, :profile => profile

    禁止native event,该方法主要是window使用默认的一个较低level的交互方法来与webdrive进行交互,有时候会引起莫名的错误,可以禁止:
    profile = Selenium::WebDriver::Firefox::Profile.new
    profile.native_events = false
    browser = Watir::Browser.new :firefox, :profile => profile

    设置代理服务
    profile = Selenium::WebDriver::Firefox::Profile.new
    profile.proxy = Selenium::WebDriver::Proxy.new :http => 'myproxy.com:8080:, :ssl => 'myproxy.com:8080'

    browser = Watir::Browser.new :firefox, :profile => profile

    设置使用addon,例如:firebug
    profile = Selenium::WebDriver::Firefox::Profile.new
    profile.add_extension "../path/to/firebug.xpi"

    browser = Watir::Browser.new :firefox, :profile => profile

    IE

    标准创建
    browser = Watir::Browser.new :firefox

    IE使用默认配置,也就是说,你必须手工配置IE来满足你的需要。

    Safari

    标准创建
    browser = Watir::Browser.new :safari

    safari现在支持还不够完善,有待进一步更新。

    Headless

    Headless不是浏览器,他是ruby对Xvfb的封装,从而使得能headless的linux上运行一个图形界面程序。

    Xvfb or X virtual framebuffer 是一种将所有的图形化操作在内存中隐式运行,而不是在屏幕上显式运行的一种服务器。

    举个简单的例子
    require 'watir-webdriver'
    require 'headless'

    headless = Headless.new
    headless.start

    browser = Watir::Browser.start 'www.google.com'
    puts b.title
    b.close

    headless.destroy

    通过先生成headless,我们就能在非图形界面的操作系统上,运行一个图形界面的程序。


  • Watir Webdriver的mobile测试

    2013-01-27 14:52:21

    实际上,Watir Webdriver可以测试的仍然是Site,不是APP,可以用于测试mobile device访问的mobile site的方式有三种:

    1. 在一个真实的设备上,利用内置的browser进行测试
    2. 在一个仿真的设备上,利用内置的browser进行测试
    3. 在pc机上,将browser设置为mobile browser进行测试

    对于在真实设备上进行测试,速度会相对比较慢,而且iOS还需要额外的费用。

    而且还需要在iOs和Android的设备上先安装相应的driver。

    所以最简单的方法,就是利用webdriver-user-agent gem 进行模拟测试

    方法如下:

    require 'watir-webdriver'
    require 'webdriver-user-agent'
    driver = UserAgent.driver(:browser => :chrome, :agent => :iphone, :orientation => :landscape)
    browser = Watir::Browser.new driver
    browser.goto 'tiffany.com'
    browser.url.should == 'http://m.tiffany.com/International.aspx'


    我们可以看到,最关键的就是:

    driver = UserAgent.driver(:browser => :chrome, :agent => :iphone, :orientation => :landscape)

    这个步骤,指明了你要使用的浏览器类型,仿真器类型,和视图方式。

    该gem可以支持的浏览器有ff和chrome
    可以支持的仿真器类型有:iphone, ipad, android_phone, 和android_tablet
    支持的视图方式有两种,水平和竖直。 (portrait and landscape)

  • Selenium Webdriver和Watir Webdriver的详细对比

    2013-01-27 14:33:13

    我们来看一些具体的API,来对Selenium的WebDriver和Watir的Webdirver进行更加直观的了解


    1. 生成一个新的browser

    Selenium:

    driver=Selenium::WebDriver.for:firefox 

    Watir:

    driver=Watir::Browser.new:firefox


    2. 转向指定的页面

    Selenium:

    driver.get 'http://www.baidu.com'

    Watir:

    driver.goto 'http://www.baidu.com'


    3. 查找元素

    Selenium:

    element = driver.find_element(:id, "coolestWidgetEvah")

    Watir:

    element = driver.element(:id, "coolestWidgetEvah")


    4. 执行一段js代码

    Selenium:

    element = driver.execute_script("return $('.cheese')[0]")

    Watir:

    element = driver.fire_event("return $('.cheese')[0]")

    5. Alert 操作

    Selenium:

    alert = driver.switch_to.alert
    alert.ok

    Watir:

    browser.alert.ok


  • Selenium Web Driver 和 Watir Web Driver

    2013-01-27 14:19:25

    Watir Webdriver不仅仅是Watir的升级,实际上它是对Selenium WebDriver的API进行的二次封装。从而使得其API能够更好的符合Ruby语言的规范,和更加简单明确的方法应用。

    可以这么说,如果使用Ruby进行WebDriver开发,Watir WebDriver更加好用,更加简洁,更加利于新手的学习。 

     我们看一下Watir Webdriver和Selenium Webdriver的一个简单例子,从而更好的理解封装后的简便化:

    Selenium WebDriver

    require 'rubygems' 
    require 'selenium-webdriver' 
    driver = Selenium::WebDriver.for :firefox 
    driver.get "http://google.com" 
    element = driver.find_element :name => "q" 
    element.send_keys "Cheese!" 
    element.submit

    Watir WebDriver

    require 'rubygems' 
    require 'watir-webdriver' 
    driver = Watir::Browser.new:firefox 
    driver.goto "http://google.com" 
    element = driver.element(:name => "q") 
    element.send_keys "Cheese!" 
    element.submit

    从上面的语法可知,我们能从Watir Driver中明确的知道,我们要创建一个Browser的实例,指定browser的type。比selenium的构造方法更加明了。

    我们转向到想去的页面,goto比get更加容易理解。

    我们根据element的name在页面上查找,可以随时改变属性为:id,:value等等,更加便于我们二次封装。

    其他的基本上类似。所以说,在功能一致的情况下,一个更加便于阅读和理解的代码,对于初学者来说 更加容易去掌握,这更加符合ruby语言当初的初衷:让学习开发语言不再痛苦。
  • Selenium 2 简介

    2013-01-27 14:17:09

    selenium2 包括两部分:Selenium IDE和Selenium WebDriver。

    Selenium IDE作为Firefox的一个插件,以录制-回放的方式进行工作。主要是用来快速创建一个bug的回归测试脚本,

    或者辅助自动化测试来进行一下探索性测试。

    而Selenium WebDriver主要是用于创建一个强大而稳定的基于浏览器的回归测试的测试集。 甚至能够进行多种测试环境

    中进行分布式测试。

    Selenium WebDriver是RC的继承者,虽然在Selenium2中,我们仍然可以使用Rc,但是实际上,RC已经被正式的宣布不再

    进行更新。我们可以把Selenium2看作是如下三者的集合体:已有的RC+新的WebDriverAPI+二者共同使用的Selenium 

    Server。

    而且对于WebDriver和RC共同使用的Selenium Server在Selenium2中已经内置了网格支持。

    Selenium WebDriver的革新之处就是提供了一套WebDriver的API,从而使得我们可以在本地服务器或者远程服务器上像

    真实用户那样对浏览器进行操作。

    Selenium WebDriver的出现的目的是为了解决RC的一些限制。从而能够更好的支持动态页面,例如在不重载页面就更新

    了该页面一些元素的情况。

    Selenium WebDriver是通过直接调用浏览器的自有方法来达到驱动浏览器的目的。而RC的方式是将javaScript代码“注入

    ”到当前的浏览器中,当浏览器加载时,就将“注入”的javascript代码同时加载,从而这些“注入”的javascript驱动浏览

    器进行各种行为。简而言之,webdriver是直接驱动浏览器本身,RC是通过我们植入的代码,间接的驱动浏览器。

    如果你的Webdriver目的就是对一套固定的测试环境进行测试,是不需要使用Selenium Server的。只有在如下的情况下

    ,才会使用:
    1. 使用selenium-Grid将你的测试用例分布在不同的测试环境中。
    2. 你需要连接一个remote server来使用你当前环境下没有的浏览器。
    3. 你不想使用Java bindings(Python,C#或者Ruby),而是想使用HTMLUnitDriver的时候。
  • Cucumber的tags

    2013-01-25 13:55:01

    cucumber提供了一个简单有效的标志方法来帮你更好的整理你的测试流程

    使用起来很简单,只需要在代码行上加上你想要的标志,例如 

    在login.feature里添加@init, @major, @authenticate:
     @init
      Feature:  .  .  .
      .  .  .
      @major @authenticate
      Scenario:  A user should authenticate before accessing any resource.
         Given I do have a user named "testuser"
          When the user visits the login page
             And the user named "testuser" authenticates successfully
         Then I should see .  .  .
             .   .  .
    比如,我们想做一个初始化的流程的测试,只需要运行那些带有@init的feature即可:
    $ cucumber --profile=my_profile --tags=@init 
    也可以用:
    $ rake cucumber:init

    或者指定功能区域的authenticate相关的场景
    $ cucumber --profile=my_profile --tags=@authenticate features/login


    或者指定的功能级别:
    $ cucumber --tags=@major #没有指定profile的时候,会使用默认的profile

    对于rake的方式来说,想使用指定的tag,必须在config/cucumber.yml中预先定义才行。

    我们也可以指定执行@tag的index,例如下例就是指执行拥有第三个@major标签的场景
    $ cucumber --tags=@major:3 features/log

    我们可以使用反选符号~,例如下例就是指执行除了含有@major标签的场景之外的所有场景

    $ cucumber --tags=~@major features/log

  • Cucumber的 Step Definitions

    2013-01-25 13:09:09

    Cucumber的step deifne过程,就是通过正则表达式,将feature里的文本步骤转义为可执行的代码。

    好的步骤定义的标准是:

    匹配串尽可能的短
    最好能同时匹配正向和反向的条件
    一个步骤最多两个匹配参数
    用于匹配的参数名称最好简单明确
    每个步骤最好不要超过10行的处理,否则进行二次封装
    最好不要去引用其他的步骤


    在step define文件中,没有次序的概念,Given,When,Then可以任意行定义。

    甚至结构也可以是嵌套的, 例如:

    Given /some "(.*)" action/  do |act|
       .  .  .
    end

    Then /some "(.*)" action/  do |act|
       .  .  .
    end

    When /in an invoiced non-shipped situation/ do
      Given "some \"invoiced\" action" 
      Then "some \"non-shipped\" action"
      .  .  .
    end

    我们在上例可以看到, 在when里直接包含了已经预先定义好的Given和Then,这是允许的。但是最好不要这么做。

    事实上我们为了避免这种看起来很混淆的代码,我们一般用step来取代这些关键词,上面的例子就变为了:

    When /in an invoiced non-shipped situation/ do
      step("some \"invoiced\" action") 
      step %Q("some \"non-shipped\" action")
      .  .  .
    end


    %Q是用来去除多余的“符号

    对于多个step,我们可以用steps块来定义, 上例就变为:

    When /in an invoiced non-shipped situation/ do
      steps %Q{
      Given "some \"invoiced\" action" 
      Then "some \"non-shipped\" action"
      .  .  .
      }
    end



  • Cucumber的关键字

    2013-01-25 12:44:59

    Cucumber的关键字有如下

         Feature 功能
         Background 背景
         Scenario 场景
         Scenario outline 场景大纲
         Example 例子

    Given 假如
    And   而且
    ....
    Then  当
    And   并且
    ...  
    But  但是
    And  并且
    ...
    Then 那么
    And  并且
    ...

    我们在Step里面没有对应feature, Scenario, Scenario outline, example的匹配定义。

    对应background的是:
    Before do
    end

    After do
    end

    Before会在所有的场景前执行,After会在所有的场景后执行


    Given对应的是“假如”(Given)和“并且”(Given后的And)

    Given / / do |action|

    end

    But对应的是“但是”(But)和“而且”(But后的And)

    But / / do |action|

    end

    When对应的是“当”(When)和“而且”(When后的And)

    When // do |op|

    end

    When对应的是“那么”(Then)和“而且”(Then后的And)

    Then // do |result|
     
    end

  • Cucumber的目录结构

    2013-01-25 12:26:35

    Cucumber的目录结构很简单,我们举个简单的例子:

    features
    ├── step_definitions
    └── support
        └── env.rb
    你所定义的feature文件位于features目录下,你可以定义多个feature文件,例如一个user story一个。

    在step_definintions目录下,定义steps的map文件

    在lib目录下,定义map用的自动化测试脚本

    然后support目录下的env.rb,用于在执行feature前,进行你的环境初始化,例如,生成一个@browser=Watir::Browser.new:chrome. 并且初始化一些全局变量。


    实际上,我们能够用更复杂的方式来组织我们的目录结构,只要你保证所有的文件都在features文件夹里,任意指定即可。

    例如,使用功能区域组织我们的目录结构:

    |-- features
    |   |-- entities
    |   |   |-- entity.feature
    |   |   `-- step_definitions
    |   |       |-- anything.rb
    |   |       `-- entity_steps.rb
    |   |-- locations
    |   |   |-- location.feature
    |   |   `-- step_definitions
    |   |       `-- location_steps.rb
    |   |-- sites
    |   |   `-- step_definitions
    |   |-- step_definitions
    |   |   |-- local_assert_steps.rb
    |   |   |-- local_crud_response_steps.rb
    |   |   |-- local_email_steps.rb
    |   |   |-- local_file_steps.rb
    |   |   |-- local_script_steps.rb
    |   |   |-- local_steps.rb
    |   |   |-- local_web_steps.rb
    `   |   `-- local_xml_file_steps.rb   
        `-- support
            |-- env.rb
            |-- local_env.rb
            `-- local_transforms.rb

    或者用模块层次组织我们的目录结构:

    |-- features
    |   |-- models
    |   |   `-- entities
    |   |       |-- entity.feature
    |   |       `-- step_definitions
    |   |           |-- anything.rb
    |   |           `-- entity_steps.rb
    |   |-- views
    |   |   |-- entity_new
    |   |   `-- step_definitions
    |   |       `-- entity_new_steps.rb
    |   |-- step_definitions
    `   |   `-- local_steps.rb
        `-- support
            |-- env.rb
            |-- local_env.rb
            `-- local_transforms.rb

  • Cucumber的语法

    2013-01-25 10:47:06

    英文语法:
    
    # language: en
    Feature: Addition
      In order to avoid silly mistakes
      As a math idiot 
      I want to be told the sum of two numbers
     
    Scenario: case 1 - Add two numbers       
      Given the input "2+2"         
      When the calculator is run    
      Then the output should be "4" 
    
    Scenario Outline: case 2 - Add two numbers     
      Given the input "<input>"            
      When the calculator is run           
      Then the output should be "<output>" 
    
      Examples:
        | input | output |
        | 2+2   | 4      |
        | 98+1  | 99     |
    
    *But也是常用的关键字
    *Given,When,Then,But都可以在一个Scenario里出现一次或者不出现
    *Given后的And等同于Given, Then后的And等同于Then
    
    中文语法:
    
    # language: zh-CN
    功能:加法
      为了避免一些愚蠢的错误
      作为一个数学白痴
      我希望有人告诉我数字相加的结果
    
      场景: 两个数相加
        假如我已经在计算器里输入6		#Given
        而且我已经在计算器里输入7		#And(Given)
        我按下相加按钮			#When
        那么我应该在屏幕上看到的结果是13	#Then
    
      场景大纲: 将两个数相加
        假如我已经在计算器上输入<数值_1>
        而且我已经在计算器上输入<数值_2>
        当我按下 <按钮>
        那么我应该在屏幕上看到<结果>
    
      例子:
        | 数值_1 | 数值_2  | 按钮  | 结果 |
        | 20     | 30     | add  | 50   |
        | 2      | 5      | add  | 7    |
        | 0      | 40     | add  | 40   |
    没有When的
    
     场景: 两个数相加
        假如我已经在计算器里输入6		#Given
        而且我已经在计算器里输入7		#And(Given)
        而且我按下相加按钮			#And(Given)
        那么我应该在屏幕上看到的结果是13	#Then
  • Watir的xpath 应用

    2013-01-23 17:41:44

    Watir的element定位,是可以使用xpath来进行定位的,它的实现过程如下:
    通过DOM组件来获得HTML文件的源文件
    清除HTML源文件的格式,然后转化为一个正确的XHTML文件
    将XHTML作为一个输入传递给REXML
    使用REXML来解析XPath的表达式,从而获得指定元素的绝对路径
    将绝对路径通过COM方式返回给DOM,从而获得定位

    我们一般使用的XPath的路径表达式有: 
    // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 
    .  选取当前节点。 
    .. 选取当前节点的父节点。 
    @  选取属性。

    实例:

    1. 指定查找 


    我们有一个a元素为:<a href="test.htm">click me</a>


    browser.link(:xpath,"//a[@href='test.htm']").text

     # => "click me“


    如果这个a是第一个,我们可以用


    browser.link(:xpath, “//a”).html   #//a 返回第一个

    browser.link(:xpath, //a[1]).html   #//a[1] 数组是以1开始,非0


    2. 完全定位查找 


    百度的页面上有:


    <input type="submit" value="百度一下" id="su" class="s_btn" nmousedown="this.className='s_btn s_btn_h'" nmouseout="this.className='s_btn'">


    browser.button(:xpath,"//input[@id=‘su’]").type

    # => “submit"


    3. 也可以模糊查找

    browser.button(:xpath,"//input[contains(@id, ‘su’)]").type

    # => “submit"


    4. 相对路径 


    例如有:

    <div id="u">

    <a href="http://www.baidu.com/gaoji/preferences.html" name="tj_setting">搜索设置</a>

    </div>


    我们可以对a的父节点进行搜索:


    browser.element(:xpath, "//a/..").tag_name

    #=> "div"


    5. 完全模糊查找


    当我们只知道id,不知道type信息的情况下

    browser.element(:xpath, "//×[@id='u']").tag_name

  • cucumber的结果输出

    2013-01-23 11:21:39

    cucubmer可以直接输出结果为一个html文件

    命令行方式即可:

    cucumber features --format html --out public/output.html
    全部通过的结果:




    一部分failed的结果:



  • Watir各元素的私有方法(3)

    2013-01-22 17:42:36

    Radio button

    - set
    选择指定的radio选项
    browser.radio(:id, "radio1").set

    - set?
    判断该radio选项是否被选中
    browser.radio(:id, "radio1").set?


    Screenshot

    -base64
    以base64编码保存考屏图像
    browser.screenshot.base64

    -png
    以png编码保存考屏图像
    browser.screenshot.png

    -save(path)
    将图像保存到指定的路径
    browser.screenshot.save("c:")


    Select

    - clear
    清楚所有的选择好的选项
    browser.select(:id, "select1").clear

    - enabled?
    判断select是否可以选择
    browser.select(:id, "select1").enabled?

    - include?(str_or_rx)
    判断所有的选项的文本或者标签是否匹配指定字符串
    browser.select(:id, "select1").include?("option1")

    - options
    返回一个数组包含所有的选项
    browser.select(:id, "select1").options

    - select(str_or_rx)
    选择文本或者标签匹配指定的字符串的选项
    browser.select(:id, "select1").select("Argo")

    - select_value(str_or_rx)
    选择内容匹配指定的字符串的选项
    browser.select(:id, "select1").select_value("Argo")

    -selected?(str_or_rx)
    判断文本或者标签匹配指定的字符串的选项是否选中
    browser.select(:id, "select1").selected?("Argo")

    - selected_options
    返回一个数组包含所有已经选择的选项
    browser.select(:id, "select1").selected_options

    - value
    返回列表第一个选项的值
    browser.select(:id, "select1").value


    Table

    - [](idx)
    返回表的指定序号行
    browser.table(:id, "table1").[](0)

    - hashes
    将表的所有行以hash表方式返回
    browser.table(:id, "table1").hashes

    - row
    返回表格的行
    browser.table(:id, "table1").row(1)

    - rows
    返回表格的所有行的集合
    browser.table(:id, "table1").rows

    - to_a
    以2d方式生成一个row的集合
    browser.table(:id, "table1").to_a

    Table row

    - [](idx)
    返回指定行的表头或者单元
    browser.table(:id, "table1").[](0).th[](1)
    browser.table(:id, "table1").[](1).td[](2)


    Text Area

    - append
    在文本域的原有内容后添加指定文本内容
    browser.textarea(:id, "textarea1").append("test")

    - clear
    清除文本域所有文本
    browser.textarea(:id, "textarea1").clear

    - set
    将文本域中原有文本替换为现指定的文本
    browser.textarea(:id, "textarea1").set("test")



    Text Field

    - append
    在文本框的原有文本后添加指定文本内容
    browser.text_field(:id, "text_field1").append("test")

    - clear
    清除文本框的原有文本
    browser.text_field(:id, "text_field1").clear

    - set
    将文本框的原有文本替换为现指定的文本
    browser.text_field(:id, "text_field1").set("test")

    - enabled?
    判断文本框是否可以修改
    browser.text_field(:id, "text_field1").enabled?

    - type
    返回文本框的类型
    browser.text_field(:id, "text_field1").type


  • Watir各元素的私有方法(2)

    2013-01-22 16:32:44

    Filefield

    - set(path)
    设置文件的路径
    browser.file_field(:id, "test").set("c:")

    - value=(path)
    设置文件的路径
    browser.file_field(:id, "test").value="c:"


    Form

    - submit
    点击submit按钮,提交form
    browser.form(:id, 'form1').submit


    Frame

    - assert_exists
    判断该frame是否存在
    browser.frame(:id, 'frame1').assert_exists

    - execute_script(script, *arg)
    执行一个外部的JavaScript片段

    - html
    返回frame的inner html值
    browser.frame(:id, 'frame1').html

    - locate
    定位一个frame
    browser.frame(:id, 'frame1').locate


    Hidden

    - visible?
    判断隐藏的tag是否页面可见
    browser.hidden(:id, "test").visible?


    Image

    - file_created_date
    返回图片的创建日期
    browser.image(:id, "image1").file_created_date

    - file_size
    返回图片的大小
    browser.image(:id, "image1").file_size

    - height
    以像素为单位,返回图片的高度
    browser.image(:id, "image1").height

    - width
    以像素为单位,返回图片的宽度
    browser.image(:id, "image1").width

    - loaded?
    判断图片是否被加载
    browser.image(:id, "image1").loaded?

    - save(path)
    将图片按指定路径存储
    browser.image(:id, "image1").save("c:")

    Option

    - clear
    清除当前选定的选项
    browser.select(:id, "select1").options.first.clear

    - select
    选择指定的选项
    browser.select(:id, "select1").options.first.select

    - selected?
    判断指定的选项是否已经被选中
    browser.select(:id, "select1").options.first.selected?

    - text
    返回指定选项的文本内容
    browser.select(:id, "select1").options.first.text

    - toggle
    切换指定选项的状态
    browser.select(:id, "select1").options.first.toggle

  • Watir各元素的私有方法(1)

    2013-01-22 15:44:00

    Alert 
     
    - close    
    关闭当前的alert/prompt弹窗。此方法相当于点击Cancel,Close等按键。
    browser.alert.close

    - ok       
    点击alert/prompt弹窗的OK button
    browser.alert.ok

    -set(value) 
    在prompt弹窗中输入内容
    browser.alert.set('test')

    -text    
    返回alert/prompt弹窗的内容值
    browser.alert.text

    Browser

    -new
    创建新的实例
    browser = Watir::Browser.new:ff

    -start
    带参数创建新的实例
    browser = Watir::Browser.start("www.baidu.com", browser=:ff)

    - assert_exists
    判断该browser的instance是否存在
    browser.assert_exists
    => true

    - back
    返回上页,等同于点击browser的back键
    browser.back

    - close (等同于quit)
    关闭当前的窗口/页面
    browser.close

    - disable_checker(checker)
    关闭指定的checker
    browser.disable_checker(page)

    - execute_script(script, *arg)
    执行一个外部的JavaScript片段

    - forward
    页面向前进一步,等同于点击browser的forward按键
    browser.foward

    - goto(uri)
    页面转向指定的URI地址
    browser.goto('www.google.com')

    - ready_state
    返回表示browser就绪的标志内容
    browser.ready_state
    => "complete"

    刷新当前页面
    browser.refresh

    - reset!
    强行复位browser
    browser.reset!

    - status
    返回状态栏的内容
    browser.status

    返回页面body中的文本内容
    browser.text

    - title
    返回页面的title内容
    browser.title
    => "google"

    - url
    返回当前的url值
    browser.url
    => "http://www.google.com.hk/"

    页面在ready status出现前(complete),等待指定的秒数,默认5秒
    browser.wait(10)

    - window(*args, &blk)
    返回指定的browser所含的window
    browser.window(:title, 'Google')

    - windows(*arg)
    返回指定browser的window集合
    browser.windows(:title, 'Google')

    - wait_until(*arg, &blk)
    页面在条件满足前等待
    browser.wait_until(:title, 'Google')

    - wait_while(*arg, &blk)
    页面在条件满足时等待
    browser.wait_while(:title, 'Google')


    Button

    - enalbed?
    是否可以点击
    browser.button(:id, 'btkn').enabled?

    - text
    返回tag为<button>的文本值
    browser.button(:id, 'button').text

    - value
    返回tag为<input>的button类型的值
    browser.button(:id, 'inputbutton').value


    Checkbox

    -clear
    清除checked状态,变为unchecked
    browser.checkbox(:id, 'check1').clear

    -set(bool= true)
    设置状态,checked/unchecked
    browser.checkbox(:id, 'check1').set #checked
    browser.checkbox(:id, 'check1').set(false) #unchecked

    -set?
    判断checked状态
    browser.checkbox(:id, 'check1').set?
    => false #unchecked
     

    Cookie

    - add(name, value, pts = {})
    添加一个cookie到当前browser
    browser.cookies.add('my_session', 'testcookie', :secure => true)
    pts= :secure/:path/:expires /:domain

    - clear
    清除当前browser的所有cookie
    browser.cookies.clear

    - delete
    删除一个指定名字的cookie
    browser.cookies.delete('my_session')

    - to_a
    当前browser的所有cookie生成一个数组
    browser.cookies.to_a

  • Watir元素的常用方法

    2013-01-22 15:40:09

    == 是否相等
    attribute_value  返回指定属性的值
    add_checker 添加checker
    browser 返回所在browser对象
    click 左键单击
    clear 清除选择
    close 关闭
    double_click 左键双击
    drag_and_drop_by 拖拽到指定区域
    drag_and_drop_on 拖拽到指定元素上
    driver 返回所用的driver
    enabled? 是否可以点击
    exists? 是否存在
    fire_event 执行指定的事件
    flash 高亮该对象
    focus 焦点移至该对象上
    focused? 焦点是否在对象上
    hash 返回该对象的hash值
    hover 鼠标悬浮在该对象上
    html 返回该对象的html内容
    inspect 返回该对象的inspect值
    parent 返回该对象的父节点
    present? 是否存在并可见
    right_click 右键点击一次
    run_checkers 返回正在运行的对象列表
    style 返回对象的style值
    set 设置值
    send_keys 发送值参
    tag_name 返回对象的tag值
    text 返回对象的text值 
    to_subtype 返回对象的子类型
    type 返回对象的类型
    value 返回对象的value值
    visible? 是否可见
    wd 返回该对象的driver值
    wait_until_present 对象出现前等待
    waith_while_present 对象消失前等待
    when_present 对象出现前等待
  • Watir Web-Driver 的checkbox对象

    2013-01-21 17:49:38

    作为checkbox来处理的对象有:

    <input type="checkbox">


    可以用来定位checkbox的方法有:

    :class 类名
    :id    id号
    :index   索引号
    :name 名字
    :text 文本
    :value
    :xpath xpath路径
    multiple 混合方式


    通用的方法有:

    == 是否相等
    attribute_value  返回指定属性的值
    browser 返回所在browser对象
    click 左键单击
    clear 清除选择
    double_click 左键双击
    drag_and_drop_by 拖拽到指定区域
    drag_and_drop_on 拖拽到指定元素上
    driver 返回所用的driver
    enabled? 是否可以点击
    exists? 是否存在
    fire_event 执行指定的事件
    flash 高亮该checkbox
    focus 焦点移至该checkbox上
    focused? 焦点是否在checkbox上
    hash 返回该checkbox的hash值
    hover 鼠标悬浮在该checkbox上
    html 返回该checkbox的html内容
    inspect 返回该checkbox的inspect值
    parent 返回该checkbox的父节点
    present? 是否存在并可见
    right_click 右键点击一次
    run_checkers 返回正在运行的checker列表
    style 返回checkbox的style值
    set 设置checkbox的值,默认true(checked)
    set? 返回checkbox是否已经被checked
    tag_name 返回checkbox的tag值
    text 返回checkbox的text值 
    to_subtype 返回checkbox的子类型
    type 返回checkbox的类型
    value 返回checkbox的value值 (input类型使用)
    visible? 是否可见
    wd 返回该checkbox的driver值
    wait_until_present 出现前等待
    waith_while_present 消失前等待
    when_present 出现前等待

    例如:

    browser.checkbox(:id => 'checkit').when_present.click
  • Watir Web-Driver 的button对象

    2013-01-21 16:24:12

    作为button来处理的对象有:

    <button>
    <input type="button">
    <input type="image">
    <input type="reset">
    <input type="submit">


    可以用来定位button的方法有:

    :alt 别名
    :class 类名
    :id   id号
    :index   索引号
    :name 名字
    :src 源(image button only)
    :text 文本
    :value
    :xpath xpath路径
    multiple 混合方式


    通用的方法有:

    == 是否相等
    attribute_value  返回指定属性的值
    browser 返回所在browser对象
    click 左键单击
    double_click 左键双击
    drag_and_drop_by 拖拽到指定区域
    drag_and_drop_on 拖拽到指定元素上
    driver 返回所用的driver
    enabled? 是否可以点击
    exists? 是否存在
    fire_event 执行指定的事件
    flash 高亮该button
    focus 焦点移至该button上
    focused? 焦点是否在button上
    hash 返回该button的hash值
    hover 鼠标悬浮在该button上
    html 返回该button的html内容
    inspect 返回该button的inspect值
    parent 返回该button的父节点
    present? 是否存在并可见
    right_click 右键点击一次
    run_checkers 返回正在运行的checker列表
    style 返回button的style值
    tag_name 返回button的tag值
    text 返回button的text值 (button类型使用)
    to_subtype 返回button的类型
    value 返回button的value值 (input类型使用)
    visible? 是否可见
    wd 返回该button的driver值
    wait_until_present 出现前等待
    waith_while_present 消失前等待
    when_present 出现前等待

    例如:

    browser.button(:id => 'foo').when_present.click

  • Watir Web-Driver 的Screenshot处理

    2013-01-21 15:51:08

    watir可以对当前页面进行拍照,并按照指定格式转换,存储到指定位置

    (String) base64

    将拍照结果用base64编码: 

    #browser.screenshot.base64  
    #=> '7HWJ43tZDscPleeUuPW6HhN3x+z7vU/lufmH0qNTtTum94IBWMT46evImci1vnFGT' 

    (string) png

    将拍照结果使用png进行编码: 

    #browser.screenshot.png 
    #=> '\x95\xC7\x8C@1\xC07\x1C(Edb\x15\xB2\vL'

    (Object) save(path)

    将拍照结果存入指定路径下: 

    #browser.screenshot.save("screenshot.png")

    默认路径为当前目录


    事实上,我们可以指定其他格式,例如:

    #browser.screenshot.save("screenshot.jpg")
    #browser.screenshot.save("c:\\screenshot.jpg")

  • Watir Web-Driver 的cookie处理

    2013-01-21 14:59:09

    Watir可以对cookie进行一定的处理

     

    主要方法有

    - Object) add(name, value, pts = {})

    添加一个新cookie

    browser.cookies.add'my_session', 'testcookie', :secure => true

    opts操作符可以有:

    • :secure 
    • :path
    • :expires 
    • :domain

    - (object) clear

    清楚browser所有的cookie

     

    browser.cookies.clear

     

    (Object) delete(name)

    删除指定名字的cookie

     

    browser.cookies.delete('my_session')

    - (Array<Hash>) to_a

    将所有的cookie值返回成一个array

    browser.cookies.to_a

    #=> {:name=>"my_session", :value=>"testcookie", :domain=>"www.google.com"}

     

1465/8<12345678>
Open Toolbar