2013-02-20 10 views
7

Così, abbiamo il seguente codice nella nostra pagina:Un modo per aggirare elemento non è possibile scorrere in vista - Watir-WebDriver con Ruby

<div class="toggle-wrapper"> 
    <input id="HasRegistration_true" class="registration_required toggle" type="radio" value="True" name="HasRegistration" data-val-required="The HasRegistration field is required." data-val="true"> 
    <label for="HasRegistration_true" class="">On</label> 
    <input id="HasRegistration_false" class="registration_required toggle" type="radio" value="False" name="HasRegistration" checked="checked"> 
    <label class="checked" for="HasRegistration_false">Off</label> 
</div> 

sono questi 2 pulsanti di opzione. 'Acceso e spento'. 'Off' è il valore predefinito.

Utilizzando Watir-webdriver e Ruby, vogliamo selezionare il pulsante di opzione "On". Lo facciamo in questo modo:

browser.radio(:id => "HasRegistration_true").set 

Ma così facendo, si ottiene il seguente errore:

`WebElement.clickElement': Element cannot be scrolled into view:[object HTMLInputElement] (Selenium::WebDriver::Error::MoveTargetOutOfBoundsError) 

Sappiamo Selenio 2 scorre la pagina per l'elemento, quindi cercando di scorrere verso il basso è inutile. Utilizziamo sempre le versioni più recenti di watir-webdriver e ruby.

Non possiamo modificare l'HTML della pagina dal momento che siamo ingegneri del controllo qualità.

+3

Non è stato possibile riprodurre il problema utilizzando una pagina con solo l'html fornito. C'è più della pagina richiesta per riprodurre il tuo problema? Quale browser hai provato (ovvero si verifica in tutti i browser)? Hai menzionato l'utilizzo dell'ultima gemma di watir-webdriver, ma hai anche assicurato che il selenio-webdriver sia aggiornato? –

+0

Tu dici "Sappiamo che il selenio 2 scorre la pagina sull'elemento ..." Puoi approfondire questo? Come fai a saperlo? Lo stai vedendo accadere? –

+0

C'è un sacco di cose Ajax sulla pagina? porzioni della pagina che vengono renderizzate dopo che il browser è stato "caricato" Il tuo problema potrebbe derivare dal tentativo di interagire con l'elemento prima che sia "pronto" o spostato in una posizione finale sulla pagina, in altre parole un problema di sincronizzazione. Potresti provare i comandi manualmente tramite IRB e vedere se funzionano, se lo fanno, di solito è segno di un problema di sincronizzazione –

risposta

0

provare innanzitutto individuare l'elemento utilizzando XPath:

browser.element(:xpath, "//input[@id='HasRegistration_true']").click 

o

In alternativa, se si tratta di un elemento nascosto che si sta tentando di individuare poi si sta meglio utilizzando i CSS. Scarica firebug add-on per firefox e copia il percorso CSS del tuo elemento.

dovrebbe essere qualcosa di simile:

browser.element(:css => "the CSS path you have copied from Firebug").click 

Uno dei 2 dovrebbe farlo per voi !!

Buona fortuna!

0

Si può manipolare l'html al volo eseguendo alcuni javascript per rendere l'elemento radio impostabile. Per eseguire javascript in una pagina, fare qualcosa di simile: @browser.execute_script("your javascript here")

ho usato qualcosa come il seguente javascript per mettere a nudo la classe di un tag label che si muoveva fuori dalla via del tag input stavo cercando di agire su per un problema specifico di Chrome che avevo. execute_script("$(\"label.classname\").removeClass(\"classname inline\")")

+0

La domanda non suggerisce che l'elemento radio non sia impostabile; solo che hanno difficoltà a scorrere fino ad esso. –

0

Se l'elemento è contenuto all'interno di un modulo e un div (Wrap) classe ho trovato che ho dovuto fare le seguenti operazioni per fare clic sul 'No' pulsante di opzione nella pagina "https://quote.comparethemarket.com/Motor/Motor/AboutYourVehicle.aspx?":

div_list = @ browser.form (: action => "? AboutYourVehicle.aspx ton_t = CTMMO & prdcls = PC & rqstyp = newmotorquote & AFFCLIE = CM01"). div (: class => "inputWrap"). divs (: class => "custom-radio")

E quindi: div_list [1].clicca

Spero che questo risolve il problema troppo :-)

1

Qui ci sono due soluzioni che hanno funzionato per me:

v'è una gemma rubino chiamato watir-scroll che può funzionare.

Poi

require 'watir-scroll' 
browser.scroll.to browser.radio(:id, "HasRegistration_true") 

Se non si desidera aggiungere una gemma, il mio collega ha suggerito qualcosa che in qualche modo sorprendente (per me) ha avuto lo stesso effetto come il codice di cui sopra:

browser.radio(:id, "HasRegistration_true").focus 
browser.radio(:id, "HasRegistration_true").set 

Nel mio codice, ".focus" scorreva direttamente all'elemento che precedentemente non era visibile. Potrebbe funzionare anche per te.