Невозможно загрузить файл на кнопку «Обзор» с помощью sendKeys () в Selenium Java - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь автоматизировать функцию загрузки файла. Я пытался использовать разные xpath для получения input element, но, похоже, я что-то не так делаю правильно. Мой элемент ввода не имеет идентификатора

<input name="qqfile" title="file input" style="margin: 0px; padding: 0px; top: 0px; height: 100%; right: 0px; font-family: Arial; font-size: 3500px; position: absolute; cursor: pointer; opacity: 0;" type="file" qq-button-id="7ca76e6f-e8ac-49f4-ab1e-c143e4af60d8">

И есть другой элемент ввода в том же html с тем же именем.

<input name="qqfile" title="file input" style="margin: 0px; padding: 0px; top: 0px; height: 100%; right: 0px; font-family: Arial; font-size: 3500px; position: absolute; cursor: pointer; opacity: 0;" type="file" multiple="" qq-button-id="b5ebbdcb-6f33-4f10-a569-5dba94f54d0e">

Следовательно, когда я использую, By.xpath("//input[contains(@name,'qqfile')] Я получаю Element not visible exception Я думаю, что это из-за двух элементов с одинаковым именем в контексте. Как я могу однозначно идентифицировать каждый из элементов?

Дополнительно HTML код:

<div tabindex="15" id="annUploadDoc"><div class="qq-uploader-selector qq-uploader" qq-drop-area-text="Drop files here">
            <div class="qq-total-progress-bar-container-selector qq-total-progress-bar-container qq-hide">
                <div class="qq-total-progress-bar-selector qq-progress-bar qq-total-progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
            </div>
            <div class="qq-upload-drop-area-selector qq-upload-drop-area" style="display: none;" qq-hide-dropzone="">
                <span>Drop files here to upload</span>
            </div>
            <div class="qq-upload-button-selector qq-upload-button" style="overflow: hidden; position: relative; direction: ltr;">
                <div class="btn upload btn-style-3">
                    <div>Browse</div>
                </div>
            <input name="qqfile" title="file input" style="margin: 0px; padding: 0px; top: 0px; height: 100%; right: 0px; font-family: Arial; font-size: 3500px; position: absolute; cursor: pointer; opacity: 0;" type="file" qq-button-id="fd389870-bdb2-480e-8138-8f2ff762de22"></div>
            <span class="qq-drop-processing-selector qq-drop-processing qq-hide">
                <span>Processing dropped files...</span>
                <span class="qq-drop-processing-spinner-selector qq-drop-processing-spinner"></span>
            </span>
            <ul class="qq-upload-list-selector qq-upload-list" aria-live="polite" aria-relevant="additions removals"></ul>

            <dialog class="qq-alert-dialog-selector">
                <div class="qq-dialog-message-selector"></div>
                <div class="qq-dialog-buttons">
                    <a class="qq-cancel-button-selector" href="javascript:void(0)">Close</a>
                </div>
            </dialog>

            <dialog class="qq-confirm-dialog-selector">
                <div class="qq-dialog-message-selector"></div>
                <div class="qq-dialog-buttons">
                    <a class="qq-cancel-button-selector" href="javascript:void(0)">No</a>
                    <a class="qq-ok-button-selector" href="javascript:void(0)">Yes</a>
                </div>
            </dialog>

            <dialog class="qq-prompt-dialog-selector">
                <div class="qq-dialog-message-selector"></div>
                <input type="text">
                <div class="qq-dialog-buttons">
                    <a class="qq-cancel-button-selector" href="javascript:void(0)">Cancel</a>
                    <a class="qq-ok-button-selector" href="javascript:void(0)">Ok</a>
                </div>
            </dialog>
        </div></div>

Ответы [ 4 ]

2 голосов
/ 23 января 2020

Второй элемент имеет атрибут multiple, вы можете искать элемент без него

By.xpath("//input[contains(@name,'qqfile')][not(@multiple)]")

Или с помощью cssSelector

By.cssSelector("[name='qqfile']:not(multiple)")

Атрибут style делает <input> поле невидимое. Если это невозможно сделать видимым с помощью действия пользовательского интерфейса, вы можете установить атрибут value с помощью JavaScript

String pathToFile = "path";
WebElement fileField = driver.findElement(By.xpath("//input[contains(@name,'qqfile')][not(@multiple)]"));
driver.executeScript("arguments[0].value = 'arguments[1]';", fileField, pathToFile);
0 голосов
/ 31 января 2020

Я нашел решение своей проблемы. Это был IEDriver, который я использовал. По-видимому, IEDriver отображает элементы веб-страницы определенным образом. После переключения на ChromeDriver загрузка с использованием SendKeys () работала нормально.

0 голосов
/ 23 января 2020

Ввод скрыт, потому что родительский div имеет скрытый атрибут style. Я предполагаю, что вы явно ожидаете видимости элемента ввода (возможно, это ваш метод). Если ваш локатор правильный, то просто сделайте это с помощью экземпляра драйвера.

driver.findElement(By.cssSelector("your path")).sendKeys("file path")

Это не даст вам элемент невидимое исключение по крайней мере.

0 голосов
/ 23 января 2020

Попробуйте этот xpath:

By.xpath("//div[@id='annUploadDoc']//input[contains(@name,'qqfile')]")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...