it-swarm.com.de

So laden Sie eine Datei (Bild) mit Selenium, Python hoch

Wie kann ich ein Bild mit dem Selenium-Testwerkzeug in eine Webanwendung hochladen Ich benutze Python.

Ich habe viele Dinge ausprobiert, aber nichts hat funktioniert.

38
Filip

Das Hochladen der Eingabesteuerung öffnet ein systemeigenes Dialogfeld (dies erfolgt über den Browser). Wenn Sie also über Selenium auf die Steuerelement- oder Durchsuchen-Schaltfläche klicken, wird das Dialogfeld nur eingeblendet und der Test bleibt hängen.

Um das Problem zu beheben, legen Sie den Wert der Upload-Eingabe über JavaScript fest (in Java erfolgt dies über den JavascriptExecutor) und senden Sie das Formular ab.

Siehe diese Frage für ein Beispiel in C #. Ich bin sicher, dass es auch eine Möglichkeit gibt, JavaScript in Python aufzurufen, aber ich habe niemals Selenium-Python-Bindungen verwendet

4
Sergii Pozharov

Was ich mache ist Folgendes (stellen Sie sicher, dass DRV eine Instanz von Webdriver ist)

drv.find_element_by_id("IdOfInputTypeFile").send_keys(os.getcwd()+"/image.png")

und suchen Sie dann Ihren Submit-Button und klicken Sie darauf.

113
karloskar

Alle diese Ansätze funktionieren nicht mit modernen Bild-Uploadern in olx !!! Alternativer Ansatz (nur für Windows)

1. Automation of windows can be done using Autoit 
2. Install Autoit and SciTe Script editor 
3. Autoit code :(imageupload.au3)

WinActivate("File Upload");  for chrome use "open" that is the name of the window that pops 
send("D:\images\image1.png");  path of the file
Send("{ENTER}")

4. compile it to get an .exe file(imageupload.exe)
5. Now from python call the .exe file like

import os
import os.system('C:\images\imageupload.exe') #path of the .exe file
6
saravanan

Ich fügte eine Antwort für alle hinzu, die mit den lästigen msofiledialogs umgehen wollten. Dies ist eine Abarbeitung der von Saravanan vorgeschlagenen Lösung, aber für Python noch detaillierter.

Ich hatte ein ähnliches Problem mit einem Skript, an dem ich gerade für eine Firma arbeite. Ich versuche, Dokumente für die Kunden eines Unternehmens hochzuladen, aber aufgrund der Funktionsweise ihrer Website konnte ich send_keys nicht verwenden, um den Pfad direkt zu senden. Daher musste ich mich auf msofiledialog verlassen.

  1. Sie müssen nur AutoIt https://pypi.python.org/pypi/PyAutoIt/0.3 oder einfach "pip install -U pyautoit" über den cmd-Bildschirm installieren

  2. geben Sie "import autoit" auf Ihrer Skriptseite ein 

  3. Geben Sie Folgendes ein, bevor das Dateidialogfeld in Ihrem Skript angezeigt wird:

    autoit.win_active ("Open") autoit.control_send ("Open", "Edit1", r "C:\Benutzer\uu\Desktop\TestUpload.txt") autoit.control_send ("Open", "Edit1", "{ENTER}")

Es sucht nach dem geöffneten Dateidialogfenster, füllt es aus und drückt die Eingabetaste . "Öffnen" ist der Titel meines Dateidialogbildschirms. Setzen Sie Ihren Titel anstelle von "Open". Es gibt mehr kreative Möglichkeiten, die Funktionen von AutoIt zu nutzen, aber für Anfänger ist dies eine einfache und unkomplizierte Möglichkeit.

Bearbeiten: NICHT. Verwenden Sie KEIN control_send für die meisten Dinge, wenn Sie es vermeiden können. Es ist ein bekanntes Problem, fehlerhaften Text zu senden. In meinem Fall wurde der Doppelpunkt in meinem Dateipfad in einen Semikolon umgewandelt. Wenn Sie Eingabeschlüssel senden müssen, sollte dies in Ordnung sein. Wenn Sie jedoch Text senden möchten, verwenden Sie control_set_text. Es hat die gleiche Syntax.

