2017-04-18 3 views
0

Ich benutze Selenium und Python, um Anfragen an eine Website zu senden. Ich mache gerade einen Datei-Upload, aber es scheint, dass es nicht so funktioniert, wie ich es erwarte. HierPython-Datei hochladen selen

ist, wie in HTML aussieht:

<div id="uploaders" class="uploaders" data-image-urls="" data-image-ids="" data-image-positions="" data-image-checksums=""><div id="uploader-container-0" class="uploader-container small empty" data-uploader-index="0" data-numbering="1" style="position: relative;"> 
<div id="file-picker-0" class="uploader-box small" style="position: relative; z-index: 1;"> 
    <div class="thumb"> 
     <div class="uploader-overlay"> 
      <span class="photo-action edit-action"> 
       <span class="mp-Icon-circle"><span class="mp-Icon mp-svg-edit photo-action-icon"></span></span> 
      </span> 
      <span class="remove photo-action"> 
       <span class="mp-Icon-circle"><span class="mp-Icon mp-svg-delete photo-action-icon"></span></span> 
      </span> 
     </div> 
    </div> 
    <div class="content"> 
     <div class="mp-svg-button-camera camera-logo centered"></div> 
     <div class="main-photo-subtext centered"> 
      Hoofdfoto. 
     </div> 
    </div> 
</div> 


<input type="hidden" name="images.urls" value=""> 
<input type="hidden" name="images.ids" value=""> 
<input type="hidden" name="images.checksums" value=""> 
<div id="html5_1bdvv7bg0ptl15m6gmu1d4v16l04_container" class="moxie-shim moxie-shim-html5" style="position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; overflow: hidden; z-index: 0;"> 
<input id="html5_1bdvv7bg0ptl15m6gmu1d4v16l04" type="file" style="font-size: 999px; opacity: 0; position: absolute; top: 0px; left: 0px; width: 100%; height: 100%;" multiple="" accept="image/jpeg,.jpg,.jpeg,image/bmp,.bmp,image/png,.png"></div> 

Wie Sie im unteren Teil des Codes sehen kann, gibt es ein Eingabetyp Dateielement. Aber keine Form. Der Dateiupload auf der Website funktioniert folgendermaßen. Sie klicken auf ein (+) Zeichen. Dann öffne ich das Dateiauswahldialogfeld und wähle die Datei aus. Und dann kommt ein weiteres Pop-Up, das mit einem Knopf fragt, ob Sie etwas akzeptieren möchten.

Meine Frage ist, wie kann ich eine Datei hochladen. Bis jetzt habe ich es versäumt, dies zu tun.

Mein Code:

upload_photo_field_xpath = ".//*[@id='uploader-container-0']/div/input" 
upload_photo_element = WebDriverWait(driver, 10).until(
             lambda driver: driver.find_element_by_xpath(upload_photo_field_xpath)) 

image = os.path.join(os.getcwd(), 'images/' + 'img.jpg') 
print(image) 
upload_photo_element.send_keys(image) 
upload_photo_element.submit() 

Irgendwelche Gedanken darüber, wie dieses Problem zu lösen?

Danke.

Antwort

0

Sie können die folgenden Schritt wie pro Ihre Anforderung versuchen, die gut funktioniert für mich Datei

hochladen Zusammenhang installieren win32com.client

pip install pypiwin32 

Dann sind sie in Ihrem Code wie unten

import win32com.client 

//click on upload button for uploading file 
time.sleep(3)//you can use explicit wait here 
shell = win32com.client.Dispatch("WScript.Shell") 
shell.Sendkeys("C:\\Users\\.....\\File.pdf")//file path to be uploaded 
time.sleep(2) 
shell.Sendkeys("{ENTER}") 
time.sleep(2) 
+0

Vielen Dank für Ihre Antwort @Shoaib Akhtar. Ich werde es versuchen. Eine Frage, ist diese Lösung Windows verwandt oder kann ich das auch auf Mac verwenden. – user3138008

+0

Gehen Sie einmal durch diesen Link 1) http://stackoverflow.com/questions/9233461/pywin32-com-objects-on-mac 2) http://stackoverflow.com/questions/13852864/using-python-with- skriptfähige Anwendungen auf einem Mac –

0

Macht nichts. Ich habe das gerade getestet, indem ich vom Browser gewechselt habe. Anstatt PhantomJS zu verwenden, habe ich Firefox zu Testzwecken verwendet. So kann ich sehen, was eigentlich hinter den Kulissen passiert. Durch das Betrachten des Browsers wurde mir klar, dass es ein paar Sekunden brauchte, um mit der Handhabung des Datei-Uploads zu warten.

Der Code:

'''Image Upload''' 

upload_photo_element = driver.find_element_by_xpath(upload_photo_field_ID) 
image = os.path.join(os.getcwd(), 'images/' + 'img.png') 
upload_photo_element.send_keys(image) 

# Depending on how long the image takes to load 
time.sleep(5) 

upload_photo_reject_button_element = WebDriverWait(driver, 10).until(
lambda driver: driver.find_element_by_id(upload_photo_reject_button_ID)) 

upload_photo_reject_button_element.click() 

'''End image upload''' 

Dieser Code funktioniert für mich.

Auf diese Weise wird kein Fenster angezeigt.

Aber mir ist auch aufgefallen, dass das mit dem Firefox Browser funktioniert, aber nicht mit PhantomJS.