it-swarm.com.de

Wie handhabt man Windows-Dateien mit Selenium WebDriver

Ich habe viele Fragen und Lösungen zum Dateiupload mit Selenium WebDriver unter Stackoverflow gesehen. Aber das folgende Szenario funktioniert nicht. 

Jemand hat die Lösung wie folgt gegeben 

// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.name("uploadfile"));
fileInput.sendKeys("C:/path/to/file.jpg");

Aber ich finde immer noch kein Fensterhandle, wie kann ich daran arbeiten?

Screenshot

Ich suche eine Lösung für das obige Szenario 

Bitte überprüfen Sie dies für eine der folgenden Websites

http://www.uploadify.com/demos/
http://www.zamzar.com/
34
Jasmine.Olivra
// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.name("uploadfile"));
fileInput.sendKeys("C:/path/to/file.jpg");

Hey, das ist meins von irgendwoher :).


Im Falle des Zamzar Webs sollte es einwandfrei funktionieren. Sie klicken nicht auf das Element . Geben Sie einfach den Pfad ein. Um konkret zu sein, sollte dies absolut in Ordnung sein:

driver.findElement(By.id("inputFile")).sendKeys("C:/path/to/file.jpg");

Im Fall des Uploadify - Webs befinden Sie sich in einer schwierigen Situation, da das Upload-Objekt kein input ist, sondern ein Flash-Objekt. Es gibt keine API für WebDriver, mit der Sie mit Browserdialogen (oder Flash-Objekten) arbeiten können.

Nachdem Sie auf das Flash-Element geklickt haben, wird ein Fenster geöffnet, über das Sie keine Kontrolle haben. In den Browsern und Betriebssystemen, die ich kenne, kann man so ziemlich davon ausgehen, dass sich der Cursor nach dem Öffnen des Fensters in der Eingabe File name befindet. Bitte stellen Sie sicher, dass diese Annahme auch in Ihrem Fall zutrifft.

Wenn nicht, können Sie versuchen, durch Drücken von dorthin zu springen Alt + NZumindest unter Windows ...

Wenn ja, können Sie den Pfad mit der Klasse Robot "blind" eingeben. In Ihrem Fall wäre das etwas in der Art von:

driver.findElement(By.id("SWFUpload_0")).click();
Robot r = new Robot();
r.keyPress(KeyEvent.VK_C);        // C
r.keyRelease(KeyEvent.VK_C);
r.keyPress(KeyEvent.VK_COLON);    // : (colon)
r.keyRelease(KeyEvent.VK_COLON);
r.keyPress(KeyEvent.VK_SLASH);    // / (slash)
r.keyRelease(KeyEvent.VK_SLASH);
// etc. for the whole file path

r.keyPress(KeyEvent.VK_ENTER);    // confirm by pressing Enter in the end
r.keyRelease(KeyEvent.VK_ENTER);

