2012-08-10 10 views
13

? Estoy intentando hacer algo dentro de 2 fotogramas, pero el error aumenta cada vez que trato de cambiar de fotograma a fotograma. Por ejemplo:¿Cómo puedo cambiar entre dos fotogramas con Capybara

# 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 

error es:

[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)

¿Cuál es el problema? Tal vez estoy haciendo algo mal aquí?

Si cambio de orden de conmutación de tramas a fin de tratar primero para cambiar a 'cabecera' y luego cambiar a fotograma 'principal' a continuación mismo error plantea la excepción de que se dice que esta vez no hay un marco 'principal':

# 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 

error:

[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)

Respuesta

21

problema

el problema es que cuando se hace page.driver.browser.switch_to.frame, se cambia el contexto de la página al marco. Todas las acciones contra la página ahora están contra el marco. Así que cuando cambias marcos por segunda vez, en realidad estás diciendo que encuentres el marco 'encabezado' dentro del marco 'principal' (en lugar de lo que supongo que quieres, el marco 'encabezado' dentro de la página principal).

Solución - Carpincho within_frame (recomendado):

Cuando se trabaja dentro de un marco, se debe utilizar el método de Carpincho within_frame. Que se quiere hacer:

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 

Solución - switch_to Selenio:

Si usted quiere hacer la gestión marco de ti mismo (es decir, no usar método integrado de capibara), puede cambiar el contexto de la página volver al navegador y luego al segundo cuadro. Esto se vería así. Aunque sugeriría usar el método de Capybara incorporado.

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

genial ... ¡me ayudó mucho! – karthikeayan

2

He encontrado la solución. within_frame funciona como se espera:

# 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 

que he encontrado código fuente para within_frame en el archivo https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb. a partir de la línea 81.

EDIT: Mientras escribía esta respuesta, @JustinKo respondió la pregunta, por lo que ambas respuestas son correctas, pero 1 y aceptado respuesta para él.

Cuestiones relacionadas