我有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
答案 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