2012-08-10 8 views
13

Ich versuche, etwas in 2 Frames zu tun, aber der Fehler erhöht sich jedes Mal, wenn ich versuche, zwischen Frames zu wechseln. Zum Beispiel:Wie kann ich zwischen zwei Frames mit Capybara wechseln

# 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 

Fehler ist:

[remote server] file:///tmp/webdriver-profile20120810-9163-xy6dtm/extensions/[email protected]/components/driver_component.js:6638:in `unknown': Unable to locate frame: main (Selenium::WebDriver::Error::NoSuchFrameError)

Was ist das Problem? Vielleicht mache ich hier etwas falsch?

Wenn ich ändern, um Rahmen des Schaltens so versuchen Sie zuerst zu ‚Header‘ zu wechseln wechseln Sie dann zu ‚main‘ Frame dann denselben Fehler wirft, außer, dass er sagt, dass dieses Mal gibt es kein ‚main‘ Rahmen:

# 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 

Fehler:

[remote server] file:///tmp/webdriver-profile20120810-9247-w3o5hj/extensions/[email protected]/components/driver_component.js:6638:in `unknown': Unable to locate frame: main (Selenium::WebDriver::Error::NoSuchFrameError)

Antwort

21

Problem

das Problem ist, dass, wenn Sie page.driver.browser.switch_to.frame tun, es ist der Schalter Kontext der Seite zum Rahmen. Alle Aktionen gegen die Seite sind nun tatsächlich gegen den Rahmen gerichtet. Wenn Sie zum zweiten Mal Frames wechseln, sagen Sie eigentlich, dass Sie den 'header'-Frame innerhalb des' main'-Frames finden (statt dessen, was ich annehmen möchte, den 'header'-Frame innerhalb der Hauptseite).

Lösung - Capybara within_frame (empfohlen):

Wenn innerhalb eines Rahmens arbeiten, sollten Sie verwenden within_frame Methode des Capybara.

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 

Lösung - Selen switch_to: Sie würden tun wollen

Wenn Sie den Frame-Management selbst (dh nicht verwenden Capybara die integrierte Methode) tun wollen, können Sie die Seite Kontextschalter zurück zum Browser und dann zum zweiten Frame. Dies würde wie folgt aussehen. Obwohl ich vorschlagen würde, die eingebaute Capybara Methode zu verwenden.

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 
+0

toll .. hat mir sehr geholfen! – karthikeayan

2

Ich habe eine Lösung gefunden. within_frame wie erwartet funktioniert:

# 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 

I Quellcode für within_frame in Datei https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb gefunden habe. ab Zeile 81.

EDIT: Während ich diese Antwort schrieb, Frage @JustinKo beantwortet, so dass beide Antworten sind richtig, aber +1 und Antwort für ihn akzeptiert.

Verwandte Themen