使用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设置到剪贴板。
- 将数据复制到剪贴板。
- 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); }
- 在Finder窗口find文件,然后按
OK
select文件。- 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