Es ist scheiße, aber es sollte funktionieren. Beachten Sie, dass Sie diese möglicherweise benötigen: Wie kann ich dafür sorgen, dass Robot ein `:`? und String in KeyEvents konvertieren (außerdem gibt es das neue und glänzende KeyEvent#getExtendedKeyCodeForChar() was ähnliche Arbeit leistet, aber nur von JDK7 verfügbar ist).


Für Flash ist die einzige mir bekannte Alternative (aus diese Diskussion ), die Dunkeltechnik zu verwenden:

Zunächst ändern Sie den Quellcode Ihrer Flash-Anwendung, indem Sie interne Methoden mit der ExternalInterface-API von ActionScript verfügbar machen. Sobald diese Methoden verfügbar sind, können sie von JavaScript im Browser aufgerufen werden.

Zweitens, da JavaScript jetzt interne Methoden in Ihrer Flash-App aufrufen kann, verwenden Sie WebDriver, um einen JavaScript-Aufruf auf der Webseite zu tätigen, der dann Ihre Flash-App aufruft.

Diese Technik wird in den Dokumenten des Flash-Selenium-Projekts näher erläutert. ( http://code.google.com/p/flash-Selenium/ ), aber die Idee, die hinter dieser Technik steckt, gilt auch für WebDriver.

43
Petr Janeček

Der folgende Code funktioniert für mich:

public void test() {
    WebDriver driver = new FirefoxDriver();
    driver.get("http://www.freepdfconvert.com/pdf-Word");
    driver.findElement(By.id("clientUpload")).click();
    driver.switchTo()
            .activeElement()
            .sendKeys(
                    "/home/likewise-open/GLOBAL/123/Documents/filename.txt");
    driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
    driver.findElement(By.id("convertButton"));
9

Mit C # und Selenium dieser Code funktioniert für mich,NOTESie werden einen Parameter verwenden, um "localhost" im FindWindow-Aufruf für Ihren bestimmten Server auszutauschen, wenn es nicht localhost und tracking ist Dies ist der neueste Dialog, der geöffnet wird, wenn mehr als ein Dialog vorhanden ist, aber damit sollten Sie beginnen:

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    public static void UploadFile(this IWebDriver webDriver, string fileName)
    {
        webDriver.FindElement(By.Id("SWFUpload_0")).Click();
        var dialogHWnd = FindWindow(null, "Select file(s) to upload by localhost");
        var setFocus = SetForegroundWindow(dialogHWnd);
        if (setFocus)
        {
            Thread.Sleep(500);
            SendKeys.SendWait(fileName);
            SendKeys.SendWait("{ENTER}");
        }
    }
2
Matt

Importieren Sie System.Windows.Forms binary in die Testlösung, und rufen Sie die folgenden beiden LOCs auf, wenn Sie auf die Schaltfläche Upload in der Benutzeroberfläche klicken.

        // Send the file path and enter file path and wait.
        System.Windows.Forms.SendKeys.SendWait("complete path of the file");
        System.Windows.Forms.SendKeys.SendWait("{ENTER}");
1
Sham

Es gibt einen einfacheren Weg, um das zu lösen, als Slanec beschrieben hat. Diese Lösung funktioniert, wenn Sie eine englische Tastatur verwenden. Andernfalls wird es Ihnen schwerfallen, den Schlüssel für Sonderzeichen zu "zuordnen".

Anstelle von robot.keyPress und robot.keyRelease für jeden einzelnen Schlüssel können Sie Toolkit verwenden, um den String in die Zwischenablage zu kopieren und ihn dann einzufügen.

    StringSelection s = new StringSelection("Path to the file");
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(s, null);
    Robot robot = new Robot();
    robot.keyPress(Java.awt.event.KeyEvent.VK_ENTER);
    robot.keyRelease(Java.awt.event.KeyEvent.VK_ENTER);
    robot.keyPress(Java.awt.event.KeyEvent.VK_CONTROL);
    robot.keyPress(Java.awt.event.KeyEvent.VK_V);
    robot.keyRelease(Java.awt.event.KeyEvent.VK_CONTROL);
    Thread.sleep(3000);
    robot.keyPress(Java.awt.event.KeyEvent.VK_ENTER);
1
Bruno Pontes

Ich habe sendkeys in Shell-Skripts mit einer Vbsscript-Datei verwendet. Unten ist der Code in der VBS-Datei.

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.SendKeys "C:\Demo.txt"
WshShell.SendKeys "{ENTER}"

Unten ist die Selenium-Codezeile zum Ausführen dieser VBS-Datei.

driver.findElement(By.id("uploadname1")).click();
Thread.sleep(1000);
Runtime.getRuntime().exec( "wscript C:/script.vbs" );
1
Vignesh Sunder

Der folgende Code funktioniert für mich: 

// wait for the window to appear
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());

// switch to the file upload window
Alert alert = driver.switchTo().alert();

// enter the filename
alert.sendKeys(fileName);

// hit enter
Robot r = new Robot();
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);

// switch back
driver.switchTo().activeElement();
1
Rahul Kaup

Sie haben einen doppelten Schrägstrich \\ für den gesamten absoluten Pfad gesetzt, um dies zu erreichen Beispiel: - D: \\ images \\ Lighthouse.jpg

Schritte - Verwenden Sie Sendkeys für die Schaltfläche mit der Durchsuchen-Option (die Schaltfläche, die geöffnet wird Ihr Fensterfeld, um Dateien auszuwählen) - Klicken Sie nun auf die Schaltfläche, die Ihre Datei hochladen soll

driver.findElement(By.xpath("//input[@id='files']")).sendKeys("D:\\images\\Lighthouse.jpg");  
Thread.sleep(5000);
driver.findElement(By.xpath("//button[@id='Upload']")).click();
0
Shubham Jain

Suchen Sie das Element (muss ein Eingabeelement mit dem Attribut type = "file" sein) und senden Sie den Pfad zur Datei. 

WebElement fileInput = driver.findElement(By.id("uploadFile"));
fileInput.sendKeys("/path/to/file.jpg");

HINWEIS: Wenn Sie einen RemoteWebDriver verwenden, müssen Sie auch einen Datei-Detektor einstellen. Der Standardwert ist UselessFileDetector

WebElement fileInput = driver.findElement(By.id("uploadFile"));
driver.setFileDetector(new LocalFileDetector());
fileInput.sendKeys("/path/to/file.jpg");
0
Marissa Novak

Verwenden Sie das AutoIt-Skript, um den Datei-Upload in Selenium Webdriver zu verarbeiten. Es funktioniert gut für das obige Szenario.

Runtime.getRuntime().exec("E:\\AutoIT\\FileUpload.exe");

Bitte verwenden Sie den folgenden Link für weitere Hilfe: http://www.guru99.com/use-autoit-Selenium.html

0
Anumanth
        webDriver.FindElement(By.CssSelector("--cssSelector--")).Click();
        webDriver.SwitchTo().ActiveElement().SendKeys(fileName);

hat für mich gut funktioniert. Ein anderer Ansatz, den Matt in C # .net zur Verfügung stellte, könnte auch mit dem Klassennamen # 32770 für die Upload-Box funktionieren. 

0
user6723403

Fügen Sie die Datei zunächst Ihrem Projektressourcenverzeichnis hinzu

dann

public YourPage uploadFileBtnSendKeys() {
    final ClassLoader classLoader = getClass().getClassLoader();
    final File file = new File(classLoader.getResource("yourFile.whatever").getPath());
    uploadFileBtn.sendKeys(file.getPath());
    return this;
}

Walla, Sie sehen Ihre ausgewählte Datei und haben das Datei-Explorer-Fenster übersprungen

0
rogger2016

Eine alternative Lösung wäre das Schreiben eines Skripts zur Automatisierung des Dialogfelds "Datei öffnen". Siehe AutoIt

Wenn Sie das Element nicht "anklicken" können, besteht die folgende Problemumgehung darin:

element.SendKeys(Keys.Enter);

Hoffe das hilft (auch wenn es ein alter Beitrag ist)

0
sparkyShorts