Ответ 1
Вам не нужно два щелчка, чтобы выбрать параметр, просто нажмите на опцию напрямую. Что-то вроде,
driver.findElement(wd.By.css('#month>option[title=\'November\']')).click();
У меня есть раскрывающийся список, который я бы хотел выбрать, используя WebDriverJS. Я посмотрел руководство пользователя ниже и не смог узнать, как это сделать.
Я даже попробовал несколько вещей, которые были задокументированы для версии Java следующим образом:
webdriver.Select(driver.findElement(webdriver.By.id("vote"))).selectByValue("5")
И он просто говорит, что "Выбрать" не существует.
Я прошел через источник и до сих пор не могу найти ничего, что могу использовать.
Вам не нужно два щелчка, чтобы выбрать параметр, просто нажмите на опцию напрямую. Что-то вроде,
driver.findElement(wd.By.css('#month>option[title=\'November\']')).click();
Я поделился функцией, чтобы выбрать раскрывающийся элемент с текстом здесь.
Код:
function selectOption(selector, item){
var selectList, desiredOption;
selectList = this.findElement(selector);
selectList.click();
selectList.findElements(protractor.By.tagName('option'))
.then(function findMatchingOption(options){
options.some(function(option){
option.getText().then(function doesOptionMatch(text){
if (item === text){
desiredOption = option;
return true;
}
});
});
})
.then(function clickOption(){
if (desiredOption){
desiredOption.click();
}
});
}
использовать с:
driver.selectOption = selectOption.bind(driver);
driver.selectOption(webdriver.By.id('my-dropdown'), 'My Value');
Я использую webdriverjs и хочу выбрать опцию по индексу, так же как:
driver.click('#my_select_box').click('#my_select_box option:nth-child(3)')
driver.findElement({id: 'myDropDown'});// select dropdown element you wish to select
driver.sleep(1000);//not necessary
driver.findElement({id: 'myDropDown'}).sendKeys('name_of_option');//sending keys automatically fills dropdown with desired option
Отправка ключей на выпадающий элемент была бы достаточной в этом случае, например;
driver.findElement(by.id('vote')).sendKeys('5');
Когда в отображаемом тексте есть пробел, веб-драйверу нужно сосредоточиться больше, поэтому простое добавление функций щелчка решит эту проблему;
var ddlElement = driver.findElement(by.id('vote'));
ddlElement.click();
ddlElement.sendKeys('5');
ddlElement.click();
Это должно быть достигнуто
selectElem = driver.findElement(webdriver.By.id("vote"))
selectElem.click()
selectElem.findElement(webdriver.By.css("option[value='5']")).click()
Некоторые браузеры были очень сложными с выпадающими списками. Я получил некоторые идеи и собрал java-метод, используя JS-инъекцию, которая может работать для некоторых из вас, кто сталкивается с этим. Да, проблемы со временем исправляются, но это полезно для тех, кому поручено сертифицировать старые браузеры. Надеюсь, это поможет, потому что это может быть очень неприятно!
public void getJSDropdown(String dropDown, String elementID)throws Exception{
JavascriptExecutor executor = (JavascriptExecutor)driver;
String dropdownScript = "var select = window.document.getElementById('" +
dropDown +
"'); for(var i = 0; i < select.options.length; i++){if(select.options[i].text == '" +
elementID +
"'){ select.options[i].selected = true; } }";
Thread.sleep(2000);
executor.executeScript(dropdownScript);
Thread.sleep(2000);
String clickScript = "if ("+"\"createEvent\""+" in document) {var evt = document.createEvent("+"\"HTMLEvents\""+"); evt.initEvent("+"\"change\""+", false, true); " + dropDown + ".dispatchEvent(evt); } else " + dropDown + ".fireEvent("+"\"onchange\""+");";
executor.executeScript(clickScript);
}
driver.click('//*[@id="vote"]/option[3]')
Ссылка: fooobar.com/questions/794338/...
Это будет работать для меня (coffeescript)
selectList.findElements(By.tagName("option")) =
.then (options) ->
len = options.length #getting number of options in the select
driver.wait => #verify all promises finished
for option in options
option.getText()
.then (text) =>
console.log(len)
len -= 1
console.log(text)
if len is 0
true
, 10000
Я использовал ES6:
let select = driver.findElement(By.css("select"));
let options = select.findElements(By.css("option"));
options.then(values => {
return Promise.all(values.map(el => el.getText())).then(optTexts => {
return values[optTexts.indexOf('Some option text')].click();
});
});
используйте xpath, подобный этому
await driver.findElement(By.xpath('//[@id="newEventOffices"]/option[3]')).click();
Найдите элемент select и нажмите на него, чтобы отобразить раскрывающийся список
driver.findElement(//div//select[@id="elementId"]).click();
Затем выберите один из вариантов и нажмите на него. Я думаю, что выбор по xpath действительно будет работать лучше здесь.
driver.findElement(By.xpath('//div//select[@id="elementId"]//option[optionIndex]')).click();
Следующий код определяет доступные селектора в WebDriverJS:
webdriver.Locator.Strategy = {
'className': webdriver.Locator.factory_('class name'),
'class name': webdriver.Locator.factory_('class name'),
'css': webdriver.Locator.factory_('css selector'),
'id': webdriver.Locator.factory_('id'),
'js': webdriver.Locator.factory_('js'),
'linkText': webdriver.Locator.factory_('link text'),
'link text': webdriver.Locator.factory_('link text'),
'name': webdriver.Locator.factory_('name'),
'partialLinkText': webdriver.Locator.factory_('partial link text'),
'partial link text': webdriver.Locator.factory_('partial link text'),
'tagName': webdriver.Locator.factory_('tag name'),
'tag name': webdriver.Locator.factory_('tag name'),
'xpath': webdriver.Locator.factory_('xpath')
};
goog.exportSymbol('By', webdriver.Locator.Strategy);
Источник: https://code.google.com/p/selenium/source/browse/javascript/webdriver/locators.js
На самом деле это не щелчок по опции, но на самом деле он ее выбирает.