【问题标题】:How to upload a file in Selenium when sendKeys is not working当 sendKeys 不起作用时如何在 Selenium 中上传文件
【发布时间】:2019-02-14 20:14:34
【问题描述】:

HTML 代码属于 shadow DOM 类型。

这是输入类型:

<input hidden type="file" id="fileInput" accept=".doc,.docx,.pdf,.jpg,.png">

【问题讨论】:

  • 您使用哪种语言使用 Python 或 Java?您需要提及吗?
  • 嗨!进展如何?你试过我的回答吗?谢谢。

标签: javascript java selenium


【解决方案1】:

您可以尝试使用 Selenium 中的 JavaScriptExecutor 执行 JavaScript 脚本,使该元素不被隐藏。我在我的项目中做了这种事情,因为在 IE 中 SendKeys 也不适用于隐藏输入。

【讨论】:

    【解决方案2】:

    您需要使用 JS 使输入可见。完整的步骤如下所述:

    // Find file input element
    WebElement input = driver.findElement(By.cssSelector("input[type='file']"));
    
    // Make sure element is visible
    ((JavascriptExecutor) driver).executeScript("arguments[0].style.display = 'block';", input);
    
    // Specify you local file path here
    input.sendKeys("/path/to/file/on/machine/which/runs/tests");
    

    如果是 RemoteDriver,不要忘记添加:

    // Configure your client to upload local files to remote Selenium instance
        driver.setFileDetector(new LocalFileDetector());
    

    注意:文件路径应该是绝对的。你可以这样做:

    String getFilePath(String filePath) {
        new File(filePath).absolutePath
    }
    

    【讨论】:

      【解决方案3】:

      如果类型文件在 shadowroot 中,您目前无法使用 selenium 访问它。

      这与字段不可见无关

      通常,您可以这样做:

      $el = $driver->findElement(\WebDriverBy::xpath('//*[@type="file"]')
      $el->setFileDetector(new \LocalFileDetector());
      $el->sendKeys($imagepath);
      
      // or mink:
      $el = $driver->getPage()->find('xpath', '//*[@type="file"]');
      $el->attachFile($path);
      

      但是,如果它在 shadow-root 中,在控制台中使用它不会找到它:

      $x('//*[@type="file"]')
      

      这也不会:

      $("input[type='file']")
      

      你可以通过js检查输入元素并右键获取元素,你可能会得到这样的元素路径

      document.querySelector("body > something").shadowRoot.querySelector("div > div > something").shadowRoot.querySelector("#someid")
      

      这意味着它只能通过影子根访问,并且可以使用上面的javascript完成

      Selenium Javascript 无法返回元素(但如果 selenium 可以获取元素,则可以如上所示进行上传) Javascript 不允许你上传,因为它不安全(但你可以从上面的 js 中获取元素)

      但问题是,您不能将 javascript 元素作为 php selenium 元素返回。所以没有办法让两个人一起工作。

      真正的问题是,selenium 还不支持影子根

      【讨论】:

        猜你喜欢
        • 2020-10-12
        • 2018-10-11
        • 1970-01-01
        • 2021-05-09
        • 2021-11-21
        • 2013-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多