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

ont*_*ntk 7 grails functional-testing spock geb

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

显示和现在有什么区别?

例如,我有:

settingsModule.container.displayed and settingsModule.container.present
Run Code Online (Sandbox Code Playgroud)

其中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()
    }
Run Code Online (Sandbox Code Playgroud)

等等.在我的模块中,我有:

    void openSettingsModal() {                  
        username.click()
        settingsLink.click()            
    }

void closeSettingsModal() {
        form.cancel().click()       
    }
Run Code Online (Sandbox Code Playgroud)

我总是抱怨:"必须显示元素才能点击".

在我的openSettingsModal和closeSettingsModal中,我尝试了许多waitFor与时间间隔的组合并使用present或not ...无法弄明白.

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

Tom*_*Lin 6

我认为主要的区别是,present会检查你的DOM中是否有一个元素,而显示检查这个元素的可见性.

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

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

content{
   settingsLink( required: false ) { $( '...' }
   settingsModal( required: false ) { $( '#modalDialog' ) }
}
Run Code Online (Sandbox Code Playgroud)

你的等待应该看起来像

username.click()
waitFor{ settingsModal.displayed }
settingsLink.click()
Run Code Online (Sandbox Code Playgroud)

我会坚持使用geb约定书,并且只是一直使用显示.

Geb Manual - 确定可见性