使用Selenium Server Standalone处理文件上载

时间:2017-09-15 11:56:47

标签: java selenium-webdriver selenium-server

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

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>");

1 个答案:

答案 0 :(得分:5)

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

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

  1. 将数据复制到ClipBoard。
  2. public static void setClipboardData(String filePath) {
        StringSelection stringSelection = new StringSelection( filePath );
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
    }
    
    1. 在Finder窗口中找到该文件,然后按OK选择该文件。
      • 赢[ Ctrl + V]
      • MAC
        • &#34; Go To Folder&#34; - 命令⌘ + Shift + G。
        • 粘贴 - 命令⌘ + V和
        • OK将其打开。
    2. 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找到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