2013-03-11 7 views
9

Z WebDriver, jeśli element jest typu = "plik", zwykle mogę po prostu .sendKeys() bezpośrednio do elementu i działa pięknie.Jak ustawić ścieżkę do przesłania pliku, jeśli element <input> jest niewidoczny, a odwołanie można uzyskać tylko za pomocą znacznika zakotwiczenia <a>?

Niestety sytuacja mam teraz znajduje się przycisk zwyczaj stosowany który posiada znacznik zakotwiczenia odnoszącego się do elementu wejściowego:

//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"}}/> 

W tym przypadku SendKeys() nie działa na tagu kotwicy:

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

Błąd: org.openqa.selenium.WebDriverException: operationElement execution failed; Nie udało się wysłać klucze, ponieważ nie może skupić się elementowi

Ani też SendKeys() działa niewidoczny element input file:

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

Błąd: org.openqa.selenium.ElementNotVisibleException: Element musi być wyświetlane do kliknięcia

Próbowałem wstrzykiwać javaScript, aby ustawić wartość ścieżki na niewidocznym elemencie wejściowym na kilka różnych sposobów (patrz poniżej), ale nic nie działa. Jakieś pomysły na to, jak ustawić tę ścieżkę?

//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'); "); 

Każda pomoc lub sugestie będą mile widziane!

+0

Nie wiem, dlaczego ten został zamknięty, jest to bardzo jasne pytanie jeśli pracował z selenem WebDriver i bardzo dobra odpowiedź także. – Ardesco

Odpowiedz

4

Spróbuj wyświetlania kontrolę, następnie ustawić wartość, a następnie ukryć je ponownie:

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

Dziękuję Ci Gilly. Próbowałem tego i potwierdziłem, że styl wyświetlania dla elementu jest ustawiony na blok po wykonaniu tego polecenia js. Ale WebDriver nadal zwraca ten błąd, gdy próbuję wysłaćKeys() do elementu, gdy jest on w tym stanie: org.openqa.selenium.ElementNotVisibleException: Element musi być wyświetlony, aby kliknąć (OSTRZEŻENIE: Serwer nie dostarczył żadnych informacji o stosie) – LucidCDN

+0

Właściwie to jest poprawna odpowiedź, dziękuję gilly! Nie działa to dla mnie, ponieważ webDriver wymaga, aby element był większy niż 10 pikseli, a element, z którym się kontaktowałem, miał 280px x 0px. Po zmianie rozmiaru za pomocą JavaScriptu mogłem działać w sposób, który sugerowałeś. Dzięki jeszcze raz! – LucidCDN

Powiązane problemy