【问题标题】:include file ruby selenium包括文件红宝石硒
【发布时间】:2012-12-12 13:30:37
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    将其从实例变量更改为全局变量。将其设为$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 insead of setup.setup。我将 Lib.rb 用于我希望能够定期调用的方法,例如一个是 Lib.signin_admin

    希望这对你有用。

    【讨论】:

    • 点个赞!这解决了我一直遇到的一个问题!感谢未来 4 年 :-)
    【解决方案2】:

    针对您的示例,我认为您忘记包含 setup 模块(您确实将方法定义放在了模块中,对吗?)。此外,提到将驱动程序分配为全局变量(通过使用起始美元符号命名)的注释是一个好主意。所以事情看起来像这样......

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多