java - 无法使用 Selenium Java 中的 sendKeys() 将文件上传到 "browse"按钮

标签 java html selenium selenium-webdriver

我正在尝试自动化上传文件功能。我尝试过使用不同的 xpath 来获取输入元素,但似乎我可能没有做正确的事情。 我的输入元素没有 id

<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 notvisible 异常 我认为这是因为上下文中存在两个具有相同名称的元素。 如何唯一地识别每个元素?

附加 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>

最佳答案

第二个元素有 multiple属性,您可以搜索没有它的元素

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

或者使用 cssSelector

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

style属性使 <input>场不可见。如果通过 UI 操作无法使其可见,您可以设置 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);

关于java - 无法使用 Selenium Java 中的 sendKeys() 将文件上传到 "browse"按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59875902/

相关文章:

java - Hibernate,保存新实体而不获取关联实体

javascript - 使用基于 keydown() 的 tabindex 将焦点转移到下一个元素

javascript - 查找类为 'x' 的元素,忽略类为 'x' 和其他类的元素

Python + Selenium + PhantomJS 脚本中的 Javascript 警报

html - 在短文档和长文档中将图像背景固定到文档底部

python - Selenium:测试弹出窗口

java - 如何使用 Java 8 Optionals,如果所有三个都存在则执行一个 Action ?

java - 从三个不同的线程按顺序打印一二三?

java - 在 Spring Controller 中同时执行两种方法时只有一次数据获取的最佳方法

javascript - 为什么我的 JSFiddle 不工作? (放置脚本的位置)