Как протестировать виджет JQuery UI Sortable, используя Selenium? - PullRequest
5 голосов
/ 16 ноября 2010

У нас есть сортируемый список с использованием JQuery UI Sortable , который мы пытаемся автоматизировать с помощью Selenium.

Похоже, что функция dragAndDrop должна работать, но когда мы ее вызываем, пользовательский интерфейс не меняется.Однако если мы посмотрим на DOM с помощью firebug, то увидим, что порядок элементов списка DID изменился.Кажется, не обновляется только пользовательский интерфейс.

Есть идеи, как заставить его работать?

Ответы [ 5 ]

3 голосов
/ 16 декабря 2010

Попробуйте перетащитьAndDropToObject. Я просто мог перемещать вещи, используя Se-IDE (хотя я подозреваю, что Se-RC также будет работать).

dragAndDropToObject | css = div [class = demo]> ul> li: nth (2) | css = div [class = demo]> ul> li: nth (5)

2 голосов
/ 24 августа 2011

Я разработал плагин JQuery для решения этой проблемы, посмотрите jquery.simulate.drag-sortable.js , который включает плагин и набор тестов.

Надеюсь, вы найдете это полезным! Обратная связь приветствуется.

Мэтт

2 голосов
/ 27 января 2011

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

0 голосов
/ 14 июня 2017

Здесь, в 2017 году, рельсы 4+ угловые 1x, используя тест на селен на капибару с 2 различными драйверами: poltergeist и chrome, я смог заставить встроенную капибару drag_to работать из коробки. Я не скажу, что он на 100% надежен в отношении того, куда он тянет вещи, но материал тянул и оставался тянут, так что это был приятный сюрприз. Я также получил модифицированную версию ответа Джули для работы в chrome, но не poltergeist (нет driver.browser.action ... не уверен, что это за версия poltergeist, если она вообще существует).

Так или иначе что-то вроде:

element = page.find_all('.draggable_thing')[0]
target = page.find_all('.droppable_thing')[3]
element.drag_to(target)

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

0 голосов
/ 19 марта 2014

Вот то, что я нашел, хорошо работает с Селеном и Капибарой

# Move a row at index start_index to end_index
def move(start_index, end_index)
  row = sortable_row(start_index)

  # We are not using Capybara drag_to here as it won't work properly in dragging first and last elements,
  # and also is a bit unpredictable whether it will drop before or after an element
  move_amount = ((end_index - start_index)*row_height).to_i
  # Move a little more than the explicit amount in each direction to be certain 
  # that we land in the correct spot
  move_amount_sign = (move_amount >= 0) ? 1 : -1
  move_amount = move_amount + move_amount_sign*(row_height * 0.25).to_i
  @session.driver.browser.action.drag_and_drop_by(row.native, 0, move_amount).perform
end

# Get the height of a row for sorting
def row_height(refresh=false)
  @row_height = nil unless @row_height || refresh
  unless @row_height
    @row_height = @session.evaluate_script("$('.my-sortable-row').height()")
  end
end
...