2013-03-11 4 views
9

वेबड्राइवर के साथ यदि तत्व प्रकार = "फ़ाइल" है, तो मैं आम तौर पर केवल तत्व के लिए .sendKeys() पर जा सकता हूं और यह खूबसूरती से काम करता है।यदि कोई <input> तत्व दृश्यमान नहीं है और केवल एंकर टैग <a> द्वारा संदर्भित किया गया है, तो मैं फ़ाइल को अपलोड करने के लिए पथ कैसे सेट कर सकता हूं?

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

इस मामले SendKeys में() एंकर टैग पर काम नहीं करता:

दुर्भाग्य से स्थिति मैं अब वहाँ एक लंगर टैग इनपुट तत्व की चर्चा करते हुए किया है कि इस्तेमाल किया एक कस्टम बटन है

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

त्रुटि: org.openqa.selenium.WebDriverException: focusElement निष्पादन विफल रहा; कुंजी भेजने के लिए क्योंकि तत्व ध्यान केंद्रित नहीं कर सकते हैं

विफल न ही SendKeys करता है() गैर दृश्य फ़ाइल इनपुट तत्व काम:

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

त्रुटि: क्लिक करने के लिए तत्व प्रदर्शित होनी चाहिए: org.openqa.selenium.ElementNotVisibleException

मैंने गैर-दृश्य इनपुट तत्व पर पथ मान सेट करने के लिए जावास्क्रिप्ट इंजेक्शन करने का प्रयास किया है, कुछ अलग तरीके (नीचे देखें), लेकिन कुछ भी काम नहीं करता है। इस पथ को कैसे सेट कर सकते हैं इस पर कोई विचार?

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

कोई भी मदद या सुझावों की बहुत सराहना की जाएगी!

+0

यकीन है कि क्यों यह बंद हो गया है, यह एक बहुत ही स्पष्ट सवाल है अगर तुम सेलेनियम WebDriver और एक बहुत अच्छा जवाब के साथ काम किया है भी। – Ardesco

उत्तर

4

पहले नियंत्रण प्रदर्शित कोशिश करें, फिर मान सेट है, तो इसे फिर से छिपाने:

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

धन्यवाद गिली। मैंने कोशिश की और पुष्टि की कि तत्व के लिए डिस्प्ले शैली जेएस कमांड को निष्पादित करने के बाद ब्लॉक करने के लिए सेट है। लेकिन वेबड्राइवर अभी भी इस त्रुटि को वापस लौटाता है जब मैं उस स्थिति में होता है जब तत्व मेंKeys() को भेजने की कोशिश करता है: org.openqa.selenium.ElementNotVisibleException: तत्व क्लिक करने के लिए प्रदर्शित होना चाहिए (चेतावनी: सर्वर ने कोई स्टैकट्रैक जानकारी प्रदान नहीं की है) – LucidCDN

+0

दरअसल यह सही जवाब है, धन्यवाद! कारण यह मेरे लिए काम नहीं कर रहा था कि वेब ड्राइवर को 10px से बड़ा होने की आवश्यकता होती है और जिस तत्व के साथ मैं बातचीत कर रहा था वह 280px x 0px था। एक बार जब मैं जावास्क्रिप्ट के माध्यम से इसे फिर से आकार देता हूं तो मैंने आपके द्वारा सुझाए गए तरीके से बातचीत करने में सक्षम था। एक बार फिर धन्यवाद! – LucidCDN

संबंधित मुद्दे

 संबंधित मुद्दे