autoit.control_set_text("Open","Edit1",r"C:\Users\uu\Desktop\TestUpload.txt")
6
Noctsol

Ich benutze fine-uploader , führe Selenium-Tests mit pytest aus und das hat für mich funktioniert:

    Elm = driver.find_element_by_xpath("//input[@type='file']")
    Elm.send_keys(os.getcwd() + "/tests/sample_files/Figure1.tif")

In meinem Fall ist keine Formularabgabe oder Eingabetaste erforderlich.

Vielen Dank für alle Antworten! Es hat sehr geholfen!

3
AnaPana
import win32com.client

Shell = win32com.client.Dispatch("WScript.Shell")   
Shell.Sendkeys("C:\text.txt")  
Shell.Sendkeys("~")

Wird das Problem beheben

1
user1859723

Hier ist der Code, den ich verwendet habe:

Imagepath = "C:\User\Desktop\image.png" driver.find_element_by_xpath('//html/body/input').send_keys(Imagepath) driver.find_element_by_xpath('//html/body/button').click()

Ich akzeptiere die Antwort von karloskar. Hinweis Es funktioniert nicht für FireFox (59). Und es funktioniert nur mit Chrome Driver. 

0
Arun K

vollständiger Code zum Hochladen von Dateien mit dem Autoit-Tool. Du kannst es einfach kopieren, einfügen und ausführen. Es wird funktionieren, da es sich um eine aktuelle Demo handelt.

from Selenium import webdriver
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.support import expected_conditions as ec
from Selenium.webdriver.common.by import By
from Selenium.webdriver.common.keys import Keys
import time
import os

def fileUploading():

    driver = webdriver.Firefox()
    driver.implicitly_wait(20)
    wait = WebDriverWait(driver, 10)
    driver.get("https://demo.actitime.com/login.do");
    driver.find_element(By.ID,"username").send_keys("admin")
    driver.find_element(By.NAME, "pwd").send_keys("manager")
    driver.find_element(By.XPATH, "//div[.='Login ']").click()
    wait.until(ec.element_to_be_clickable((By.XPATH, "(//div[@class='popup_menu_icon'])[3]")))
    driver.find_element(By.XPATH, "(//div[@class='popup_menu_icon'])[3]").click()
    wait.until(ec.element_to_be_clickable((By.XPATH, "//a[contains(text(),'Contact actiTIME Support')]")))
    driver.find_element(By.XPATH, "//a[contains(text(),'Contact actiTIME Support')]").click()
    wait.until(ec.element_to_be_clickable((By.XPATH,"//div[@class='dz-default dz-message']")))
    driver.find_element(By.XPATH,"//div[@class='dz-default dz-message']").click()
    os.system("C:\\Users\\mallikar\\Desktop\\screenUpload.exe")
    time.sleep(2000)

fileUploading()

unten ist der Inhalt des Autoit-Codes:

WinWaitActive("File Upload")
Send("D:\SoftwareTestingMaterial\UploadFile.txt")
Send("{ENTER}")

laden Sie das autoIt und autoIt SCITE Editor Tool herunter. Nach der Installation von autoit und dem Öffnen des Scite-Editors fügen Sie den obigen Code ein und speichern ihn mit der Erweiterung .au3. Klicken Sie nach dem Speichern mit der rechten Maustaste auf die Datei und wählen Sie Komplettskript (x64). Nun wird die EXE-Datei erstellt.

verwenden Sie jetzt den folgenden Code:

os.system("C:\\Users\\mallikar\\Desktop\\screenUpload.exe")
0
Mallikarjuna B

Splitter verwenden: 

browser.attach_file ('file_chooser_id', vollständig_qualifizierter_Dateipfad)

0
Anjan Dash

Ich habe das folgende Skriptformat verwendet, um die Bilder hochzuladen. Das kann dir helfen.

   Imagepath=os.path.abspath('.\\folder1\\subfolder2\file1.jpg')
   driver.find_element_by_id("Id of the element").clear()            
   driver.find_element_by_id("Id of the element").send_keys(Imagepath)

wenn Sie keine ID des Objekts haben, können Sie xpath oder css selector entsprechend verwenden.

0
Tester P