使用Selenium WebDriver和Java Robot Class上传文件

我使用Selenium WebDriver和Java,我需要自动化file uploadfunction。 我尝试了很多,但点击浏览button的时候,一个新的窗口打开脚本停止执行进一步,而是卡住了。 我尝试在Firefox和IE驱动程序,但无济于事。

我也尝试通过调用一个自动执行文件,但随着新窗口打开点击浏览button,特定的声明

Runtime.getRuntime().exec("C:\\Selenium\\ImageUpload_FF.exe") 

不能执行。 请帮助

这应该适用于Firefox,Chrome和IE驱动程序。

 FirefoxDriver driver = new FirefoxDriver(); driver.get("http://localhost:8080/page"); File file = null; try { file = new File(YourClass.class.getClassLoader().getResource("file.txt").toURI()); } catch (URISyntaxException e) { e.printStackTrace(); } Assert.assertTrue(file.exists()); WebElement browseButton = driver.findElement(By.id("myfile")); browseButton.sendKeys(file.getAbsolutePath()); 

点击button并使用下面的代码。 请注意在path名中使用'\\'而不是'\' ,这对代码的工作非常重要

 WebElement file_input = driver.findElement(By.id("id_of_button")); file_input.sendKeys("C:\\Selenium\\ImageUpload_FF.exe"); 

我想我需要给Alex的回答添加一些东西。

我试图通过使用这个代码打开打开窗口:

 driver.findElement(My element).click() 

窗口打开了,但是驱动程序没有响应,代码中的动作甚至都没有到达机器人的动作。 我不知道这种情况发生的原因,可能是因为浏览器失去了重点。

我使它的工作方式是使用动作selenium类:

  Actions builder = new Actions(driver); Action myAction = builder.click(driver.findElement(My Element)) .release() .build(); myAction.perform(); Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_ENTER); robot.keyRelease(KeyEvent.VK_ENTER); 

我也使用seleniumwebdriver和Java,并有同样的问题。 我所做的是将path复制到剪贴板中的文件,然后将其粘贴到“打开”窗口中,然后单击“Enter”。 这是工作,因为焦点总是在“打开”button。

这里是代码:

你将需要这些类和方法:

 import java.awt.Robot; import java.awt.event.KeyEvent; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; public static void setClipboardData(String string) { StringSelection stringSelection = new StringSelection(string); Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null); } 

这就是我打开“打开”窗口之后所做的:

 setClipboardData("C:\\path to file\\example.jpg"); //native key strokes for CTRL, V and ENTER keys Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_ENTER); robot.keyRelease(KeyEvent.VK_ENTER); 

就是这样。 它正在为我工​​作,我希望它适用于你们中的一些人。

modal dialog打开后脚本将不起作用,它只是挂起。 所以先调用autoit.exe ,然后点击打开模式对话框。

这样很好,

  Runtime.getRuntime().exec("Upload_IE.exe"); selenium.click("//input[@name='filecontent']"); 

使用Java Selenium: sendKeys()Robot Class上传文件。

此方法是将指定的文件path设置到剪贴板。

  1. 将数据复制到剪贴板。
    • WIN [ Ctrl + C]
    • MAC [ Command⌘ + C] – tell full Path of file

 public static void setClipboardData(String filePath) { StringSelection stringSelection = new StringSelection( filePath ); Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null); } 

  1. 在Finder窗口find文件,然后按OKselect文件。
    • WIN [ Ctrl + V]
    • 苹果电脑
      • Go To Folder ” – 命令⌘ + Shift + G.
      • 粘贴 – 命令⌘ + V和
      • OK打开它。

 enum Action { WIN, MAC, LINUX, SEND_KEYS; } public static boolean FileUpload(String locator, String filePath, Action type) { WebDriverWait explicitWait = new WebDriverWait(driver, 10); WebElement element = explicitWait.until(ExpectedConditions.elementToBeClickable( By.xpath(locator) )); if( type == Action.SEND_KEYS ) { element.sendKeys( filePath ); return true; } else { try { element.click(); Thread.sleep( 1000 * 5 ); setClipboardData(filePath); Robot robot = new Robot(); if( type == Action.MAC ) { // Apple's Unix-based operating system. // “Go To Folder” on Mac - Hit Command+Shift+G on a Finder window. robot.keyPress(KeyEvent.VK_META); robot.keyPress(KeyEvent.VK_SHIFT); robot.keyPress(KeyEvent.VK_G); robot.keyRelease(KeyEvent.VK_G); robot.keyRelease(KeyEvent.VK_SHIFT); robot.keyRelease(KeyEvent.VK_META); // Paste the clipBoard content - Command ⌘ + V. robot.keyPress(KeyEvent.VK_META); robot.keyPress(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_META); // Press Enter (GO - To bring up the file.) robot.keyPress(KeyEvent.VK_ENTER); robot.keyRelease(KeyEvent.VK_ENTER); return true; } else if ( type == Action.WIN || type == Action.LINUX ) { // Ctrl + V to paste the content. robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_CONTROL); } robot.delay( 1000 * 4 ); robot.keyPress(KeyEvent.VK_ENTER); robot.keyRelease(KeyEvent.VK_ENTER); return true; } catch (AWTException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } return false; } 

file uploadtesting: –您可以通过单击“ Try it Yourself来findfileUploadBytes.html文件。

 public static void uploadTest( RemoteWebDriver driver ) throws Exception { //driver.setFileDetector(new LocalFileDetector()); String baseUrl = "file:///D:/fileUploadBytes.html"; driver.get( baseUrl ); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); FileUpload("//input[1]", "D:\\log.txt", Action.SEND_KEYS); Thread.sleep( 1000 * 10 ); FileUpload("//input[1]", "D:\\DB_SQL.txt", Action.WIN); Thread.sleep( 1000 * 10 ); driver.quit(); } 

使用Selenium:sendKeys()如果要将本地计算机上的文件(请参阅本地文件)传输到网格节点服务器,则需要使用setFileDetector方法 。 通过使用这个Selenium-客户端将通过JSON有线协议传输文件。 欲了解更多信息,请参阅saucelabs fileUpload Example

 driver.setFileDetector(new LocalFileDetector()); 

或可能使用webdriver支持selenium –

 Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl); 

并在上传元素上执行通常的types