class Browser

初始化测试用浏览器

@author: Hub

@Date: 2015-1-5

Constants

PHANTOMJS_SIZE
REMOTE_SIZE

Attributes

browser[R]

Public Class Methods

new(type = :www, *args) click to toggle source

初始化函数

可以配置测试的mode:

1.:mode
   :local  本地环境上测试
   :remote 远程测试环境上测试
2.:browser
   :chrome
   :firefox 
3.:agent wap页面的useragent类型 
   :iphone
   :android_phone
4.:address  当mode为:remote时,url指定远程执行脚本的地址
# File lib/actir/webdriver/browser.rb, line 32
def initialize(type = :www, *args)
  args = init_args(*args)
  @browser_type = args[:browser]
  @agent = args[:agent]
  @mode = args[:mode]
  @window_size = args[:window_size]
  if @mode == :remote
    @url = if args[:url]
      "http://#{args[:url]}/wd/hub"
    else
      #TO-DO ,远程模式没有传入IP,改成local模式
      @mode = :local
      puts "selenium-node's IPAddress is null. switch to local mode"
    end
  end
  if type == :www
    @watir_browser = browser_www
  elsif type == :wap
    @watir_browser = browser_wap
  else
    raise "error browser type , please send args with :www or :wap!"
  end
  define_page_method
end

Public Instance Methods

basic_page?(klass)
Alias for: valid_page_klass?
browser_wap() click to toggle source

通过useragent打开WAP页面

local模式下直接打开本地chrome浏览器,或者使用phantomjs无界面执行

remote模式下通过设置chrome的switches参数远程打开测试环境上的chrome浏览器

TO-DO: remote模式的phantomjs

# File lib/actir/webdriver/browser.rb, line 162
def browser_wap
  case @mode
  when :local
    driver = Actir::Webdriver.driver(:browser => @browser_type, :agent => @agent)
  when :remote
    driver = Actir::Webdriver.driver(:browser => @browser_type, :agent => @agent, :url => @url)
  end
  browser = Watir::Browser.new driver
  if @browser_type == :phantomjs
    #重新设置窗口大小,不然phantomjs的ghost driver各种问题 = =
    browser.window.resize_to(PHANTOMJS_SIZE["width"], PHANTOMJS_SIZE["height"])
  end
  browser
end
browser_www() click to toggle source

打开普通www浏览器

# File lib/actir/webdriver/browser.rb, line 129
def browser_www
  case @mode
  when :local
    #本地chrome浏览器
    browser = Watir::Browser.new @browser_type
  when :remote
    #远程服务器的chrome浏览器
    browser = Watir::Browser.new(
      :remote, 
      :desired_capabilities => @browser_type, 
      :url => @url
    )
  end
  #重新设置窗口大小,不然phantomjs的ghost driver各种问题
  if @browser_type == :phantomjs
    browser.window.resize_to(PHANTOMJS_SIZE["width"], PHANTOMJS_SIZE["height"])
  elsif @mode == :remote
    browser.window.resize_to(REMOTE_SIZE["width"], REMOTE_SIZE["height"])
  elsif @window_size != nil
    browser.window.resize_to(@window_size["width"], @window_size["height"])
  end
  browser
end
define_page_method() click to toggle source

自动定义驱动需要调用的所有元素相关的方法 需要所有的页面元素相关的类名以XXXPage方式命名

# File lib/actir/webdriver/browser.rb, line 179
def define_page_method
  p Module.constants.grep(/(Page|Wap)$/) if $debug
  Module.constants.grep(/(Page|Wap)$/).each do |page_klass|
    if basic_page?(page_klass)
      method = ""
      if page_klass.to_s =~ /Page$/
        method_name = page_klass.to_s.gsub!(/Page$/, "_page")
      elsif page_klass.to_s =~ /Wap$/
        method_name = page_klass.to_s.gsub!(/Wap$/, "_wap")
      end
      self.class.send :define_method, "#{method_name.downcase}" do
        page = Module.const_get(page_klass).new(@watir_browser)
        page
      end #define_method
      puts "defined #{method_name.downcase}" if $debug
    end #if
  end #each
