使用 Protractor 按文本选择

Selecting by text with Protractor

我最熟悉的是java selenium,我对JS和Protractor都是新手。假设我正在尝试从具有公共标识符的选项列表中单击一个选项..

var options = $('.options');

我怎样才能获得具有该公共标识符的所有元素,然后 select 通过其文本获得一个元素?我不能像在 java 中那样做 driver.findElements,因为没有对驱动程序的引用..

这是我迄今为止尝试过的方法,但它不起作用,我认为这是由于我对 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();
};

Select 具有共同标识符的所有元素:$$('.options'); 这将选择具有 .options 的 class 的所有元素——相当于 element.all(by.css('.options'))。 returns ElementArrayFinder. Also see .get() 说明如何从 ElementArrayFinder 按索引选择元素。

按文字查找,可以使用cssContainingText(css, text)。例如, var loginBtn = element(by.cssContainingText('button.ng-scope', 'Login'));

但如果出于某种原因这些未提供预期结果,您可以在 ElementArrayFinder 上使用 .filter() (docs here) 来遍历元素数组并根据您指定的条件。例如,

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();
};

使用 cssContainingText

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

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