2016-07-03 3 views
0

Ні! Это мой первый вопрос.Как переключить вкладки начальной загрузки в функциональном тесте Geb в grails?

Я использую grails 3.1.7 и встроенный Spock с Geb.

Я пытаюсь переключиться между двумя вкладками начальной загрузки внутри одной и той же страницы, чтобы избежать исключения ElementNotVisibleException.

Вот код (с несколькими строками опущена):

Markup:

<ul class="nav nav-tabs"> 
    <li class="${registerActive ? '' : 'active'}"><a data-toggle="tab" href="#login">...</a></li> 
    <li class="${registerActive ? 'active' : ''}"><a id="registerTab" data-toggle="tab" href="#register">...</a></li> 
</ul> 

<div class="tab-content"> 
    <div id="login" class="tab-pane fade ${registerActive ? '' : 'in active'}"> 
     <g:form ...> 
      <div> 
       <g:field type="email" name="username" /> 
      </div> 
      ... 
     </g:form> 
    </div> 

    <div id="register" class="tab-pane fade ${registerActive ? 'in active' : ''}"> 
     <g:form ...> 
      <div> 
       <g:field type="email" name="email"/> 
      </div> 
      ... 
     </g:form> 
    </div> 
</div> 

Тест:

void "register"() { 
    when:"user logged in" 
    register '[email protected]', 'passW0rd!' ... 

    then: ... 
} 

    private register(String email, String password ...) { 
    go "/" 
    $('#registerTab').click() 
    $('input[name=email]').value(email) 
    $('input[name=password]').value(password) 
    ... 
    $('input[name=register]').click() 
} 

Попытка доступа поле "E-mail" вызывает ElementNotVisibleException.

Я также попытался добавить и удалить active класс, используя свойство jquery.

Но без результата форма по-прежнему остается невидимой для Geb.

Что я делаю неправильно? Можно ли предложить правильный способ переключения между двумя вкладками внутри отдельной страницы?

Спасибо!

+0

Вы можете показать код? –

+0

Добавлены несколько фрагментов кода, пытающихся опустить ненужные. –

ответ

0

Я думаю, что вы сталкиваетесь с этой проблемой, потому что для отображения вкладки требуется некоторое время.

Как описано здесь - http://www.gebish.org/async

асинхронность

Современные веб-страницы пестрят асинхронных операций, таких как AJAX запросов и анимации. Geb обеспечивает встроенную поддержку этого факта жизни.

Любой поиск содержимого или операция могут быть завернуты в предложение waitFor.

В вашем случае, это должно быть что-то вроде:

go "/" 
$('#registerTab').click() 
waitFor { 
    $('input[name=email]').value(email) 
} 
+0

Определенно нет. Sleeps или waitFor не помогает, элемент по-прежнему остается невидимым. Кажется, что вкладка не переключается из-за того, что JavaScript отключен. Но когда я включаю его, у меня возникают проблемы с такими выражениями, как _go "/" _. Единственное решение, которое сработало для меня, заключалось в явном добавлении класса ** active ** в div с необходимой формой. Но это уродливо. Вероятно, я разлюблю регистрацию и регистрацию форм на разные страницы с разными URL-адресами. –

+0

Похоже, что проблема связана с проблемами с поддержкой javascript драйвером HtmlUnit. –

0

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

function changeTabs(tabNumber) { 
    $('a[href$="container' + tabNumber + '"]').tab('show'); 
} 

Тогда в моем Геба теста, я изменил вкладку с помощью следующей строки:

js.changeTabs('3') 

Это работает с ChromeDriver, который является то, что мы используем.

+0

Вы разместили эту функцию в своем производственном коде? –

+0

На самом деле, я завернул его в выражении «if». Он не генерируется, если только он не является тестовой средой. – javatami