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

выбор значения в jquery slider watir-webdriver

watir
jquery
ruby
Теги: #<Tag:0x00007f7b6141e6a8> #<Tag:0x00007f7b6141e540> #<Tag:0x00007f7b6141e400>

#1

Нужно задать значение в днях/ процентах. В идеале было бы вообще задать значение из переменной, мб с помошью regexp.

<div class="slitem ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all" id="DurationSlider" data-item="Duration" data-postfix=" дн." data-min="1" data-max="30" data-default="1" data-step="1">
<div class="ui-slider-range ui-widget-header ui-corner-all ui-slider-range-min" style="width: 0%;"></div><span class="ui-slider-handle ui-state-default ui-corner-all" tabindex="0" style="left: 0%;"><span>1 дн.</span></span></div>

Не могу зацепиться к нему ни через link, ни через div, ни через hidden
Находил такой пример, не работает:

ie.link(:class,’ui-slider-handle ui-state-default ui-corner-all’).focus
ie.send_keys(:arrow_down)

В этом случае неизвестный метод:

handle = ie.link(:class,”ui-slider-handle ui-state-default ui-corner-all”)
handle.send_keys(:arrow_down, :page_down, :arrow_up, :page_up)

Есть у кого какие-то идеи?


(ffess) #2

а drag_and_drop не работает? Или он здесь и не должен работать? (не предусмотрено в смысле)


#3

из рабочего
browser.span(:class,'ui-slider-handle ui-state-default ui-corner-all').focus
и
browser.send_keys(:arrow_right)
но сразу бы попасть на 15дней или 50%


(ffess) #4

Чем это не подходит?
http://www.rubydoc.info/gems/watir-webdriver/Watir/Element#drag_and_drop_by-instance_method


(Eugene Tkachenko) #5

Я так понимаю, у нас есть дата слайдер, типа ползунка и есессно мы не можем драг и дропнуть не имея два элемента(отку взять и куда кинуть, ибо все внутри одного элемента).

Мое предложение, сделать .click_and_hold, после чего делать в цикле .move_by и в каждом степе делать мув на несколько десятков пикселей в нужную сторону, пока ты не будет иметь нужный тебе показатель даты в плейсхолдере.

Тот же принцип как и в солюшене автора.

Было бы не плохо конечно видеть сам слайдер, ибо если иметь вот такой вот слайдер: http://ghusse.github.io/jQRangeSlider/options.html - он имеет встроенные функции с помощью которого можно используя javascript четко ставить нужные рейнджи и вообще дату.


#6

такой он и есть. навигация по нему с помощью кнопок вполне работает. Но, если задача стоит установить в него значение из конфига, как быть? например .span(%blablabla%).set (:style, ‘left: 50%’)


(Eugene Tkachenko) #7

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

И кстати да, ваш солюшен можно тоже спокойно заюзать, почему бы не сделать, что-то типа вычисления потипу:

2 раза arrow_right = 1 день

def set_days(days)
browser.span(:class,'ui-slider-handle ui-state-default ui-corner-all').focus 
  days*2.times do
     browser.send_keys(:arrow_right)
  end
end

(ffess) #8

Господа, выше указанный метод для драг н дропа не на элемент. А на определенное количество пикселей (там в доках все написано)


(Eugene Tkachenko) #9

Да, точно, есть .drag_and_drop_by, но опять таки, тогда нужно будет точно также высчитывать на сколько пикселей нужно отодвигать ползунок, что бы попасть на нужную дату, а особенно если нужно указать точное кол-во дней.

Выйдет тоже самое в принципе.


(ffess) #10

У меня была подобная ситуация. И я это делаю динамически.
Сначала я узнаю ширину элемента (общую), например ширина всей дорожки, где ползунок может быть 200 пикселей.
Потом я определяю на сколько пикселей он уже отодвинут. Для этого нужно узнать ширину “активного” элемента, либо вычленить соответствующий параметр из стиля элемента.
Далее, в случае если тебе надо поместить ползунок четко посередине, берешь 50% от 200 пикселей, отнимаешь от полученного результата текущее положение ползунка - и получаешь результат, насколько нужно перетащить ползунок.
Все!