В Geb, в чем разница между отображаемым и присутствующим?

Я пишу функциональные тесты и имею дело с модальным окном, которое появляется и исчезает.

В чем разница между отображаемым и присутствующим?

Например, у меня есть:

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 с временным интервалом и с использованием настоящего или нет ... Не могу понять.

Любые указатели будут высоко оценены. Спасибо!


person ontk    schedule 23.08.2012    source источник


Ответы (3)


Я думаю, что основное отличие состоит в том, что present будет проверять наличие элемента в вашей DOM, тогда как display проверяет видимость этого элемента.

Помните, что веб-драйвер имитирует реальный опыт пользователя, использующего веб-сайт и щелкающего мышью, поэтому, если элемент не виден им, они не смогут щелкнуть по нему.

Интересно, связана ли ваша проблема с тем, что settingsLink не находится в DOM при первой загрузке страницы. Если вы ждете всплывающего диалогового окна и ссылки, которая будет жить в этом диалоговом окне, то вы, вероятно, захотите установить что-то вроде

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

ваше ожидание должно выглядеть примерно так

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

Я бы придерживался книги соглашений geb и просто использовал display все время.

Руководство Geb — Определение видимости

person Tomas Lin    schedule 24.08.2012
comment
Я попробовал ваше решение, но оно не сработало. Предложенное мной решение идет в том же направлении с некоторыми изменениями. Благодарю вас! - person ontk; 25.08.2012

Спасибо за ваш ответ. Я действительно смог решить свою проблему.

Проблема заключалась в том, что модальное окно имело анимацию 500 мс. Открытие и закрытие окна несколько раз в моих тестах приводило к их непостоянному успеху или неудаче.

В итоге я перехватил событие "показ", предоставленное плагином. В итоге я добавил в модальный класс «показанный» и проверял его каждые 100 мс в течение 1 с.

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 не поддерживает анимацию, которую проходили мои тесты.

Теперь все хорошо.

Я надеюсь, что это поможет кому-то когда-нибудь!

person ontk    schedule 24.08.2012
comment
Вы также можете использовать функцию isDisplayed() вот так waitFor (1, 0.1) { $("#settingsModal").isDisplayed() } - person Max Barrass; 03.03.2019

Где мы можем использовать displayed?

Если определенный элемент вы удаляете или удаляете, если он все еще находится в DOM и не отображается на странице, вы можете использовать assert thatelement.displayed == false, который гарантирует, что этот элемент не отображается на странице (но все еще присутствует в DOM)

Где мы можем использовать present?

В том же примере, что и выше, после удаления, если элемент не найден в DOM, вы должны использовать его для проверки.

assert thatelement.present == false

Надеюсь ты понимаешь....

В дополнение к вышесказанному, настоящее время выполнения скрипта занимает больше времени.

person Rajan    schedule 04.09.2016