与 <dialog> 和 Geb/Selenium 互动(仅与 Chrome 互动)

Interacting with <dialog> with Geb/Selenium (only with Chrome)

我所有的 Geb/Spock 测试都在 Firefox 上 运行 完美,然后我尝试使用 Chrome (v59),当出现警报或确认弹出窗口时它一直挂起。

对于 Firefox,我使用 withAlert{}withConfirm{} 来处理这些问题,但它不适用于 Chrome。

所以我深入研究了视图,发现对话框是由 this widget 管理的。所以我在我的页面对象中创建了 <dialog> 的访问器,但 Chrome 仍然无法与之交互(无法检测弹出窗口是否显示或关闭它)。 我尝试了几种方法,例如使用 displayed 或等待显示文本,但没有任何效果。

我不习惯 jQuery 所以也许我在这里遗漏了什么?

这是我必须与之交互的代码示例:

<dialog class="qq-alert-dialog-selector">
    <div class="qq-dialog-message-selector"></div>

    <div class="qq-dialog-buttons">
        <button type="button" class="qq-cancel-button-selector">Close</button>
    </div>
</dialog>

这就是我尝试访问它的方式(在我的页面对象中):

alertPopUp {$("dialog", class:"qq-alert-dialog-selector")}
alertCloseButton {alertPopUp.children("div.qq-dialog-buttons").children("button")}

最后我想如何测试弹出窗口:

when: "Trying to upload ..."
uploadFileButton = incorrect.absolutePath

then: "An alerting pop up occurs"
waitFor{alertPopUp.displayed}


when: "Closing the pop up"
alertCloseButton.click(SubmitAClaim)

then: "Number of uploaded files should not change"
uploadedElements.size() == initialUploadedFiles

有人可以帮忙吗?我想这可能与 chrome 的 focus 有关(我的意思是如果它当前在弹出窗口或后面的页面上。

编辑:

毕竟,问题似乎与jQuery无关(我猜是好事)。由于 <dialog> 中的 open attribute,我们可以验证对话框是否打开。我做过这样的事情:

when: "Trying to upload ..."
uploadFileButton = incorrect.absolutePath

then: "A alerting pop up occurs"
waitFor {alertPopUp.getAttribute("open") == "true"}

但我仍然无法与对话框交互:当我尝试单击 alertCloseButton 时,它会引发 ElementNotVisibleException。所以我猜这与浏览器焦点有关。 我试过了:

所以我想知道是否有人知道 Chrome 如何考虑 <dialog> 标签(警报、确认、...)?

Note: According to caniuse.com, Chrome is the only browser compatible with <dialog> for now.

最后我设法找到了解决这个问题的方法。我查看了 Geb 提供的 google demo for <dialog> use and I used the js object 来执行来自 Google 的 js 示例。这最终给出了这个:

when: "Trying to upload ..."
uploadFileButton = incorrect.absolutePath

then: "A alerting pop up occurs"
waitFor {alertPopUp.getAttribute("open") == "true"}


when: "Closing the pop up"
report "After upload"
js.exec """var dialog = document.querySelector(".qq-alert-dialog-selector");
    dialog.close();
    return true;
"""

then: "Number of uploaded files should not change"
uploadedElements.size() == initialUploadedFiles

真的蛮力,我不喜欢它,因为它在很大程度上依赖于后端,对话框的设置方式等......但它有效。我真的希望 Geb/Selenium 将提供更易于使用的东西(因为 <dialog> 是 W3C,它将在所有浏览器上变得普遍)。