【问题标题】:How to upload a file in Selenium WebDriver with no 'input' element如何在没有“输入”元素的 Selenium WebDriver 中上传文件
【发布时间】:2015-10-06 19:04:36
【问题描述】:

我有一个 HTML 页面,其中包含名为“上传”的按钮和 ID:btn-import-questions。元素:

<button class="btn btn-success btn-sm col-lg-11" id="btn-import-questions" data-ts-file-selector="questions-import-init">  Upload&nbsp;<i class="fa fa-upload"></i></button>

我尝试了这样的 Selenium Java 代码:

driver.findElement(By.id("btn-import-questions")).sendkeys("C:/path/to/file.xlsx");

但由于这是一个上传按钮而不是输入类型元素,所以上面的代码不起作用。

【问题讨论】:

  • 手动点击这个按钮会发生什么?
  • 会立即弹出窗口,并通过打开和取消按钮询问文件路径
  • 而当你使用这个弹窗选择一个文件时,这个文件的名字会在弹窗消失后出现在页面的某处吗?
  • 提供文件路径并点击打开后,突然弹出窗口消失,文件中的数据被导入到我的应用程序中。
  • 您的窗口是否显示上传的文件路径..??一旦直接在网站上查看。

标签: java selenium testing selenium-webdriver automation


【解决方案1】:

检查 DOM,因为某处必须有 &lt;input type="file"&gt;。网站的 javascript 将调用此元素的 .click() 以弹出文件选择器对话框,并通过选择关闭对话框将提供路径。使用 Selenium 也可以使用 .sendkeys() 来实现:

driver.findElement(By.xpath("//input[@type=\"file\"]")).sendkeys(localFilePath);

【讨论】:

    【解决方案2】:

    您几乎正确地执行了此操作,除了应该使用 type="file" 在输入上调用 sendKeys(),也就是说,在您的情况下很可能是不可见的。如果是这种情况,请先使元素可见:

    【讨论】:

      【解决方案3】:

      这个对我有用:

          String CSVFile = "C:\\D\\Projects\\file.csv";
      WebElement fileElement=this.driver.findElement(By.xpath("//[text()='fileElement']"));
                  this.wait.until(ExpectedConditions.elementToBeClickable(fileElement ));
                  fileElement .click();
      
                  StringSelection ss = new StringSelection(CSVFile);
                  Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
      
                  //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);
      

      【讨论】:

        【解决方案4】:

        您可以使用 AutoIT 工具来执行此操作。 使用 AutoIT .Au3 文件中的以下代码进行上传。

        sleep(1000)
        If WinExists("[TITLE:Open]") Then
        
         Local $hWnd = WinWaitActive ("[TITLE:Open]", "",15)
         WinActivate($hWnd)
         ;WinWaitActive("Open", "", 10)
         ControlFocus("Open","","Edit1")
         ControlsetText("Open","","Edit1",$CmdLine[1])
         ControlClick("Open","","Button1")
        
        ElseIf WinExists("[TITLE:File Upload]") Then
        
         Local $hWnd = WinWaitActive ("[TITLE:File Upload]", "",15)
         WinActivate($hWnd)
         ;WinWaitActive("Open", "", 10)
         ControlFocus("File Upload","","Edit1")
         ControlsetText("File Upload","","Edit1",$CmdLine[1])
         ControlClick("File Upload","","Button1")
        
        Else
        
         Local $hWnd = WinWaitActive ("[TITLE:Choose File to Upload]", "",15)
         WinActivate($hWnd)
         ;WinWaitActive("Open", "", 10)
         ControlFocus("Choose File to Upload","","Edit1")
         ControlsetText("Choose File to Upload","","Edit1",$CmdLine[1])
         ControlClick("Choose File to Upload","","Button1")
        
        EndIf
        

        然后在你的 C# 代码中使用下面的代码来调用它。

        String sExe=(<EXE file path>+" "+<Upload file path>);
        
        Runtime.getRuntime().exec(sExe);
        Thread.sleep(5000);
        

        【讨论】:

          猜你喜欢
          • 2014-12-05
          • 1970-01-01
          • 2014-09-02
          • 1970-01-01
          • 1970-01-01
          • 2021-09-26
          • 2021-11-26
          • 2016-12-01
          • 1970-01-01
          相关资源
          最近更新 更多