2012-12-12 87 views
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 

回答

2

它更改爲全局variabl e來自實例變量。使它$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。我使用Lib.rb作爲我希望能夠定期調用的方法,例如一個是Lib.signin_admin

希望這適用於您。

+0

有一個給予好評!這解決了我一直在遇到的問題!在未來的4年裏感謝:-) – kroe761

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