7

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

显示和呈现有什么区别?

例如我有:

settingsModule.container.displayed and settingsModule.container.present

其中 settingsModule 代表我的模态窗口。

在测试我的模态窗口(来自 Twitter 引导程序的模态窗口)时,我通常这样做:

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 与时间间隔的组合以及是否使用存在......无法弄清楚。

任何指针将不胜感激。谢谢!

4

3 回答 3

6

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

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

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

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

你的等待应该看起来像

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

我会坚持使用 geb 约定书,并且一直使用 display 。

Geb 手册 - 确定可见性

于 2012-08-24T00:18:21.890 回答
4

感谢您的回复。我实际上能够解决我的问题。

问题是模态窗口的动画为 500 毫秒。在我的测试中多次打开和关闭窗口使它们不一致地成功/失败。

我最终做的是挂钩插件提供的“显示”事件。我最终为模态添加了一个“显示”类,并在 1 秒内每 100 毫秒检查一次。

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 不支持我的测试通过的动画。

现在一切都很好。

我希望有一天它会对某人有所帮助!

于 2012-08-24T19:21:59.017 回答
0

我们可以在哪里使用 displayed

如果您要删除或删除的特定元素,如果它仍然存在于 DOM 中且未显示在页面中,则可以使用 assertthatelement.displayed == false确保该元素未显示在页面中(但它仍然存在于 DOM 中)

我们可以在哪里使用present

同上例,移除后,如果在 DOM 中没有找到该元素,则应使用 present 进行验证

assert thatelement.present == false

希望你能理解....

除了上述之外,present 在脚本执行中需要更多时间

于 2016-09-04T11:27:48.417 回答