2013-10-28 6 views
6

Ho riscontrato il seguente problema. Ho un menu a discesa che è nascosto in modo che quando faccio la Selezione ed eseguire il test ottengo il seguente errore:Webdriver Java: eccezione elemento non visibile

org.openqa.selenium.ElementNotVisibleException: element not visible: Element is not currently visible and may not be manipulated 
    (Session info: chrome=30.0.1599.101) 

Questo è il mio selezionare:

Select s = new Select(dropDown); 
s.selectByVisibleText("CHARGEBACK"); 

C'è una passeggiata intorno ad esso per manipolare elementi nascosti? Ho trovato il seguente codice in uno dei posti:

JavascriptExecutor jse = (JavascriptExecutor) driver; 
jse.executeScript("arguments[0].scrollIntoView(true);", element); 

Questo è il codice html:

<div class="ui-helper-hidden"> 
<select id="formLevel:levels_input" name="formLevel:levels_input"> 
<option value="541fac58-5ea8-44ef-9664-e7e48b6c6a3c">Seleccione un Registro</option> 
<option value="dafc799c-4d5e-4b02-a882-74cb6ad98902">SECURITY</option> 
<option value="e5416086-2036-4cd0-b23e-865747aa3f53">CALL CENTER</option> 
<option value="7ea4b4ea-4f06-4d27-9541-1b0cf3f2aa22">CHARGEBACK</option> 
<option value="0f915120-7b8f-4a33-b063-5d20a834b655">PREVENÇÃO A FRAUDE</option> 
<option value="a8ef13e8-f4a5-43b8-a668-b769f6988565">ANALISE DE CREDITO</option> 
<option value="83b65a26-d4cd-43d3-b3fa-2f7894ca454a">SUPORTE A CONTA</option> 
<option value="163d0db9-590c-47a7-a271-218b2d27d8d9">REGULARIZAÇÃO FINANCEIRA</option> 

E non funziona in questo caso. Qualsiasi aiuto sarebbe apprezzato.

+5

Perché non creare un test case valido che lo renda visibile, ad es. 'fai clic su questo, quindi modifica il menu a discesa quando l'elemento è visibile. È una logica di test errata manipolare elementi nascosti in quanto gli utenti non lo faranno. – sircapsalot

+0

Inoltre, se si suppone che l'elemento sia visibile e il suo lancio di questo errore, vorrei controllare il selettore. Potresti selezionare l'elemento sbagliato. –

+0

Il selettore va bene perché posso trovare l'elemento ma non riesco a selezionare l'opzione. P.S ha aggiunto il codice html. – elcharrua

risposta

7

Dal WebDriver cerca di simulare utenti reali, non può interagire con gli elementi che sono invisibili/nascosto. Per risolvere il tuo problema, penso che dovrai prima fare clic su div per visualizzare l'elenco a discesa e selezionare l'opzione dal menu a discesa. Vorrei raccomandare un simile approccio rispetto al puro modo Javascript dal momento che simulerebbe un utente reale. Dare un tiro-cross,

WebDriverWait wait = new WebDriverWait(driver, 300); 
WebElement triggerDropDown = driver.findElement(By 
       .className("ui-helper-hidden")); 
triggerDropDown.click(); 
WebElement selectElement = wait.until(ExpectedConditions 
        .visibilityOfElementLocated(By.id("formLevel:levels_input"))); 
Select select = new Select(selectElement); 
select.selectByVisibleText("SECURITY"); 

Modifica aggiornato il nome della classe di triggerDropDown

+0

Sono d'accordo con questa risposta. Non è necessario utilizzare FluentWait (ignorando le eccezioni) su questo tipo di interazione (poiché il clic div ha un risultato immediato previsto) e quindi WebDriverWait è perfetto in questo contesto. – djangofan

0

Non hanno provato questo, ma il seguente lavoro?

s.selectByValue ("7ea4b4ea-4f06-4d27-9541-1b0cf3f2aa22");

0

Sono assolutamente d'accordo con sircapsalot. È necessario mantenere la logica di business dell'applicazione e "fare come un utente". E usa questo trucco solo per soluzioni alternative.

Risposta:

provare in questo modo

document.getElementById('formLevel:levels_input').options[3].selected = "true"

6

Hi There può essere così tanti motivo per questo. Ho anche affrontato questo problema numero di volte e risolto utilizzando diversi modi.

1- Utilizzando WebdriverWait che è anche conosciuto come esplicito aspettare

2- Utilizzando xpath- unico usando modi XPath.

3- Ottieni la dimensione dell'elemento, quindi fai clic o esegui qualsiasi azione sul primo.

ho documentato tutta la soluzione qui How to Solve Element not visible Exception

0

Oltre alle ragioni e le questioni sollevate dalle risposte precedenti, ho incontrato un'altra causa degni di nota. Nel mio caso, è necessario eseguire un JavaScript sulla pagina dopo aver fatto clic su un collegamento nella pagina per rendere visibili gli elementi a cui volevo accedere. È ok finché il tuo driver ha JavaScript abilitato. Nel mio caso, stavo girando senza JavaScript, quindi anche se il link è stato "cliccato" a livello di codice, gli elementi non stavano diventando visibili. Stavo usando HtmlUnitDriver con le impostazioni predefinite.Alla fine sono passato a ChromeDriver. (È possibile abilitare JavaScript su HtmlUnitDriver, ma che, per altri motivi, nel mio caso non è stato sufficiente.)