我正在编写功能测试并处理淡入淡出的模态窗口。
显示和现在之间有什么区别?
例如我有:
settingsModule.container.displayed and settingsModule.container.present
其中settingsModule代表我的模态窗口。
在测试我的模态窗口(Twitter' bootstrap中的模态)时,我通常会这样做:
def "should do ... "() {
setup:
topMenu.openSettingsModal()
expect:
settingsModule.timeZone.value() == "Asia/Hong_Kong"
cleanup:
settingsModule.closeSettingsModal()
}
def "should save the time zone"() {
setup:
topMenu.openSettingsModal()
settingsModule.timeZone = "Japan"
when:
settingsModule.saveSettings()
then:
settingsModule.alertSuccess.size() == 1
settingsModule.alertSuccess.text() == "Settings updated"
when:
settingsModule.saveSettings()
then:
settingsModule.alertSuccess.size() == 1
cleanup:
settingsModule.closeSettingsModal()
}
然后继续。在我的模块中,我有:
void openSettingsModal() {
username.click()
settingsLink.click()
}
void closeSettingsModal() {
form.cancel().click()
}
我总是抱怨:"必须显示元素才能点击"。
在我的openSettingsModal和closeSettingsModal中,我尝试了许多waitFor与时间间隔的组合并使用是否存在......无法弄明白。
任何指针都将受到高度赞赏。谢谢!
答案 0 :(得分:6)
我认为主要区别在于,present会检查DOM中是否有元素,而显示的是对此元素可见性的检查。
请记住,webdriver模拟用户使用鼠标单击网站的实际体验,因此如果该元素对他们不可见,他们将无法点击它。
我想知道你的问题是否与首次加载页面时不在DOM中的settingsLink有关。如果您正在等待弹出对话框并在此对话框中显示实时链接,那么您可能想要设置类似
的内容content{
settingsLink( required: false ) { $( '...' }
settingsModal( required: false ) { $( '#modalDialog' ) }
}
你的等待应该看起来像
username.click()
waitFor{ settingsModal.displayed }
settingsLink.click()
我会坚持使用geb约定的书,只是一直使用显示。
答案 1 :(得分:4)
感谢您的回复。我实际上能够解决我的问题。
问题是模态窗口的动画为500毫秒。在我的测试中多次打开和关闭窗口使得它们成功/失败不一致。
我最终做的是挂钩插件提供的“显示”事件。我最终在模态中添加了一个“显示”类,并在1s内每100ms检查一次。
void openSettingsModal() {
username.click()
settingsLink.click()
waitFor (1, 0.1) { $("#settingsModal", class: "shown").size() == 1 }
}
void closeSettingsModal() {
form.cancel().click()
waitFor (1, 0.1) { $("#settingsModal", class: "shown").size() == 0 }
}
作为旁注,Chrome和Firefox中的测试失败但是在IE中传递!!我猜这是因为IE 8不支持我的测试通过的动画。
现在一切都很好。
我希望有一天能帮助别人!
答案 2 :(得分:0)
我们可以使用displayed
?
如果要移除或删除的特定元素,如果它仍然存在于DOM中但未显示在页面中,则可以使用assert thatelement.displayed == false
,这将确保该元素不会显示在页面中(但仍然它存在于DOM)
我们可以使用present
?
在上面的相同示例中,删除后,如果在DOM中找不到该元素,则应使用present进行验证
assert thatelement.present == false
希望你明白......
除此之外,现在在脚本执行中花费更多时间