2013-08-20 3 views
6

У меня есть частичный с ВЫБ.2 элемента с использованием Угловое UI http://angular-ui.github.io/Angularjs Е2Е Тестирование с помощью радиально-UI Выбор2 Element

Проблема Я бегу в том, что требуется элемент, и, хотя я успешно установить поле через следующий код, требуемый атрибут не удаляется, поскольку модель Angular не должна обновляться из-за внешнего изменения, и я не уверен, как либо предоставить $ scope.apply(), либо использовать другую функцию Angular для продолжения теста.

Во-первых, чтобы обеспечить прямые функции JQuery для запуска: (взято из How to execute jQuery from Angular e2e test scope?)

angular.scenario.dsl('jQueryFunction', function() { 
return function(selector, functionName /*, args */) { 
    var args = Array.prototype.slice.call(arguments, 2); 
    return this.addFutureAction(functionName, function($window, $document, done) { 
     var $ = $window.$; // jQuery inside the iframe 
     var elem = $(selector); 
     if (!elem.length) { 
      return done('Selector ' + selector + ' did not match any elements.'); 
     } 
     done(null, elem[functionName].apply(elem, args)); 
    }); 
}; 
}); 

Затем изменить значение поля:

jQueryFunction('#s2id_autogen1', 'select2', 'open'); 
    jQueryFunction('#s2id_autogen1', 'select2', "val", "US"); 
    jQueryFunction('#s2id_autogen1', 'select2', 'data', {id: "US", text: "United States"}); 
    jQueryFunction('.select2-results li:eq(3)', 'click'); 
    jQueryFunction('#s2id_autogen1', 'trigger', 'change'); 
    jQueryFunction('#s2id_autogen1', 'select2', 'close'); 
    input('request._countrySelection').enter('US'); 

Заметьте, что не все из этих функций, необходимых для отражают изменения в ui, просто все, что я использовал, чтобы попытаться получить эту работу ...

ответ

2

Мне не удалось заставить это работать в рамках кармы t однако это стало значительно проще в комплекте для проверки транспортира.

Для достижения этой цели в пределах испытательного транспортира свиты я использовал следующее, чтобы выбрать первое ВЫБ.2 поле на странице и выберите первый вариант в пределах этого блока:

var select2 = element(by.css('div#s2id_autogen1')); 
select2.click(); 
var lis = element.all(by.css('li.select2-results-dept-0')); 
lis.then(function(li) { 
    li[0].click(); 
}); 

Следующая Выбор2 на странице имеет идентификатор s2id_autogen3

+2

если элемент имеет атрибут ID, то ДИВ создатель выбор2 будет s2id_

0

Я заработал под Кармой со следующими изменениями.

Добавить следующий DSL в верхней части э2э тестового файла:

angular.scenario.dsl('jQueryFunction', function() { 
    return function(selector, functionName /*, args */) { 
    var args = Array.prototype.slice.call(arguments, 2); 
    return this.addFutureAction(functionName, function($window, $document, done) { 
     var $ = $window.$; // jQuery inside the iframe 
     var elem = $(selector); 
     if (!elem.length) { 
     return done('Selector ' + selector + ' did not match any elements.'); 
     } 
     done(null, elem[functionName].apply(elem, args)); 
    }); 
    }; 
}); 

Затем изменить ВЫБ.2 значение в вашем использовании сценария

it('should narrow down organizations by likeness of name entered', function() { 
    jQueryFunction('#s2id_physicianOrganization', 'select2', 'open'); 
    jQueryFunction('#s2id_physicianOrganization', 'select2', 'search', 'usa'); 
    expect(element('div.select2-result-label').count()).toBe(2); 
}); 
0

Иногда Выбор2 может занять некоторое время для загрузки, особенно когда работа с данными, загруженными ajax. Поэтому при использовании транспортира, и расширение на ответ Брайана, вот метод, который я нашел, чтобы быть надежным:

function select2ClickFirstItem(select2Id) { 
    var select2 = element(by.css('div#s2id_' + select2Id)); 
    select2.click(); 
    var items = element.all(by.css('.select2-results-dept-0')); 
    browser.driver.wait(function() { 
     return items.count().then(function (count) { 
      return 0 < count; 
     }) 
    }); 
    items.get(0).click(); 
} 

Это использует тот факт, что driver.wait can take a promise as a result.

5

Чтобы получить эту работу, я консультировался как ответ и sinelaw Брайана, но он по-прежнему не в моем случае по двум причинам:

  1. щелкнув на «сОн # s2id_autogen1» не открывает вход ВЫБ.2 для меня, селектор, который я использовал, был «div # s2id_autogen1 a»
  2. Получение элемента select2 Я бы получил ElementNotVisibleError, возможно потому, что мой select2 находится в модуле bootstrap, поэтому я явно жду, пока элемент будет видимым, прежде чем нажимать на него (вы можете прочитайте первоначальный намек, который я прочитал, чтобы использовать это here).

Результирующий код:

function select2ClickFirstItem(select2Id) { 
     var select2Input; 

     // Wait for select2 element to be visible 
     browser.driver.wait(function() { 
      select2Input = element(by.css('#s2id_' + select2Id + ' a')); 
      return select2Input; 
     }).then(function() { 
      select2Input.click(); 

      var items = element.all(by.css('.select2-results-dept-0')); 
      browser.driver.wait(function() { 
       return items.count().then(function (count) { 
        return 0 < count; 
       }); 
      }); 
      items.get(0).click(); 
     }); 
    } 

Надеется, что это помогает.

2

Я буду вторым, что сказал, что если @ Брайан использовать транспортир и новая карма это работает для меня:

function uiSelect(model, hasText) { 
    var selector = element(by.model('query.cohort')), 
     toggle = selector.element(by.css('.ui-select-toggle')); 

    toggle.click(); 

    browser.driver.wait(function(){ 
     return selector.all(by.css('.ui-select-choices-row')).count().then(function(count){ 
      return count > 0; 
     }); 
    }, 2000); 

    var choice = selector.element(by.cssContainingText('.ui-select-choices-row',hasText)); 
    choice.click(); 
}; 

использовать его как:

если значение элемента, который вы хотите выберите «Q3 2013», вы можете предоставить ему модель селектора и точное или частичное совпадение текста элемента, который вы хотите выбрать.

uiSelect('query.cohort','Q3 2013'); 

или

uiSelect('query.cohort','Q3'); 

оба работают

 Смежные вопросы

  • Нет связанных вопросов^_^