使用Selenium Server独立处理文件上传



我尝试使用Selenium Standalone Server在远程主机上执行测试套件。它应该上传文件。我使用下面的代码来处理文件上传:

FileBrowserDialogHandler fileBrowserDialogHandler = new FileBrowserDialogHandler();
fileBrowserDialogHandler.fileUploadDialog(fileSource);

当我远程执行它时,它无法打开文件选择器窗口。输入字段在网页上看起来像这样:

< input type =" text" id =" file-path">

我用基于WebElement的当前解决方案替换为避免图形窗口,但它不起作用。

WebElement fileInput = driver.findElement(By.id("filepathelement"));
fileInput.sendKeys(filepath);

输入类型不是文件,因此下面的代码不起作用:

driver.findElement(By.id("myUploadElement")).sendKeys("<absolutePathToMyFile>");

使用Java Selenium: sendKeys()Robot Class

上传文件

此方法是将指定的文件路径设置为剪贴板。

  1. 将数据复制到剪贴板AS。
    • win [ ctrl c]
    • mac [命令⌘ c] - 到tell full Path of file

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

  1. 在查找器窗口上找到文件,然后按OK选择文件。
    • win [ ctrl v]
    • Mac
      • " Go To Folder " - 命令⌘ shift g。
      • 粘贴 - 命令⌘ 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;
}

文件上传测试: - 您可以通过单击Try it Yourself

找到fileUploadBytes.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();
}

有关更多信息,请参见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");

最新更新