作为对您的示例的回应,我认为您忘记包含 setup 模块(您确实将方法定义放在了模块中,对吗?)。此外,提到将驱动程序分配为全局变量(通过使用起始美元符号命名)的注释是一个好主意。所以事情看起来像这样......
安装程序.rb
module Setup
def setup
$driver = Selenium::WebDriver.for :firefox
$wait = Selenium::WebDriver::Wait.new(:timeout => 10)
end
end
测试文件.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