使用 Selenium Server Standalone 处理文件上传
Handle file upload with Selenium Server Standalone
我尝试使用 Selenium Standalone Server
在远程主机上执行测试套件。它应该上传一个文件。我使用下面的代码来处理文件上传:
FileBrowserDialogHandler fileBrowserDialogHandler = new FileBrowserDialogHandler();
fileBrowserDialogHandler.fileUploadDialog(fileSource);
当我远程执行它时它不起作用,因为它无法打开文件选择器window。
网页上的输入字段如下所示:
<input type="text" id="file-path">
我用基于 WebElement
的解决方案替换了当前解决方案以避免图形 window,但它不起作用。
WebElement fileInput = driver.findElement(By.id("filepathelement"));
fileInput.sendKeys(filepath);
输入类型不是文件,所以下面的代码不起作用:
driver.findElement(By.id("myUploadElement")).sendKeys("<absolutePathToMyFile>");
使用JavaSelenium: sendKeys()
或Robot Class
上传文件。
此方法是将指定的文件路径设置为剪贴板。
- 将数据复制到剪贴板。
- 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 Window 上找到文件,然后按
OK
到 select 文件。
- WIN [Ctrl + V]
- MAC
- "
Go To Folder
" - Command ⌘ + Shift + G.
- 粘贴 - Command ⌘ + V and
- 按
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;
}
文件上传测试:- 你可以找到fileUploadBytes.html
file by clicking on Try it Yourself
.
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();
}
有关详细信息,请参阅 my post
。
有问题的文件应该在您的程序 运行 所在的机器(本地或远程服务器)上可用,例如,在您的 /resources 目录中
在您的本地计算机上,这应该可以工作。
chooseFileElement.waitForVisible().type("/file/path/filename.jpg");
clickButton("Attach File");
但是,在远程服务器上,您需要将 LocalFileDetector 的新实例关联到 <input type=file>
元素。
LocalFileDetector detector = new LocalFileDetector();
File localFile = detector.getLocalFile("/file/path/filename.jpg");
RemoteWebElement input = (RemoteWebElement) myDriver().findElement(By.id("fileUpload"));
input.setFileDetector(detector);
input.sendKeys(localFile.getAbsolutePath());
clickButton("Attach File");
我尝试使用 Selenium Standalone Server
在远程主机上执行测试套件。它应该上传一个文件。我使用下面的代码来处理文件上传:
FileBrowserDialogHandler fileBrowserDialogHandler = new FileBrowserDialogHandler();
fileBrowserDialogHandler.fileUploadDialog(fileSource);
当我远程执行它时它不起作用,因为它无法打开文件选择器window。 网页上的输入字段如下所示:
<input type="text" id="file-path">
我用基于 WebElement
的解决方案替换了当前解决方案以避免图形 window,但它不起作用。
WebElement fileInput = driver.findElement(By.id("filepathelement"));
fileInput.sendKeys(filepath);
输入类型不是文件,所以下面的代码不起作用:
driver.findElement(By.id("myUploadElement")).sendKeys("<absolutePathToMyFile>");
使用JavaSelenium: sendKeys()
或Robot Class
上传文件。
此方法是将指定的文件路径设置为剪贴板。
- 将数据复制到剪贴板。
- 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 Window 上找到文件,然后按
OK
到 select 文件。- WIN [Ctrl + V]
- MAC
- "
Go To Folder
" - Command ⌘ + Shift + G. - 粘贴 - Command ⌘ + V and
- 按
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;
}
文件上传测试:- 你可以找到fileUploadBytes.html
file by clicking on Try it Yourself
.
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();
}
有关详细信息,请参阅 my post
。
有问题的文件应该在您的程序 运行 所在的机器(本地或远程服务器)上可用,例如,在您的 /resources 目录中
在您的本地计算机上,这应该可以工作。
chooseFileElement.waitForVisible().type("/file/path/filename.jpg");
clickButton("Attach File");
但是,在远程服务器上,您需要将 LocalFileDetector 的新实例关联到 <input type=file>
元素。
LocalFileDetector detector = new LocalFileDetector();
File localFile = detector.getLocalFile("/file/path/filename.jpg");
RemoteWebElement input = (RemoteWebElement) myDriver().findElement(By.id("fileUpload"));
input.setFileDetector(detector);
input.sendKeys(localFile.getAbsolutePath());
clickButton("Attach File");