【问题标题】:selenium webdriver: upload file by drag and dropselenium webdriver:通过拖放上传文件
【发布时间】:2016-01-13 08:00:56
【问题描述】:

在我尝试测试的网页上,我们实现了拖放文件上传。我查看了 selenium 动作链 API 的拖放 API。看起来它只支持在页面上的 2 个元素之间拖放。如何模拟从文件管理器拖动?

【问题讨论】:

  • AutoIt 有 Windows GUI 交互,试试那里。
  • @guy 谢谢,但我正在寻找基于 selenium 的编程解决方案。

标签: selenium selenium-webdriver


【解决方案1】:

使用 Selenium 执行 HTML5 文件删除:

static final String JS_DROP_FILE =
    "var tgt=arguments[0],e=document.createElement('input');e.type='" +
    "file';e.addEventListener('change',function(event){var dataTrans" +
    "fer={dropEffect:'',effectAllowed:'all',files:e.files,items:{},t" +
    "ypes:[],setData:function(format,data){},getData:function(format" +
    "){}};var emit=function(event,target){var evt=document.createEve" +
    "nt('Event');evt.initEvent(event,true,false);evt.dataTransfer=da" +
    "taTransfer;target.dispatchEvent(evt);};emit('dragenter',tgt);em" +
    "it('dragover',tgt);emit('drop',tgt);document.body.removeChild(e" +
    ");},false);document.body.appendChild(e);return e;";

WebDriver driver = new FirefoxDriver();
driver.get("http://html5demos.com/file-api");

WebElement drop_area = driver.findElement(By.id("holder"));

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript(JS_DROP_FILE, new Object[] {
        drop_area
    }).sendKeys("C:\\image.png");

【讨论】:

【解决方案2】:

AutoIt 有 DLL 包装器。我直接从 C#/Selenium 代码中使用它。

【讨论】:

    【解决方案3】:

    使用jsExecutor删除文件

    public void dropFile(File filePath, WebElement target) {
        if (!filePath.exists())
            throw new WebDriverException("File not found: " + filePath.toString());
    
        JavascriptExecutor jse = (JavascriptExecutor) getDriver();
    
        String JS_DROP_FILE =
            "var target = arguments[0]," +
            "    offsetX = arguments[1]," +
            "    offsetY = arguments[2]," +
            "    document = target.ownerDocument || document," +
            "    window = document.defaultView || window;" +
            "" +
            "var input = document.createElement('INPUT');" +
            "input.type = 'file';" +
            "input.style.display = 'none';" +
            "input.onchange = function () {" +
            "  var rect = target.getBoundingClientRect()," +
            "      x = rect.left + (offsetX || (rect.width >> 1))," +
            "      y = rect.top + (offsetY || (rect.height >> 1))," +
            "      dataTransfer = { files: this.files };" +
            "" +
            "  ['dragenter', 'dragover', 'drop'].forEach(function (name) {" +
            "    var evt = document.createEvent('MouseEvent');" +
            "    evt.initMouseEvent(name, !0, !0, window, 0, 0, 0, x, y, !1, !1, !1, !1, 0, null);" +
            "    evt.dataTransfer = dataTransfer;" +
            "    target.dispatchEvent(evt);" +
            "  });" +
            "" +
            "  setTimeout(function () { document.body.removeChild(input); }, 25);" +
            "};" +
            "document.body.appendChild(input);" +
            "return input;";
    
        WebElement input = (WebElement) jse.executeScript(JS_DROP_FILE, target, 0, 0);
        input.sendKeys(filePath.getAbsoluteFile().toString());
        waitFor(ExpectedConditions.stalenessOf(input));
    }
    

    【讨论】:

      【解决方案4】:

      使用 AWT Robot 类执行拖放操作:

      Robot robot=new Robot();
      // drag
      robot.mouseMove(x1, y1);
      robot.mousePress(InputEvent.BUTTON1_MASK);
      // drop
      robot.mouseMove(x2, y2);
      robot.mouseRelease(InputEvent.BUTTON1_MASK);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-20
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 2013-09-20
        相关资源
        最近更新 更多