57

我在 Stack Overflow 上看到了很多关于使用 Selenium WebDriver 上传文件的问题和解决方案。但是它们都不适用于以下场景。

有人给出了如下解决方案

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

但我仍然找不到窗口句柄。我该怎么做?

截屏

我正在为上述场景寻找解决方案。

请在以下任何网站上查看。

http://www.uploadify.com/demos/
http://www.zamzar.com/
4

15 回答 15

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

嘿,那是我从某个地方来的 :)。


如果是Zamzar网络,它应该可以完美运行。您不单击该元素。您只需输入路径即可。具体来说,这应该是绝对可以的:

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

Uploadify网络的情况下,你处于一个泡菜中,因为上传的东西是 no input,而是一个 Flash 对象。没有用于 WebDriver 的 API 可以让您使用浏览器对话框(或 Flash 对象)。

因此,在您单击 Flash 元素后,会弹出一个您无法控制的窗口。在我所知道的浏览器和操作系统中,您几乎可以假设在打开窗口后,光标在File name输入中。请确保这个假设在你的情况下也是正确的。

如果没有,您可以尝试按 跳到它Alt + N,至少在 Windows 上...

如果是,您可以使用Robot该类“盲目地”输入路径。在您的情况下,这将是一种方式:

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);

这很糟糕,但它应该工作。请注意,您可能需要这些:如何让 Robot 键入 `:`?Convert String to KeyEvents(还有新的和闪亮的KeyEvent#getExtendedKeyCodeForChar(),它做类似的工作,但只能从 JDK7 获得)。


对于 Flash,我知道的唯一选择(从这个讨论)是使用黑暗技术:

首先,修改 Flash 应用程序的源代码,使用 ActionScript 的 ExternalInterface API 公开内部方法。一旦公开,这些方法将可以被浏览器中的 JavaScript 调用。

其次,既然 JavaScript 可以在您的 Flash 应用程序中调用内部方法,您可以使用 WebDriver 在网页中进行 JavaScript 调用,然后调用您的 Flash 应用程序。

flash-selenium 项目的文档中进一步解释了这种技术。( http://code.google.com/p/flash-selenium/ ),但该技术背后的想法同样适用于 WebDriver。

于 2012-06-29T08:13:22.487 回答
13

下面的代码对我有用:

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"));
于 2014-04-15T07:28:49.417 回答
5

使用C# 和 Selenium,此代码适用于我,注意如果不是本地服务器,您将需要使用参数在 FindWindow 调用中为您的特定服务器换出“本地主机”,并跟踪打开的最新对话框是否有更多不仅仅是一个对话框,但这应该让你开始:

    using System.Threading;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    using OpenQA.Selenium;

    [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}");
        }
    }
于 2015-11-04T16:14:16.117 回答
3

我使用 vbsscript 文件在 shell 脚本中使用了 sendkeys。下面是vbs文件中的代码,

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

下面是运行这个 vbs 文件的 selenium 代码行,

driver.findElement(By.id("uploadname1")).click();
Thread.sleep(1000);
Runtime.getRuntime().exec( "wscript C:/script.vbs" );
于 2017-01-28T13:11:29.370 回答
2

有一种比 Slanec 描述的更简单的方法来解决这个问题。Hes 解决方案在您使用英文键盘时有效,否则您将很难尝试“映射”特殊字符的键。

您可以使用每个键来将字符串复制到剪贴板,然后将其粘贴robot.keyPressrobot.keyReleaseToolkit

    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);
于 2016-12-22T18:46:11.913 回答
2

查找元素(必须是具有 type="file" 属性的输入元素)并将路径发送到文件。

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

注意:如果您使用的是 RemoteWebDriver,您还必须设置文件检测器。默认是UselessFileDetector

WebElement fileInput = driver.findElement(By.id("uploadFile"));
driver.setFileDetector(new LocalFileDetector());
fileInput.sendKeys("/path/to/file.jpg");
于 2017-09-21T19:02:28.990 回答
0

将 System.Windows.Forms 二进制文件导入测试解决方案并在单击 UI 上的 Upload 按钮时调用以下两个 LOC。

        // 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}");
于 2012-11-08T04:24:02.133 回答
0

另一种解决方案是编写一个脚本来自动化打开文件对话框。请参阅AutoIt

此外,如果您无法“单击”该元素,我的解决方法通常是这样做:

element.SendKeys(Keys.Enter);

希望这会有所帮助(即使这是一个旧帖子)

于 2014-06-24T17:22:10.020 回答
0

下面的代码对我有用:

// 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();
于 2015-05-27T14:08:29.343 回答
0

您已将双斜杠 \\ 用于实现此示例的整个绝对路径:- D:\\images\\Lighthouse.jpg

步骤 - 使用 sendkeys 作为具有浏览选项的按钮(将打开窗口框以选择文件的按钮) - 现在单击将要上传文件的按钮

driver.findElement(By.xpath("//input[@id='files']")).sendKeys("D:\\images\\Lighthouse.jpg");  
Thread.sleep(5000);
driver.findElement(By.xpath("//button[@id='Upload']")).click();
于 2015-07-08T14:11:07.033 回答
0

首先将文件添加到你的项目资源目录

然后

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,您将看到您选择的文件,并跳过了文件资源管理器窗口

于 2017-01-26T11:38:17.303 回答
0

在 Selenium Webdriver 中使用 AutoIt 脚本处理文件上传。对于上述情况,它工作正常。

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

请使用以下链接获得进一步帮助: http ://www.guru99.com/use-autoit-selenium.html

于 2017-07-04T13:02:51.073 回答
0
        webDriver.FindElement(By.CssSelector("--cssSelector--")).Click();
        webDriver.SwitchTo().ActiveElement().SendKeys(fileName);

对我来说效果很好。采用 C# .net 中 Matt 在上述答案中提供的另一种方法也可以使用类名 #32770 用于上传框。

于 2017-10-23T20:53:30.873 回答
-1

下面的一个对我有用

webDriver.findElement(By.xpath("//input[@type='file' and @name='importFile']")).sendKeys("C:/path/to/file.jpg");
于 2016-06-23T11:27:57.733 回答
-1

将路径中的反斜杠加倍,如下所示:

driver.findElement(browsebutton).sendKeys("C:\\Users\\Desktop\\Training\\Training.jpg");
于 2017-02-01T06:06:25.480 回答