Как выбрать опцию в выпадающих тестах protractorjs e2e
Я пытаюсь выбрать параметр из раскрывающегося списка для тестов angular e2e, используя транспортир.
Вот фрагмент кода для опции выбора:
<select id="locregion" class="create_select ng-pristine ng-invalid ng-invalid-required" required="" ng-disabled="organization.id !== undefined" ng-options="o.id as o.name for o in organizations" ng-model="organization.parent_id">
<option value="?" selected="selected"></option>
<option value="0">Ranjans Mobile Testing</option>
<option value="1">BeaverBox Testing</option>
<option value="2">BadgerBox</option>
<option value="3">CritterCase</option>
<option value="4">BoxLox</option>
<option value="5">BooBoBum</option>
</select>
Я пробовал:
ptor.findElement(protractor.By.css('select option:1')).click();
Это дает мне следующую ошибку:
Указана недопустимая или недопустимая строка.
Информация о сборке: версия: '2.35.0', версия: 'c916b9d', время: '2013-08-12 15:42:01'
Системная информация: os.name: "Mac OS X", os.arch: 'x86_64', os.version: '10.9 ', java.version:' 1.6.0_65 '
Информация о драйвере: driver.version: неизвестно
Я также пробовал:
ptor.findElement(protractor.By.xpath('/html/body/div[2]/div/div[4]/div/div/div/div[3]/ng-include/div/div[2]/div/div/organization-form/form/div[2]/select/option[3]')).click();
Это дает мне следующую ошибку:
ElementNotVisibleError: элемент в настоящее время не виден и поэтому не может взаимодействовать с Длительность команды или тайм-аут: 9 миллисекунд Информация о сборке: версия: '2.35.0', версия: 'c916b9d', время: '2013-08-12 15:42:01' Системная информация: os.name: "Mac OS X", os.arch: 'x86_64', os.version: '10.9 ', java.version:' 1.6.0_65 ' Идентификатор сеанса: bdeb8088-d8ad-0f49-aad9-82201c45c63f Информация о драйвере: org.openqa.selenium.firefox.FirefoxDriver Возможности [{platform = MAC, acceptSslCerts = true, javascriptEnabled = true, browserName = firefox, rotatable = false, locationContextEnabled = true, version = 24.0, cssSelectorsEnabled = true, databaseEnabled = true, handlesAlerts = true, browserConnectionEnabled = true, nativeEvents = false, webStorageEnabled = true, applicationCacheEnabled = false, принимаетScreenshot = true}]
Может кто-нибудь помочь мне с этой проблемой или бросить какой-то свет на то, что я могу делать неправильно здесь.
Ответы
Ответ 1
У меня была похожая проблема, и в итоге я написал вспомогательную функцию, которая выбирает выпадающие значения.
В конце концов я решил, что у меня все в порядке, выбирая номер опции, и поэтому написал метод, который берет элемент и optionNumber и выбирает этот optionNumber. Если параметр optionNumber равен нулю, он ничего не выбирает (оставляя невыбранным выпадающее меню).
var selectDropdownbyNum = function ( element, optionNum ) {
if (optionNum){
var options = element.all(by.tagName('option'))
.then(function(options){
options[optionNum].click();
});
}
};
Я написал сообщение в блоге, если вы хотите получить более подробную информацию, оно также включает проверку текста выбранного параметра в раскрывающемся списке: http://technpol.wordpress.com/2013/12/01/protractor-and-dropdowns-validation/
Ответ 2
Для меня работала как шарм
element(by.cssContainingText('option', 'BeaverBox Testing')).click();
Надеюсь, что это поможет.
Ответ 3
Элегантный подход включал бы создание абстракции, аналогичной тому, что предлагают другие привязки языка селена из коробки (например, класс Select
в Python или Java).
Давайте сделаем удобную оболочку и скроем детали реализации внутри:
var SelectWrapper = function(selector) {
this.webElement = element(selector);
};
SelectWrapper.prototype.getOptions = function() {
return this.webElement.all(by.tagName('option'));
};
SelectWrapper.prototype.getSelectedOptions = function() {
return this.webElement.all(by.css('option[selected="selected"]'));
};
SelectWrapper.prototype.selectByValue = function(value) {
return this.webElement.all(by.css('option[value="' + value + '"]')).click();
};
SelectWrapper.prototype.selectByPartialText = function(text) {
return this.webElement.all(by.cssContainingText('option', text)).click();
};
SelectWrapper.prototype.selectByText = function(text) {
return this.webElement.all(by.xpath('option[.="' + text + '"]')).click();
};
module.exports = SelectWrapper;
Пример использования (обратите внимание, насколько он читаем и прост в использовании):
var SelectWrapper = require('select-wrapper');
var mySelect = new SelectWrapper(by.id('locregion'));
# select an option by value
mySelect.selectByValue('4');
# select by visible text
mySelect.selectByText('BoxLox');
Решение взято из следующей темы: Выберите → опция абстракция.
К вашему сведению, создан запрос объекта: выберите → опция абстракция.
Ответ 4
element(by.model('parent_id')).sendKeys('BKN01');
Ответ 5
Чтобы получить доступ к определенному параметру, вам необходимо указать селектор nth-child():
ptor.findElement(protractor.By.css('select option:nth-child(1)')).click();
Ответ 6
Вот как я сделал свой выбор.
function switchType(typeName) {
$('.dropdown').element(By.cssContainingText('option', typeName)).click();
};
Ответ 7
Вот как я это сделал:
$('select').click();
$('select option=["' + optionInputFromFunction + '"]').click();
// This looks useless but it slows down the click event
// long enough to register a change in Angular.
browser.actions().mouseDown().mouseUp().perform();
Ответ 8
Попробуй, он работает для меня:
element(by.model('formModel.client'))
.all(by.tagName('option'))
.get(120)
.click();
Ответ 9
Вы можете попробовать эту надежду, что он будет работать
element.all(by.id('locregion')).then(function(selectItem) {
expect(selectItem[0].getText()).toEqual('Ranjans Mobile Testing')
selectItem[0].click(); //will click on first item
selectItem[3].click(); //will click on fourth item
});
Ответ 10
Другой способ установки элемента опции:
var select = element(by.model('organization.parent_id'));
select.$('[value="1"]').click();
Ответ 11
Мы написали библиотеку, которая включает в себя 3 способа выбора варианта:
selectOption(option: ElementFinder |Locator | string, timeout?: number): Promise<void>
selectOptionByIndex(select: ElementFinder | Locator | string, index: number, timeout?: number): Promise<void>
selectOptionByText(select: ElementFinder | Locator | string, text: string, timeout?: number): Promise<void>
Дополнительная особенность этих функций заключается в том, что они ждут отображения элемента, прежде чем будет выполнено какое-либо действие по select
.
Вы можете найти его на npm @hetznercloud/protractor-test-helper. Типы для TypeScript также предоставляются.
Ответ 12
Возможно, не супер элегантный, но эффективный:
function selectOption(modelSelector, index) {
for (var i=0; i<index; i++){
element(by.model(modelSelector)).sendKeys("\uE015");
}
}
Это просто посылает ключ вниз по выбору, который вам нужен, в нашем случае мы используем modelSelector, но, очевидно, вы можете использовать любой другой селектор.
Затем в моей объектной модели страницы:
selectMyOption: function (optionNum) {
selectOption('myOption', optionNum)
}
И из теста:
myPage.selectMyOption(1);
Ответ 13
Чтобы выбрать элементы (параметры) с уникальными идентификаторами, например, здесь:
<select
ng-model="foo"
ng-options="bar as bar.title for bar in bars track by bar.id">
</select>
Я использую это:
element(by.css('[value="' + neededBarId+ '"]')).click();
Ответ 14
Проблема заключается в том, что решения, которые работают с регулярными блоками выбора angular, не работают с angular Material md-select и md-option с использованием транспортира. Этот был отправлен другим, но это сработало для меня, и я не могу прокомментировать его сообщение (всего 23 пункта). Кроме того, я немного очистил его, а не browser.sleep, я использовал browser.waitForAngular();
element.all(by.css('md-select')).each(function (eachElement, index) {
eachElement.click(); // select the <select>
browser.waitForAngular(); // wait for the renderings to take effect
element(by.css('md-option')).click(); // select the first md-option
browser.waitForAngular(); // wait for the renderings to take effect
});
Ответ 15
Там проблема с выбором опций в Firefox, что Droogans hack исправляет, что я хочу упомянуть здесь явно, надеясь, что это может сэкономить кому-то определенную проблему: https://github.com/angular/protractor/issues/480.
Даже если ваши тесты проходят локально с Firefox, вы можете обнаружить, что они терпят неудачу в CircleCI или TravisCI или что вы используете для развертывания CI и Осознание этой проблемы с самого начала могло бы сэкономить мне много времени:)
Ответ 16
Помощник для установки элемента option:
selectDropDownByText:function(optionValue) {
element(by.cssContainingText('option', optionValue)).click(); //optionValue: dropDownOption
}
Ответ 17
Если ниже приведено раскрывающееся меню -
<select ng-model="operator">
<option value="name">Addition</option>
<option value="age">Division</option>
</select>
Ответ 18
Выберите опцию по индексу:
var selectDropdownElement= element(by.id('select-dropdown'));
selectDropdownElement.all(by.tagName('option'))
.then(function (options) {
options[0].click();
});
Ответ 19
Мы хотели использовать элегантное решение там, используя материал angularjs, но он не работал, потому что в DOM на самом деле нет тегов опций/md-опций, пока не будет нажата кнопка md-select. Таким образом, "элегантный" способ не сработал для нас (обратите внимание на материал angular!) Вот что мы сделали для этого, не знаю, лучший ли он, но его определенно работающий сейчас
element.all(by.css('md-select')).each(function (eachElement, index) {
eachElement.click(); // select the <select>
browser.driver.sleep(500); // wait for the renderings to take effect
element(by.css('md-option')).click(); // select the first md-option
browser.driver.sleep(500); // wait for the renderings to take effect
});
Нам нужно было выбрать 4 выбора, и пока выбор будет открыт, на экране появится надпись для выбора следующего выбора. поэтому нам нужно подождать 500 мс, чтобы убедиться, что мы не сталкиваемся с проблемой материальных эффектов, которые все еще находятся в действии.
Ответ 20
Другой способ установки элемента опции:
var setOption = function(optionToSelect) {
var select = element(by.id('locregion'));
select.click();
select.all(by.tagName('option')).filter(function(elem, index) {
return elem.getText().then(function(text) {
return text === optionToSelect;
});
}).then(function(filteredElements){
filteredElements[0].click();
});
};
// using the function
setOption('BeaverBox Testing');
Ответ 21
----------
element.all(by.id('locregion')).then(function(Item)
{
// Item[x] = > // x is [0,1,2,3]element you want to click
Item[0].click(); //first item
Item[3].click(); // fourth item
expect(Item[0].getText()).toEqual('Ranjans Mobile Testing')
});
Ответ 22
Я травил сеть на ответ о том, как выбрать вариант в раскрывающемся списке модели, и я использовал эту комбинацию, которая помогла мне с материалом Angular.
element (by.model( "ModelName" )). click(). element (By.xpath('xpath location')). click();
кажется, что при метании кода в одной строке он мог найти элемент в выпадающем списке.
Ушло много времени на это решение. Я надеюсь, что это поможет кому-то.
Ответ 23
Вы можете выбрать варианты выпадающего списка по значению:
$('#locregion').$('[value="1"]').click();
Ответ 24
Я немного улучшил решение, написанное PaulL.
Прежде всего, я исправил код, совместимый с последним API-интерфейсом Protractor. И затем я объявляю функцию в разделе "onPrepare" конфигурационного файла Protractor в качестве члена экземпляра браузера, поэтому на него можно ссылаться на любую спецификацию e2e.
onPrepare: function() {
browser._selectDropdownbyNum = function (element, optionNum) {
/* A helper function to select in a dropdown control an option
* with specified number.
*/
return element.all(by.tagName('option')).then(
function(options) {
options[optionNum].click();
});
};
},
Ответ 25
Вот как это сделать по значению опции или по индексу. Этот пример немного грубоват, но показывает, как сделать то, что вы хотите:
HTML:
<mat-form-field id="your-id">
<mat-select>
<mat-option [value]="1">1</mat-option>
<mat-option [value]="2">2</mat-option>
</mat-select>
</mat-form-field>
TS:
function selectOptionByOptionValue(selectFormFieldElementId, valueToFind) {
const formField = element(by.id(selectFormFieldElementId));
formField.click().then(() => {
formField.element(by.tagName('mat-select'))
.getAttribute('aria-owns').then((optionIdsString: string) => {
const optionIds = optionIdsString.split(' ');
for (let optionId of optionIds) {
const option = element(by.id(optionId));
option.getText().then((text) => {
if (text === valueToFind) {
option.click();
}
});
}
});
});
}
function selectOptionByOptionIndex(selectFormFieldElementId, index) {
const formField = element(by.id(selectFormFieldElementId));
formField.click().then(() => {
formField.element(by.tagName('mat-select'))
.getAttribute('aria-owns').then((optionIdsString: string) => {
const optionIds = optionIdsString.split(' ');
const optionId = optionIds[index];
const option = element(by.id(optionId));
option.click();
});
});
}
selectOptionByOptionValue('your-id', '1'); //selects first option
selectOptionByOptionIndex('your-id', 1); //selects second option
Ответ 26
static selectDropdownValue(dropDownLocator,dropDownListLocator,dropDownValue){
let ListVal ='';
WebLibraryUtils.getElement('xpath',dropDownLocator).click()
WebLibraryUtils.getElements('xpath',dropDownListLocator).then(function(selectItem){
if(selectItem.length>0)
{
for( let i =0;i<=selectItem.length;i++)
{
if(selectItem[i]==dropDownValue)
{
console.log(selectItem[i])
selectItem[i].click();
}
}
}
})
}
Ответ 27
Как выбрать опцию в выпадающем тесте транспортира js e2e. Может ли кто-нибудь помочь мне здесь.
Афганистан Индия
Ответ 28
Выберите параметр с помощью свойства CSS
element(by.model("organization.parent_id")).element(by.css("[value='1']")).click();
или
element(by.css("#locregion")).element(by.css("[value='1']")).click();
Если locregion (id), organization.parent_id (имя модели) являются атрибутами выбранного элемента.
Ответ 29
Вы можете выбрать выпадающие опции, например:
element(by.xpath(
'//*[@id="locregion"]//option[contains(text(),"Ranjans Mobile Testing")]'
)).click();