包括文件ruby selenium

时间:2012-12-12 13:30:37

标签: ruby-on-rails ruby selenium rspec selenium-webdriver

我有selenium-webdriver的多个ruby测试用例,所有文件共享相同的功能。有没有办法创建一个全局文件,并将文件包含在这些测试用例中,而不是一遍又一遍地输入

例如

- 我创建了一个文件setup.rb

def setup

    @driver = Selenium::WebDriver.for :firefox
    wait = Selenium::WebDriver::Wait.new(:timeout => 10) 
end 

然后在我的test_file.rb中我开始

require setup

 setup
 @driver.find_element(:xpath => '//span[text()="войти"]').click

有错误

NoMethodError:
       undefined method `find_element' for nil:NilClass

2 个答案:

答案 0 :(得分:2)

将其从实例变量更改为全局变量。设为$driver而不是@driver,您应该没有问题。将其更改为类似..

def self_setup

    $driver = Selenium::WebDriver.for :firefox
    wait = Selenium::WebDriver::Wait.new(:timeout => 10) 
end

然后

require "./setup.rb"

 setup.setup
 $driver.find_element(:xpath => '//span[text()="войти"]').click

那应该有用。您可能希望在查找该xpath之前先转到页面。安装程序只会打开一个新的firefox webdriver实例。另外,我建议更改setup.rb的名称,使其成为foo.setup setup.setup的{​​{1}}。我使用Lib.rb作为我希望能够定期调用的方法,例如一个是Lib.signin_admin

希望这适合你。

答案 1 :(得分:1)

在回答您的示例时,我认为您忘记包含设置模块(您确实将方法定义放在模块中,对吧?)。此外,提及将驱动程序指定为全局变量的注释(通过用起始美元符号命名)是个好主意。所以情况会是这样......

的setup.rb

module Setup
  def setup
    $driver = Selenium::WebDriver.for :firefox
    $wait = Selenium::WebDriver::Wait.new(:timeout => 10) 
  end
end

test_file.rb

require 'setup'
class SeleniumTest < Test::Unit::TestCase
  include Setup # Modules need to be included (mixed-in) in order to be used inside classes 

  # Setup is automagically called when using TestUnit

  $driver.get "http://www.yoururl.com"
  $driver.find_element(:xpath => '//span[text()="войти"]').click
end

缺点是,对于您创建的每个新模块和文件,您必须要求并包含您要使用的所有新文件和模块。

我发现为我工作的方法是创建一个'test_helper.rb',并使用名为'require_all'的gem,它需要并包含您指定的目录中的所有文件。

我的test_helper.rb看起来像这样:

require "rubygems"
require "require_all"
require "selenium-webdriver"
require "test-unit"

require_all relative_path("../lib/selenium/")

module TestHelpers
  include Selenium

  def setup

    $driver = Selenium::WebDriver.for :firefox
    ...

  end

  def teardown

    $driver.quit

  end

end

test_page.rb只需要两行:

# Line 1: Ensures the test_helper.rb gets loaded from the same directory the test_page.rb resides in
require File.join(File.dirname(__FILE__), 'test_helper') 

class TestPage < Test::Unit::TestCase

  # Line 2: Module needs mixed in to use its methods
  include TestHelpers

  def test_page

    $driver.get "http://www.mysite.com"
    assert $driver.find_element(:css => "div#my_site_logo")

  end

end