2015-08-21 3 views
1

Я занимаюсь сайтом angularjs. Там есть панель поиска, которая выполняет исследование любых изменений в поле, если длина строки превосходит 2 символа.Trigger the ng-change

В любом случае. С помощью Protractor я использую sendKeys для ввода имени, ожидая начала поиска, но я не могу получить никаких результатов. Если я делаю это вручную, он работает нормально. Вот более или менее часть коды я использую, чтобы ввести в своем исследовании:

describe('Search Field', function(){ 

    browser.get('https://docs.angularjs.org/api'); 
    it('displays a frame with the results of the search', function(){ 
    var searchField = element(by.css('.search-query')); 
    var searchResult= element(by.css('.search-results-container')); 
    searchField.click(); 
    searchField.sendKeys('angular'); 

    //I use a wait function here to wait for the results 
    browser.wait(function() { 
      return searchResult.isDisplayed(); 
     },10000);   
    //Before doing anything else, I expect to see the results 
    expect(searchResult.isPresent()).toBe(true); 
    expect(searchResult.isDisplayed()).toBe(true); 
    }); 
}); 

и код searchfield является:

<input type="text" name="as_q" class="search-query ng-valid ng-touched ng-dirty ng-valid-parse" placeholder="Click or press/to search" ng-focus="focus=true" ng-blur="focus=false" ng-change="search(q)" ng-model="q" docs-search-input="" autocomplete="off" style=""> 

кажется, что функция seach(q) никогда не выполняется с транспортиром.

У вас есть идея причины этой проблемы?

редактировать:

мне удалось поиск фрейм результата появляются с помощью оценки(). Код становится:

describe('Search Field', function(){ 

    browser.get('https://docs.angularjs.org/api'); 
    it('displays a frame with the results of the search', function(){ 
    var searchField = element(by.css('.search-query')); 
    var searchResult= element(by.css('.search-results-container')); 
    searchField.click(); 
    topBanner.searchField.evaluate('search("angular")'); 

    //I use a wait function here to wait for the results 
    browser.wait(function() { 
      return searchResult.isDisplayed(); 
     },10000);   
    //Before doing anything else, I expect to see the results 
    expect(searchResult.isPresent()).toBe(true); 
    expect(searchResult.isDisplayed()).toBe(true); 
    }); 
}); 

Но странно то, что если я оставляю SendKeys команда() до того, как оценить, то результаты поиска не будут отображаться.

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

+0

Попробуйте searchField.blur() - может быть, поле не теряет фокус после ввода текста. (просто мысль) – sirrocco

+0

Я просто попытался размыть или щелкнуть по другому элементу, но результата нет. – Majuj

+0

У меня нет хорошего ответа для вас, но я нашел эту статью, которая, я думаю, могла бы помочь вам на правильном пути: http://iswwwup.com/t/6484d98c7426/how-to-trigger -ng-change-in-directive-test-in-angularjs.html – SamHuckaby

ответ

0
searchField.value('angular'); 
searchField.trigger('input'); 

после этого вам нужно

$scope.$apply(); 
+0

Я пробовал эти строки в качестве аргументов для оценки (я хочу сохранить синтаксис Jasmine), но это не работает. – Majuj

+0

Что вы подразумеваете под синтаксисом Jasmine, Jasmine - только JavaScript. И ваш код кажется неполным. Где вы добавляете зависимости? – atinder

+0

Я выполняю Транспортир напрямую, он заботится о зависимостях. Также он обертывает WebdriverJS и использует некоторый синтаксис Jasmine в коде (описать, это ...). Вот почему я не могу напрямую использовать то, что вы написали. Я должен инкапсулировать это. Я попытался оценить (..), но он ничего не делает. Теперь я пытаюсь использовать browser.executeScript (...), но это не распознает $ scope. Я новичок в Javascript и Protractor, поэтому простите меня, если я использую неправильные термины. – Majuj