// 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 网络,您处于困境中,因为上传的东西不是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);
这很糟糕,但它应该可以工作。请注意,您可能需要这些:How can I make Robot type a `:`? 和 Convert String to KeyEvents(另外还有新的闪亮的 KeyEvent#getExtendedKeyCodeForChar(),它可以做类似的工作,但只能从 JDK7 获得)。
对于 Flash,我知道的唯一替代方法(来自 this discussion)是使用暗技术:
首先,你修改你的 Flash 应用程序的源代码,暴露
使用 ActionScript 的 ExternalInterface API 的内部方法。
一旦公开,这些方法将可以被浏览器中的 JavaScript 调用。
其次,既然 JavaScript 可以在您的 Flash 应用程序中调用内部方法,
您使用 WebDriver 在网页中进行 JavaScript 调用,这将
然后调用你的 Flash 应用程序。
flash-selenium 项目的文档中进一步解释了该技术。
(http://code.google.com/p/flash-selenium/),但该技术背后的想法
也适用于 WebDriver。