2013-03-11 8 views
9

Con WebDriver se l'elemento è di tipo = "file", in genere, posso accedere direttamente a un elemento .sendKeys() e funziona perfettamente.Come posso impostare un percorso per caricare un file se un elemento <input> non è visibile e si riferisce solo a un tag di ancoraggio <a>?

Purtroppo la situazione che ho ora c'è un pulsante personalizzato utilizzato che ha un tag di ancoraggio riferendosi al elemento di input:

//anchor tag which is a custom button referring to non visible file input element 
    <a id="image-upload-button" class="control_button button" href="#/create_channel/addImage" data-ember-action="151"> 

//refers to this file input element which is not visible 
    <input id="image-selector-button" name="image-selector" type="file" class="selectImageBtn" {{action "selectImage" on="change" target="view"}} {{action "onBlur" on="blur" target="App.router.imageSelectorView"}} {{action "onFocus" on="focus" target="view"}}/> 

In questo caso SendKeys() non funziona sul tag di ancoraggio:

driver.findElement(By.id("image-upload-button ")).sendKeys(“c:\\myFile.bmp”); 

Errore: org.openqa.selenium.WebDriverException: focusElement esecuzione non riuscita; Impossibile inviare le chiavi perché non può mettere a fuoco elemento

Né SendKeys() lavorare l'elemento di input di file non visibile:

driver.findElement(By.id("image-selector-button ")).sendKeys(“c:\\myFile.bmp”); 

Errore: org.openqa.selenium.ElementNotVisibleException: L'elemento deve essere visualizzato fare clic

Ho provato a iniettare javaScript per impostare il valore del percorso sull'elemento di input non visibile in vari modi (vedi sotto), ma nulla sembra funzionare. Qualche idea su come posso impostare questo percorso?

//nothing happens when I try this 

JavascriptExecutor js = (JavascriptExecutor) driver; 

js.executeScript("window.document.getElementById('image-selector-button').setAttribute('value','C:\\MyFile.jpg');"); 



//I tried firing a change even first as well and that didn't appear to do anything either 

js.executeScript(
"var el=document.getElementById('image-selector-button'); " + 
" function fire(evttype) { " + 
" if (document.createEvent) { " + 
" var evt = document.createEvent('HTMLEvents'); " + 
" evt.initEvent(evttype, false, false); "+ 
" el.dispatchEvent(evt); " + 
" } else if (document.createEventObject) { "+ 
" el.fireEvent('on' + evttype); " + 
" } }; " + 
" fire(el,'change'); "); 

Qualsiasi aiuto o suggerimento sarebbe molto apprezzato!

+0

Non capisco perché questo è stato chiuso, è una domanda molto chiara se avete lavorato con selenio WebDriver e una risposta molto buona anche. – Ardesco

risposta

4

Provare a visualizzare il controllo prima, quindi impostare il valore, poi nascondere di nuovo:

JavascriptExecutor js = (JavascriptExecutor) driver; 
js.executeScript("document.getElementById('image-selector-button').style.display = 'block';"); 
driver.findElement(By.id("image-selector-button ")).sendKeys("c:\\myFile.bmp"); 
js.executeScript("document.getElementById('image-selector-button').style.display = 'none';"); 
+0

Grazie gilly. Ho provato questo e ho confermato che lo stile di visualizzazione per l'elemento è impostato per bloccare dopo l'esecuzione di quel comando js. Ma WebDriver restituisce ancora questo errore quando provo a inviareKeys() all'elemento mentre si trova in quello stato: org.openqa.selenium.ElementNotVisibleException: l'elemento deve essere visualizzato per fare clic (AVVISO: il server non ha fornito alcuna informazione di stacktrace) – LucidCDN

+0

In realtà questa è la risposta corretta, grazie gilly! Il motivo per cui non funzionava per me è che webDriver richiede che un elemento sia più grande di 10px e che l'elemento con cui stavo interagendo sia 280 px x 0 px. Una volta ridimensionato tramite JavaScript, sono stato in grado di interagire nel modo suggerito. Grazie ancora! – LucidCDN