在Geb中,显示和现在之间有什么区别?

时间:2012-08-23 18:55:12

标签: grails functional-testing spock geb

我正在编写功能测试并处理淡入淡出的模态窗口。

显示和现在之间有什么区别?

例如我有:

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与时间间隔的组合并使用是否存在......无法弄明白。

任何指针都将受到高度赞赏。谢谢!

3 个答案:

答案 0 :(得分:6)

我认为主要区别在于,present会检查DOM中是否有元素,而显示的是对此元素可见性的检查。

请记住,webdriver模拟用户使用鼠标单击网站的实际体验,因此如果该元素对他们不可见,他们将无法点击它。

我想知道你的问题是否与首次加载页面时不在DOM中的settingsLink有关。如果您正在等待弹出对话框并在此对话框中显示实时链接,那么您可能想要设置类似

的内容
content{
   settingsLink( required: false ) { $( '...' }
   settingsModal( required: false ) { $( '#modalDialog' ) }
}

你的等待应该看起来像

username.click()
waitFor{ settingsModal.displayed }
settingsLink.click()

我会坚持使用geb约定的书,只是一直使用显示。

Geb Manual - Determining visibility

答案 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

希望你明白......

除此之外,现在在脚本执行中花费更多时间