Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Работа с Kendo combobox (как с ним быть?)


(Alex Shats) #1

Есть такая штука как Telerik Kendo, и есть у них такой контроль не обычный как combobox.
Возникла проблемка как реализовать на него select и как получить список всех опций этого combobox.
Кто то работал с ним?
Вот кстати он сам, если кто захочет помочь: http://demos.telerik.com/kendo-ui/combobox/index


(Руслан) #2

может поможет:

  1. https://gist.github.com/enepomnyaschih/5847929

  2. http://www.code-thrill.com/2012/04/integrating-jquery-with-selenium.html


(Alex Shats) #3

О, классная ссылка. Как раз искал полезный материал по использованию JS в Селениум.
JS к сожалению пока что не знаю.
Если есть у кого еще подобные примеры на JS, буду рад.


(vmaximv) #4

А зачем тут js и jQuery? Вполне себе нормальный контрол с адекватными локаторами. В чем сложность то?


(Александр Таранков) #5

Глянул мельком. Проще всего, на мой взгляд, с этим контролом работать как с текстовым полем - он позволяет вводить текст. Если нет задачи тестировать сам контрол, а только вводить с его помощью инфу в страницу, то я бы так и делал, чтоб не заморачиваться с этими раскрывашками/закрывашками/всплывашками


(Шевченко Владислав) #6

(Шевченко Владислав) #7

Насколько я помню, там проблема возникала тогда, когда мы не знаем какие значения есть внутри.

в этом случае я выбирал значение через JS по номеру

вот пример:

public void setExistingValue(String itemNumber){

        executeJavaScript("var q=$('#"+selectId+"').data('kendoDropDownList');" +
                " q.select("+itemNumber+");" +
                " q.trigger('change');");
    }

если же мы знаем значение, которое там есть - то можно действительно просто ввести текст.

public void setValue(String value){
        Element.sendKeys(value);
 }

PS: до получения списка всех значений так и не дошел, но думаю что это можно сделать через JS, либо же писать метод который сначала кликает по элементу а потом возвращает список найденных значений.

PPS: пример приведен для контрола DropDownList, но думаю он очень схож с ComboBox


(Бабай) #8

Выпадающий список в нем является отдельным элементом. Можно Получить List<WebElement> li в нем и выбрать необходимый по номеру в листе. Находятся они по порядку.


(Alex Shats) #9

Взгляни на его код.

Да, думал о таком. Просто хочется расширить свои знания и научиться обрабатывать такие контроли как следует. Селект еще ладно реализовать, а вот список эллементов хотелось бы по элегантнее.


(vmaximv) #10

Вы думаете я не смотрел? :smile:
А когда-то давно и имплементил - все там “ровно”. Конечно коробочный Select не подойдет - но это же вполне очевидно. Но все-равно цель топика непонятна - у вас сложности с локаторами или с чем-нибудь еще?


(Sergey Korol) #11

Поддерживаю всех сказавших, что JS тут и в помине не нужен. Если автор знаком с ООП, то сделать кастомный селект для этого контрола - задача очень простая. Причем, как уже сказали выше, существует достаточно способов имплементации, будь то работа с простым инпутом, либо моделирование реальных действий юзера с открытием / закрытием списка. К использованию JS надо прибегать в самую последнюю очередь. Конечный юзер то не лезет в консоль, чтобы заэкзекьютить скрипт для выбора эелемента дропдауна, ведь так? :wink:


(Alex Shats) #12

Решено.
Так как я использую VIQA, я создал дополнительный класс наследуемый от DropBox.
Может кому пригодится:

public class KendoComboBox: DropDown
    {
        public ITextField InputTextField { get; set; }

        public KendoComboBox(string name, By rootCssSelector, By selectorTemplate, By textFieldLocator)
            : base(name, rootCssSelector, () => new SelectItem("", selectorTemplate))
        {
            SetProperties(textFieldLocator);
        }

        public KendoComboBox(string name, By rootCssSelector, Func<SelectItem> selectorTemplate, By textFieldLocator) : base(name, rootCssSelector, selectorTemplate)
        {
            SetProperties(textFieldLocator);
        }

        private void SetProperties(By textFieldLocator)
        {
            InputTextField = new TextField(textFieldLocator);

            base.SelectAction = (selector, option) =>
            {
                selector.GetWebElement().Click();
                Thread.Sleep(300);
                selector.GetVIElementByName(option).Click();
            };

            base.IsSelectedFunc = (selector, option) => option == InputTextField.Value ? true : false;
        }

        public override string Value { get { return InputTextField.Value; } }
    }