java - Selenium 关闭文件选择器对话框

标签 java selenium firefox selenium-webdriver junit

我们在 Jenkins box(运行 Linux)上使用 Selenium-Webdriver 来驱动 Firefox 来测试一个相当复杂的网络应用程序。 Web 应用程序需要上传照片进行测试,我们通过使用输入文件对话框的发送键实现了这一点。不幸的是(可能由于 uploader 的工作方式,它是 plupload 并通过 XHR 而非 FORM post 上传)文件选择器对话框永远不会关闭。虽然这有点烦人,但过去测试仍然顺利通过。从 selenium-2.45.0 切换到 selenium-2.53.1 并将 FireFox 升级到 45 我们发现我们的测试现在失败了,因为元素由于文件选择器对话框而不再可见(至少我们假设这是元素不再可见的原因对点击使用react是因为它们在文件对话框后面)。

我意识到无法单击关闭对话框按钮,并且我已尝试通过各种方式向浏览器发送转义键以关闭对话框,但我尝试过的都不起作用:

((RemoteWebDriver)driver).getKeyboard().pressKey(Keys.ESCAPE);

由于在测试中运行的 Jenkins 服务器与由 Selenium 驱动的 Firefox 在不同的服务器上,因此 Roboto 和 AutoIt 不是一个选项。是否有某种方法可以触发不涉及与对话框交互的对话框关闭。我的想法是在页面中注入(inject)一些 javascript 以围绕文件输入创建一个表单,然后提交该表单(无处可去),然后重新加载页面,但事实证明这是不成功的。

File Upload Dialog

最佳答案

可能有一个点击事件传输到 <input type="file">元素,打开文件对话框。

克服此问题的一种方法是禁用内部 click通过覆盖方法。这段 JavaScript 将禁用内部 click对于每个 <input type="file">元素:

((JavascriptExecutor)driver).executeScript(
    "HTMLInputElement.prototype.click = function() {                     " +
    "  if(this.type !== 'file') HTMLElement.prototype.click.call(this);  " +
    "};                                                                  " );

然后调用.sendKeys("full file path")上传文件在 <input type="file"> 上元素。

在某些情况下,<input type="file">只驻留在内存中。如果是这种情况,您必须将其插入到页面中:

((JavascriptExecutor)driver).executeScript(
    "HTMLInputElement.prototype.click = function () {" +
    "    if (this.type !== 'file') {" +
    "        HTMLElement.prototype.click.call(this);" +
    "    }" +
    "    else if (!this.parentNode) {" +
    "        this.style.display = 'none';" +
    "        this.ownerDocument.documentElement.appendChild(this);" +
    "        this.addEventListener('change', () => this.remove());" +
    "    }" +
    "}");

参见 https://gist.github.com/florentbr/d7bee068932bdf6e00af3b9f01af9af6

关于java - Selenium 关闭文件选择器对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259460/

相关文章:

java - 如何使用警报对话框删除sqlite listview android中的项目

java - Java中的正则表达式并忽略空格

java - 需要针对我的自动化脚本中的每个步骤合并开始时间和结束时间

python - 如何使用 Python 和 Selenium 发送 ESC 键关闭弹出窗口?

java - Rails 类似于 Java 的数据库抽象

java - 无法在 ormlite 中使用列名 = "` GROUP`的 QueryBuilder

Python:Selenium 在表单的文本框中写入

ajax - FireFox 何时支持 websocket?

javascript - Firefox 30 数组处理中的 JavaScript 错误

firefox - 无意中安装了管道搜索,现在我的 Firefox 显示了 Bing 页面而不是 404