使用 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
我最熟悉的是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