使用 Protractor 处理下拉菜单
Handling Drop Down using Protractor
我在自动化过程中遇到了处理琐碎场景的问题。我需要 select 使用 Protractor 的特定选项。我正在将我想要 select 的选项的索引传递给 select,然后单击它 select。但是,我的 click()
方法出错,指出 click()
方法在该索引上未定义。
这是我想要做的 - 在我的 selectElements.js
文件中,下拉方法定义为
const selectElement={}
selectElement.selectElementDropdown =function(element,index,milliseconds){
console.log("Selecting element by drop down","OK");
element.all(by.tagName('option')).then(function(options){
options[2].click();
//here index 2 is hardcoded, which can be changed to options[index]
});
if(typeof milliseconds!=='undefined'){
browser.sleep(milliseconds);
}
}
module.exports =selectElement;
我使用的是 POM 结构,因此下拉方法位于单独的 .js
文件中。我在我的页面文件中调用它
const methodDropDown = require('../BasePage/selectElements.js');
var signUpBankDetails = function(){
this.bankName = element.all(by.css('.form-group')).get(7).element(by.xpath("//label[text()='Select Bank Name']"));
//the selector is clicked to open the drop down
console.log("Start of this block =========>");
this.selectDropDownMethod = function(){
console.log("Drop Down method start ==========>");
this.bankName.click();
browser.sleep(1000);
methodDropDown.selectElementDropdown(this.bankName,0,1000);
};
我收到错误消息 -
Failed: Cannot read property 'click' of undefined
this.bankName.click()
块工作正常,因为我可以看到元素被单击并出现下拉列表,但是 selection 似乎出错了。我还附上了下面的 HTML 代码片段 -
PS- 网页正在使用 Angular2.
当我查看 HTML 时,我发现 标签 不包含 select。 select 在 <div class="ui-helper-hidden-accessible">..</div>
中,与 标签 处于同一级别。
当我查看您的 PO 时,我看到您将 label (this.bankName
) 作为 ElementFinder methodDropDown.selectElementDropdown(this.bankName,0,1000);
。 methodDropDown.selectElementDropdown()
从您传递的 ElementFinder 开始搜索,那是 label
,而不是包含 [= 的 <div class="ui-helper-hidden-accessible">..</div>
40=].
也许你可以把它改成这样:
// Define ElementFinder for the bankname component
const bankNameComponent = $('p-dropdown[formcontrolename="bankname"]');
// Open the dropdown
bankNameComponent.$('label').click();
// Click on an element by index
bankNameComponent.$$('select option').get(2).click();
// Or search by text in the dropdown
bankNameComponent.element(by.cssContainingText('option', 'BNI')).click();
希望对您有所帮助
解决方案01
Select based on drop-down values attribute details
public selectOptionByValue(element: ElementArrayFinder,valueToSelect: string) : void{
let clickedIndex: number;
element.first().$$('option').filter(function(elem, index) {
return elem.getAttribute("value").then(function(value) {
if (value === valueToSelect) {
elem.click();
console.log('Yes ! Found option is:' + value);
}
return value === valueToSelect;
});
}).then(function (bool) {
}).catch(function (err) {
console.log('Ooops ! Error... '+err.message);
});
}
解决方案02
Select based on drop-down visible text details
public selectOptionByText(element: ElementArrayFinder,optionToSelect: string) : void{
let clickedIndex: number;
element.first().$$('option').filter(function(elem, index) {
return elem.getText().then(function(text) {
if (text === optionToSelect) {
elem.click();
console.log('Yes ! Found option is:' + text);
}
return text === optionToSelect;
});
}).then(function (bool) {
}).catch(function (err) {
console.log('Ooops ! Error... '+err.message);
});
}
我在自动化过程中遇到了处理琐碎场景的问题。我需要 select 使用 Protractor 的特定选项。我正在将我想要 select 的选项的索引传递给 select,然后单击它 select。但是,我的 click()
方法出错,指出 click()
方法在该索引上未定义。
这是我想要做的 - 在我的 selectElements.js
文件中,下拉方法定义为
const selectElement={}
selectElement.selectElementDropdown =function(element,index,milliseconds){
console.log("Selecting element by drop down","OK");
element.all(by.tagName('option')).then(function(options){
options[2].click();
//here index 2 is hardcoded, which can be changed to options[index]
});
if(typeof milliseconds!=='undefined'){
browser.sleep(milliseconds);
}
}
module.exports =selectElement;
我使用的是 POM 结构,因此下拉方法位于单独的 .js
文件中。我在我的页面文件中调用它
const methodDropDown = require('../BasePage/selectElements.js');
var signUpBankDetails = function(){
this.bankName = element.all(by.css('.form-group')).get(7).element(by.xpath("//label[text()='Select Bank Name']"));
//the selector is clicked to open the drop down
console.log("Start of this block =========>");
this.selectDropDownMethod = function(){
console.log("Drop Down method start ==========>");
this.bankName.click();
browser.sleep(1000);
methodDropDown.selectElementDropdown(this.bankName,0,1000);
};
我收到错误消息 -
Failed: Cannot read property 'click' of undefined
this.bankName.click()
块工作正常,因为我可以看到元素被单击并出现下拉列表,但是 selection 似乎出错了。我还附上了下面的 HTML 代码片段 -
PS- 网页正在使用 Angular2.
当我查看 HTML 时,我发现 标签 不包含 select。 select 在 <div class="ui-helper-hidden-accessible">..</div>
中,与 标签 处于同一级别。
当我查看您的 PO 时,我看到您将 label (this.bankName
) 作为 ElementFinder methodDropDown.selectElementDropdown(this.bankName,0,1000);
。 methodDropDown.selectElementDropdown()
从您传递的 ElementFinder 开始搜索,那是 label
,而不是包含 [= 的 <div class="ui-helper-hidden-accessible">..</div>
40=].
也许你可以把它改成这样:
// Define ElementFinder for the bankname component
const bankNameComponent = $('p-dropdown[formcontrolename="bankname"]');
// Open the dropdown
bankNameComponent.$('label').click();
// Click on an element by index
bankNameComponent.$$('select option').get(2).click();
// Or search by text in the dropdown
bankNameComponent.element(by.cssContainingText('option', 'BNI')).click();
希望对您有所帮助
解决方案01
Select based on drop-down values attribute details
public selectOptionByValue(element: ElementArrayFinder,valueToSelect: string) : void{
let clickedIndex: number;
element.first().$$('option').filter(function(elem, index) {
return elem.getAttribute("value").then(function(value) {
if (value === valueToSelect) {
elem.click();
console.log('Yes ! Found option is:' + value);
}
return value === valueToSelect;
});
}).then(function (bool) {
}).catch(function (err) {
console.log('Ooops ! Error... '+err.message);
});
}
解决方案02
Select based on drop-down visible text details
public selectOptionByText(element: ElementArrayFinder,optionToSelect: string) : void{
let clickedIndex: number;
element.first().$$('option').filter(function(elem, index) {
return elem.getText().then(function(text) {
if (text === optionToSelect) {
elem.click();
console.log('Yes ! Found option is:' + text);
}
return text === optionToSelect;
});
}).then(function (bool) {
}).catch(function (err) {
console.log('Ooops ! Error... '+err.message);
});
}