1

我有多个 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
4

2 回答 2

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 之前,您可能希望先转到某个页面。setup 只会打开一个新的 firefox webdriver 实例。另外我建议更改 setup.rb 的名称,以便它可以foo.setup代替setup.setup. 我将 Lib.rb 用于我希望能够定期调用的方法,例如一个是Lib.signin_admin

希望这对你有用。

于 2012-12-20T21:48:50.350 回答
1

作为对您的示例的回应,我认为您忘记包含 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
于 2013-01-24T06:52:01.297 回答