Загрузка файла через Selenide в тэг <dropzone>

upload
css-selectors
java
selenide
Теги: #<Tag:0x00007f7b64b311b8> #<Tag:0x00007f7b64b31078> #<Tag:0x00007f7b64b30f10> #<Tag:0x00007f7b64b30d80>

(Юра Куськов) #1

эти варианты не работают:

$("dropzone[class=\"photo\"]").sendKeys(path);
$("dropzone[class=\"photo\"]").uploadFile(new File(path));

uploadFile() работает только с тегами input
sendKeys() тоже не хочет применяться

Надо скрипт прикреплять чтоли? Если да, то буду благодарен за сей скрипт :slightly_smiling_face:


(Bohdan B) #2

Загрузите файл и посмотрите в какой елемент падает path, может вы не туда загружаете


(Юра Куськов) #3

смотрел конечно же. там при загрузке генерится новое дерево div-ов с инфо о загруженном файле который в облаке, и ничего полезного, даже имя скрипта скрыто…
у меня решение это дергать того кто разработал сие чудо и просить у него скрипт либо переделать на input.
сюда пишу в надежде что есть более верное решение, о котором я не знаю


(Bohdan B) #4

У девов стоит уточнить, но из скрина, оно очень похоже на https://www.dropzonejs.com/ которая вешается на форму, либо на инпут


(Nadiya Zynyuk) #5

Если это дропзона, то можно загрузить файл таким вот способом:

// находим нашу дроп зону
WebElement droparea = driver.findElement(By.cssSelector("#holder"));

// дропаем файлик
DropFile(new File("C:\\Downloads\\image.png"), droparea, 0, 0);

Метод dropFile будет следующий:

private static void dropFile(File filePath, WebElement target, int offsetX, int offsetY) {
    if (!filePath.exists())
        throw new WebDriverException("File not found: " + filePath.toString());   

    WebDriver driver;

    if (WrapsElement.class.isAssignableFrom(target.getClass()))
        driver = ((WrapsDriver) ((WrapsElement) target).getWrappedElement()).getWrappedDriver();
    else {
        driver = ((RemoteWebElement) target).getWrappedDriver();
    }

    JavascriptExecutor jse = (JavascriptExecutor) driver;
    WebDriverWait wait = new WebDriverWait(driver, 30);

    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, offsetX, offsetY);
    input.sendKeys(filePath.getAbsoluteFile().toString());
    wait.until(ExpectedConditions.stalenessOf(input));
}

(Юра Куськов) #6

Я не проверял ваш код, но определённо сохраню его себе на похожий случай)
Проблема решилась когда я обратился к автору этой дропзоны…
Оказалось что в самом низу body располагаются неприглядные input’ы о которых почти невозможно догадаться что dropzone загружает файлы именно в них через скрипт…
воспользовался простой функцией от Selenide : uploadFile()
Мораль в том, что надо до победы искать нужный input, возможно он где-то не очевидно болтается :slight_smile: