Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Как выбрать значние с select (выпадающий список)

webdriver
selenide
Теги: #<Tag:0x00007fedbaa7a1e8> #<Tag:0x00007fedbaa7a030>

(stek) #1

Здравствуйте. Ищу с помощью сss selector, но

Element should be visible {#order_skill-styler > div.jq-selectbox__dropdown > ul > li:nth-child(2)}
Element: '<li value="0" displayed:false></li>'
 $(By.cssSelector ("#order_skill-styler > div.jq-selectbox__dropdown > ul > li:nth-child(2)")).click ();

(Остап Олексин) #2

Используйте один из методов для работы из селектами:

$().selectOption();
$().selectOptionByValue();
$().selectOptionContainingText();


(Дмитрий Мирошник) #3

У WebDriver есть специальный класс для работы с данным классов контролов. если ничё не путаю, Select.
В Selenide - ХЗ, скорее всего, есть что-то аналогичное. Если нет своего класса - используйте класс WebDriver’а, классы Selenide всё равно от него наследуются.


(stek) #4
Element not found {#order_skill-styler}
Expected: exist

 $("#order_skill-styler").selectOptionByValue("15");

(Остап Олексин) #5

Вам нужно указать локатор селекта - $("#order_skill").selectOptionByValue("15");


(stek) #6
org.openqa.selenium.ElementNotVisibleException: element not visible: Element is not currently visible and may not be manipulated


(Остап Олексин) #7

Ну посмотрите отображается ли элемент на странице, может по нему или по какому-то родительскому элементу нужно сначала кликнуть.


(stek) #8

Вот так у меня работает

$("#order_skill-styler > div.jq-selectbox__select").click ();
        $("#order_skill-styler > div.jq-selectbox__dropdown > ul > li:nth-child(2)").click ();

Но это наверное, не самый лучший вариант написания кода?)


(stek) #9

Подскажите пожалуйста, что же я не так делаю.

$(By.className (“service”)).selectOptionByValue (“2”);

Element should have been "select" but was "div"

(Fiodar Motin) #10

А зачем вы делаете выбор имени по имени класса?? это 2 разные вещи.
Попробуйте
$(By.name(“service”)).selectOptionByValue (“2”);


(stek) #11
Element should be visible {By.name: service}
Element: '<select class="select_field" name="service" type="select-one" value="1" displayed:false></select>'

(Fiodar Motin) #12

Вы пробовали с ?

$(By.name("service")).selectOptionByValue ("2");

Если так хотите через имя класса то

$(By.className("select_field")).selectOptionByValue ("2");

(stek) #13

Пробывал два ваших варианта, вот ошибка

Element should be visible {By.name: service}
Element: '<select class="select_field" name="service" type="select-one" value="1" displayed:false></select>

(Fiodar Motin) #14

хмм странно, попробуйте повызывать разными методами типо вызов по тексту и т.д


(Nikitoz777) #15

делите свое веб приложение на слои или компоненты, так будет намного удобнее и проще обслуживать код. вот мой фрагмент для работы с селектом из любого места, т.к. класс статик:

///


/// ‘Select’ webelement wrapper
///

public static class SelectFragment
{

    /// <summary>
    /// Checking default option if select element
    /// </summary>
    /// <param name="selectEl">SelectElement</param>
    /// <param name="text">defaul option</param>
    /// <returns></returns>
    public static SelectElement CheckSelectedOption(SelectElement selectEl, String text)
    {
        Assert.True(
            selectEl
                .SelectedOption.Text
                .Contains(text),
            "Default select option is:" + selectEl.SelectedOption.Text + " but expected: " + text);
        return selectEl;
    }

 

    /// <summary>
    /// FindSelectByFieldName
    /// </summary>
    /// <param name="text">fieldName</param>
    /// <returns></returns>
    public static SelectElement FindSelectByFieldName(string text)
    {
        return new SelectElement(SearchElementByXpath(
            $"//label[normalize-space()='{text}']/ancestor::*[contains(@class,'field')]//select"));
    }

    /// <summary>
    /// Select option by it's field name
    /// </summary>
    /// <param name="optionText">Option name</param>
    public static void SetOption(String optionText)
    {
        SelectElement selectEl = new SelectElement(SearchElementByXpath($"//option[normalize-space()='{optionText}']/ancestor::select"));
        selectEl.Options
            .SingleOrDefault(it => it.Text.Contains(optionText)).Click();

    }

    /// <summary>
    /// Select option by it's field name
    /// </summary>
    /// <param name="optionText">Option name</param>
    /// <param name="optGroup">Element that contains options</param>
    /// <param name="fieldName">Field Name</param>
    public static void SetOptionByFieldName(String fieldName, String optionText, string optGroup = null)
    {
        SelectElement selectEl = FindSelectByFieldName(fieldName);
        IWebElement option;


        option = optGroup.IsNullOrWhiteSpace()
            ? selectEl.Options
                .SingleOrDefault(it => it.Text.Contains(optionText))
            : selectEl.WrappedElement.FindElement(By.CssSelector(optGroup)).FindElements(By.CssSelector("option"))
                .SingleOrDefault(it => it.Text.Contains(optionText));

        option.Click();
    }
}