end
goto(uri) click to toggle source
Calls superclass method
# File lib/actir/webdriver/browser.rb, line 57
def goto(uri)
  hasLoaded = 0
  for i in 1..3
    begin 
    Timeout::timeout(10)  do
      # puts "Time #{i}"
      super(uri)

      if self.execute_script("return document.readyState;") == "complete"
        # puts "has completed"
        hasLoaded = 1
        break
      end
    end
    rescue Timeout::Error => e
      puts "Page load timed out: #{e}"
    end

    if hasLoaded == 1
      break
    end
    sleep(0.05)
  end
end
init_args(args = {}) click to toggle source

初始化入参

# File lib/actir/webdriver/browser.rb, line 83
def init_args(args = {})
  # config_exist = File.exist?(config_file)
  config_exist = ($config != nil)
  unless args.has_key?(:mode) && args[:mode] != nil
    #若通过actir执行测试用例,则会配置ENV的模式
    if ENV["mode"]
      args[:mode] = ENV["mode"].to_sym
    else
      #若ENV为空,则读取配置文件,判断有无配置文件
      if config_exist
        mode = $config["config"]["test_mode"]["mode"]
        args[:mode] = (mode == nil) ? :local : mode
      else
        args[:mode] = :local
      end
    end
  end
  unless args.has_key?(:browser) && args[:browser] != nil
    if config_exist 
      browser_type = $config["config"]["test_mode"]["browser"]
      args[:browser] = (browser_type == nil) ? :chrome : browser_type
    else
      args[:browser] = :chrome
    end
  end
  unless args.has_key?(:window_size) && args[:window_size] != nil
    if config_exist
      window_size = $config["config"]["window_size"]
      if window_size != nil
        width = window_size["width"]
        height = window_size["height"]
      end
      args[:window_size] = (width == nil || height == nil) ? nil : window_size
    else
      args[:window_size] = nil
    end
  end
  args[:agent] = :iphone  unless args.has_key?(:agent) && args[:agent] != nil
  args[:url] = $address  unless args.has_key?(:url) && args[:url] != nil
  args
end
method_missing(m, *args, &blk) click to toggle source
Calls superclass method
# File lib/actir/webdriver/browser.rb, line 205
def method_missing(m, *args, &blk)
  if @watir_browser.respond_to? m
    @watir_browser.send(m, *args, &blk)
  else
    super
  end #if
end
new_window(url) { || ... } click to toggle source

在同一个浏览器的新tab页上打开指定url的页面,并自动将焦点放到新开窗口中

@example :

browser.new_window('youzan.com') do
  action
end

@param url : [String] url字符串

# File lib/actir/webdriver/browser.rb, line 223
def new_window url
  @watir_browser.execute_script("window.open(\"#{url}\")")
  #获取浏览器中的窗口数目
  window_num = @watir_browser.windows.length
  #默认要操作的新窗口都是最后一个窗口
  @watir_browser.windows[window_num - 1].use do  
    #重新设置窗口大小,不然phantomjs的ghost driver各种问题 = =
    if @browser_type == :phantomjs
      @watir_browser.window.resize_to(PHANTOMJS_SIZE["width"],PHANTOMJS_SIZE["height"])
    end
    #使用执行块,由调用者决定在新开的订单详情页面内做些啥
    yield
  end
end
valid_page_klass?(klass) click to toggle source
# File lib/actir/webdriver/browser.rb, line 198
def valid_page_klass? klass
  return false if klass.eql?(:Page)
  return false if klass.eql?(:BasicPage)
  Module.const_get(klass) < Actir::BasicPage
end
Also aliased as: basic_page?

Private Instance Methods

config_file() click to toggle source
# File lib/actir/webdriver/browser.rb, line 240
def config_file
  File.join($project_path, "config", "config.yaml")
end