14

2 フレーム内で何かをしようとしていますが、フレームを切り替えようとすると毎回エラーが発生します。例えば:

# encoding: utf-8

require "capybara/dsl"

Capybara.run_server = false
Capybara.current_driver = :selenium
Capybara.app_host = 'https://hb.posted.co.rs/posted'

class Account
  include Capybara::DSL

  def check_balance
    visit('/')
    page.driver.browser.switch_to.frame 'main'
    fill_in 'korisnik', :with => 'foo'
    fill_in 'lozinka', :with => 'bar'
    click_button 'Potvrda unosa'

    page.driver.browser.switch_to.frame 'header'
    click_on 'Stanje' 
  end
end

account = Account.new
account.check_balance

エラーは次のとおりです。

[リモートサーバー] file:///tmp/webdriver-profile20120810-9163-xy6dtm/extensions/fxdriver@googlecode.com/components/driver_component.js:6638:in `unknown': フレームが見つかりません: メイン (Selenium:: WebDriver::Error::NoSuchFrameError)

何が問題ですか?多分私はここで何か間違ったことをしていますか?

フレームの切り替えの順序を変更すると、最初に「ヘッダー」に切り替えてから「メイン」フレームに切り替えると、今回は「メイン」フレームがないということを除いて同じエラーが発生します。

# encoding: utf-8

require "capybara/dsl"

Capybara.run_server = false
Capybara.current_driver = :selenium
Capybara.app_host = 'https://hb.posted.co.rs/posted'

class Account
  include Capybara::DSL

  def check_balance
    visit('/')
    page.driver.browser.switch_to.frame 'header'
    click_on 'Stanje' 

    page.driver.browser.switch_to.frame 'main'
    fill_in 'korisnik', :with => 'foo'
    fill_in 'lozinka', :with => 'bar'
    click_button 'Potvrda unosa'
  end
end

account = Account.new
account.check_balance

エラー:

[リモートサーバー] file:///tmp/webdriver-profile20120810-9247-w3o5hj/extensions/fxdriver@googlecode.com/components/driver_component.js:6638:in `unknown': フレームが見つかりません: メイン (Selenium:: WebDriver::Error::NoSuchFrameError)

4

2 に答える 2

23

問題

問題は、page.driver.browser.switch_to.frameそうすると、ページのコンテキストがフレームに切り替わるということです。ページに対するすべてのアクションは、実際にはフレームに対して行われます。したがって、2回目にフレームを切り替えるときは、実際には「メイン」フレーム内の「ヘッダー」フレームを見つけると言っています(メインページ内の「ヘッダー」フレームではなく)。

解決策-Capybarawithin_frame(推奨):

フレーム内で作業するときは、カピバラのwithin_frame方法を使用する必要があります。あなたがしたいと思うでしょう:

  def check_balance
    visit('/')

    within_frame('main'){
      fill_in 'korisnik', :with => 'foo'
      fill_in 'lozinka', :with => 'bar'
      click_button 'Potvrda unosa'
    }

    within_frame('header'){
      click_on 'Stanje' 
    }
  end

解決策-Seleniumswitch_to:

フレーム管理を自分で行いたい場合(つまり、Capybaraの組み込みメソッドを使用しない場合)、ページのコンテキストをブラウザーに切り替えてから、2番目のフレームに戻すことができます。これは次のようになります。組み込みのカピバラ方式を使用することをお勧めしますが。

  def check_balance
    visit('/')
    page.driver.browser.switch_to.frame 'header'
    click_on 'Stanje' 

    #Switch page context back to the main browser
    page.driver.browser.switch_to.default_content

    page.driver.browser.switch_to.frame 'main'
    fill_in 'korisnik', :with => 'foo'
    fill_in 'lozinka', :with => 'bar'
    click_button 'Potvrda unosa'
  end
于 2012-08-10T22:28:14.227 に答える
2

私は解決策を見つけました。within_frameは期待どおりに機能します。

# encoding: utf-8

require "capybara/dsl"

Capybara.run_server = false
Capybara.current_driver = :selenium
Capybara.app_host = 'https://hb.posted.co.rs/posted'
class Account
  include Capybara::DSL
  def check_balance
    visit('/')

    within_frame 'main' do
      fill_in 'korisnik', :with => 'foo'
      fill_in 'lozinka', :with => 'bar'
      click_button 'Potvrda unosa'
    end

    within_frame 'header' do
      click_on 'Stanje'
    end
  end
end

account = Account.new
account.check_balance

ファイルhttps://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rbでwithin_frameのソースコードを見つけました。81行目から。

編集: 私がこの答えを書いている間、@ JustinKoは質問に答えたので、両方の答えは正しいですが、+1と彼の答えを受け入れました。

于 2012-08-10T22:34:23.200 に答える