2012-03-12 13 views
7

क्या सेलेनियम आरसी "attach_file" केवल फ़ायरफ़ॉक्स का समर्थन करता है क्योंकि Google क्रोम में फ़ाइल अपलोड करने का कोई तरीका है? किसी भी सुझाव या कामकाज की बहुत सराहना की जाती है।सेलेनियम: Google क्रोम में फ़ाइल अपलोड करें

+2

[मैं एक जवाब यहाँ अजगर का उपयोग कर पोस्ट किया गया।] [1] [1]: http://stackoverflow.com/a/11872608/471376 – JamesThomasMoon1979

उत्तर

3

फ़ाइल अपलोड करना आम तौर पर एक POST अनुरोध है, इसलिए आप वास्तव में सेलेनियम का उपयोग किये बिना फ़ाइल अपलोड कर सकते हैं; आपकी साइट द्वारा कुकी की आवश्यकता है, तो आप webdriver.get_cookies() पहले से कुकीज़ को फिर से संगठित करने की जरूरत है

एक साधारण उदाहरण:

# required package: 
# http://pypi.python.org/pypi/MultipartPostHandler/0.1.0 

import MultipartPostHandler, urllib2, cookielib 

cookies = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies), 
           MultipartPostHandler.MultipartPostHandler) 

path_to_file = r"abc.zip" 

open_file = open(path_to_file,"rb") 
param = { "file": open_file } 
req = opener.open("http://www.yoursite.com/uploadfile", param) 
open_file.close() 
4

आप Webdriver उपयोग कर रहे हैं तो फ़ाइल अपलोड करने की आप सभी की जरूरत इस्तेमाल होता है " sendKeys "फ़ाइल पथ टाइप करने के लिए। आपको ब्राउज़ बटन पर क्लिक करने के हिस्से को 'छोड़ना' होगा जो फ़ाइल का चयन करने के लिए एक संवाद बॉक्स खोलता है। एक जावा संस्करण है कि मेरे लिए काम करता है, नीचे तरह दिखता है

WebElement inputFilePath = driver.findElement(By.id("filepath")); 
inputFilePath.sendKeys("/absolute/path/to/my/local/file"); 
+0

शायद भी ध्यान देने योग्य है कि लायक फ़ाइल अपलोड करने के लिए sendKeys का उपयोग करके केवल एक <इनपुट प्रकार = "फ़ाइल> – Ardesco

-1

का उपयोग IJavaScriptExecutor क्लिक करने में सक्षम तो क्रोम ड्राइवर पॉप-अप नहीं होगा कह इस तत्व गैर क्लिक करने योग्य है त्रुटि अपलोड इनपुट क्षेत्र बदलने के लिए है।

 [SetUp] 
     public void SetupTest() 
     { 
      driver = new ChromeDriver(); 
      baseURL = ""; 
      verificationErrors = new StringBuilder(); 
     } 

     [Test] 
     public void Test() 
     { 
      IJavaScriptExecutor js = driver as IJavaScriptExecutor; 
      IWebElement element = driver.FindElement(By.Id("UploadFile_ButtonID")); 
      js.ExecuteScript("arguments[0].style.visibility = 'visible'; arguments[0].style.height = '1px'; arguments[0].style.width = '1px'; arguments[0].style.opacity = 1", element); 
      Thread.Sleep(1000); 
      element.SendKeys("D:\\path\\test\\image.jpg"); 
} 
+1

के साथ काम करेगा संदर्भ के बिना कोड व्यर्थ है। आपने यह नहीं समझाया है कि आप तत्व को दृश्यमान करने के लिए जावास्क्रिप्ट निष्पादक का उपयोग क्यों कर रहे हैं और IMHO यह संभवतः खराब अभ्यास है। सेलेनियम आपको छुपे तत्वों के साथ बातचीत करने से रोकता है क्योंकि यह ऐसा कुछ है जो अंतिम उपयोगकर्ता नहीं कर सकता था। अंधाधुंध जे का उपयोग करने के बजाय एवास्क्रिप्ट तत्व को मजबूर करने के लिए मजबूर करता है जो आपको वास्तविकता में करना चाहिए, तत्व को दृश्यमान बनाने के लिए अंतिम उपयोगकर्ता क्या करेगा। – Ardesco

+1

आप थ्रेड स्लीप का भी उपयोग करते हैं जो कि फिर से खराब अभ्यास है, करने के लिए सही काम करने के लिए एक वेबड्राइवरवाइट ऑब्जेक्ट और अपेक्षित कंडीशन क्लास का उपयोग करना होगा ताकि तत्व दिखाई दे सके। यह एक संक्षिप्त उदाहरण है जिसमें कोई स्पष्टीकरण और खराब कोड अभ्यास -1 नहीं है – Ardesco

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