Выделение по тексту с транспортиром

Я в основном знаком с java selenium, и я новичок как в JS, так и в Protractor. Допустим, я пытаюсь выбрать опцию из списка опций с общим идентификатором.

var options = $('.options');

Как мне получить все элементы с этим общим идентификатором, а затем выбрать один из них по его тексту? Я не могу сделать driver.findElements, как в java, так как нет ссылки на драйвер.

Это то, что я пробовал до сих пор, но это не работает, и я думаю, что это связано с моей неопытностью в JS.

this.selectCompanyCode = function(companyCode) {
    dropDownMenus[0].click();
    var companyCodeOptions = $('[ng-bind-html="companyCode"]');
    companyCodeOptions.filter(function (elem) {
        return elem.getText().then(function text() {
            return text === companyCode;
        });
    }).first().click();
};

person Tree55Topz    schedule 01.11.2016    source источник
comment
Вы видели мой ответ? Вы отредактировали свой вопрос после того, как я опубликовал свой ответ. Я только что добавил .click() к своему ответу, поэтому мой код должен делать то же самое, что и ваш код выше, за исключением того, что он не использует .each() для перебора всего массива, поскольку в этом нет необходимости. Если нет, добавьте комментарий, что не работает... пытаюсь вам помочь.   -  person Gunderson    schedule 02.11.2016
comment
@ Гандерсон, я видел твой ответ. Просто не хотел втискивать этот сегмент кода в раздел комментариев. Я обновил свой код в своем сообщении до того, на что я изменил его по вашему предложению, однако теперь я получаю сообщение о невозможности чтения свойства «щелчок» неопределенной ошибки. Может быть, это то, как я пытаюсь передать параметр companyCode?   -  person Tree55Topz    schedule 02.11.2016
comment
Почти уверен, что эта ошибка связана с dropDownMenus[0].click(); Обычно вы должны использовать .get() для извлечения элемента по индексу из ElementArrayFinder (см. ссылку в моем ответе ниже). Но также у вас нет ссылки на dropDownMenus в этой функции. Это глобальная переменная? Если нет, то это определенно не определено. Вам также может понадобиться оператор возврата из companyCodeOptions.filter. Итак, return companyCodeOptions.filter(...)   -  person Gunderson    schedule 02.11.2016


Ответы (2)


Выбрать все элементы с общим идентификатором: $$('.options'); При этом выбираются все элементы с классом .options -- эквивалент element.all(by.css('.options')). Это возвращает ElementArrayFinder. Также см. .get(), чтобы узнать, как выбрать элемент. по индексу из ElementArrayFinder.

Найдите по тексту, вы можете использовать cssContainingText(css, text). Например, var loginBtn = element(by.cssContainingText('button.ng-scope', 'Login'));

Но если по какой-то причине они не дают ожидаемых результатов, вы можете использовать .filter() (документы здесь) в ElementArrayFinder, чтобы просмотреть массив элементов и найти элемент на основе заданного вами условия. Например,

var allOptions = $$('.options');
allOptions.filter(function (elem) {
    return elem.getText().then(function (text) {
        return text === 'What you want';
    });
}).first().click();

И хотя я никогда не использовал обычный Java Selenium (поэтому я не знаю, то же ли это), но ссылка browser (и, следовательно, функция findElements) действительно есть: http://www.protractortest.org/#/api?view=ProtractorBrowser.

Надеюсь, поможет!

Изменить:

Используя ваш код:

this.selectCompanyCode = function(companyCode) {
    // where is dropDownMenus defined?  This has function no reference to it.
    dropDownMenus.get(0).click(); // should be this
    var companyCodeOptions = $$('[ng-bind-html="' + companyCode + '"]');
    return companyCodeOptions.filter(function (elem) {
        return elem.getText().then(function text() {
            return text === companyCode;
        });
    }).first().click();
};

второе изменение: если код компании уникален, вам, вероятно, не нужно использовать фильтр. Попробуй это:

this.selectCompanyCode = function(companyCode) {
    dropDownMenus.get(0).click();
    var companyCodeOptions = $('[ng-bind-html="' + companyCode + '"]');
    return companyCodeOptions.click();
};
person Gunderson    schedule 01.11.2016
comment
dropDownMenus — это локатор, который я определил, var dropDownMenus = $$('.select2-choice.ui-select-match.ng-scope'); Я вижу, что мне не хватало оператора return, позвольте мне попробовать. Спасибо за помощь! - person Tree55Topz; 02.11.2016
comment
он говорит, что companyCodeOptions.filter не является функцией - person Tree55Topz; 02.11.2016
comment
@Tree55Topz Tree55Topz, извините, я не заметил, что companyCodeOptions был определен как один элемент, я изменил его, чтобы использовать $$, поэтому он создает массив элементов. Также см. мое второе редактирование, не уверен, что в этом случае даже необходимо использовать filter(). - person Gunderson; 02.11.2016
comment
companyCode на самом деле является идентификатором, который они все разделяют. Но фактический текст в раскрывающемся списке — это то, что я пытаюсь передать, чтобы щелкнуть. Так, например, есть 3 варианта. Все используют этот идентификатор, ng-bind-html=companyCode. Если бы я сделал .getText для ng-bind-html=companyCode[0], он бы отличался от текста, который я получил бы из [1]. это фактическое значение .getText - это то, что я пытаюсь использовать для его выбора. Таким образом, в html это выглядит как ‹div class=whatever ng-bind-html=comanyCode›Buddys Pizza‹/div› .... Buddys Pizza — это то, что я бы передал, потому что это текст опции, которую я хочу - person Tree55Topz; 02.11.2016
comment
извините за путаницу, ха-ха ›.‹ - person Tree55Topz; 02.11.2016
comment
О, тогда вы можете просто использовать cssContainingText? var companyCodeOptions = element(by.cssContainingText('div', 'Buddys Pizza')); - person Gunderson; 02.11.2016
comment
Так еще не пробовал, но попробую. Я действительно хотел сделать это по-другому, потому что я думаю, что это лучшая практика, и это поможет мне лучше понять JS. - person Tree55Topz; 02.11.2016

Используйте cssContainingText

element(by.cssContainingText(".option", "text")).click();

http://www.protractortest.org/#/api?view=ProtractorBy.prototype.cssContainingText

person mvndaai    schedule 14.11.2016