与 <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
。所以我猜这与浏览器焦点有关。
我试过了:
withWindow{}
或 driver.switchTo().window()
但唯一可用的 window 是主要的。
withFrame()
但我得到 NoSuchFrameException
driver.switchTo().alert()
但它引发了 NoAlertRaisedException
所以我想知道是否有人知道 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,它将在所有浏览器上变得普遍)。
我所有的 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
。所以我猜这与浏览器焦点有关。
我试过了:
withWindow{}
或driver.switchTo().window()
但唯一可用的 window 是主要的。withFrame()
但我得到NoSuchFrameException
driver.switchTo().alert()
但它引发了NoAlertRaisedException
所以我想知道是否有人知道 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,它将在所有浏览器上变得普遍)。