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 の新しいインスタンスを開くだけです。foo.setupまた、setup.rb の名前を.rbの代わりに変更することをお勧めし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

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 には次の 2 行しか必要ありません。

# 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 に答える