ruby 水豚'拖放'不工作

nwnhqdif  于 2023-05-06  发布在  Ruby
关注(0)|答案(5)|浏览(228)

我在Mac上使用 cucumber /水豚/ selenium /火狐。一切都很好,除了D&D。拖放操作可通过drag_node.drag_to(drop_node)实现。当被调用时,它不会引发任何错误,但实际的拖放操作永远不会发生。
现在,我发现this sample app(由一个显然有类似问题的人编写)演示了这个问题,而不是复制粘贴片段。
谷歌并不知道drag_to()被破坏了。就我所见。这给了我一个希望,那就是我错过了一些东西,而不是一个bug。那是什么我错过了什么?窃听器?

2izufjch

2izufjch1#

对我来说,#drag_to确实起作用了,但是,它的力量似乎是有限的。
为了向下移动一个UI可排序的表格行,我必须创建一个有三行的表格,然后运行以下代码(在Cucumber步骤中):

element = find('tbody tr:nth-child(1)')
target = find('tbody tr:nth-child(3)')

element.drag_to target

这将用第二行交换第一行。我的解释是水豚拖得不够远,所以我给了它一个超出我实际目标的目标。

  • 注意:我已经配置了tolerance: 'pointer '的UI排序。*
w7t8yxp5

w7t8yxp52#

我也遇到过同样的问题,并通过直接进入selenium-webdriver解决了它。
我正在使用selenium-webdriver 2.20.0和Capybara 1.1.2
这与此HTML一起工作

<!DOCTYPE html>
<html>
  <head>
    <title>Cabybara Drag And Drop</title>
    </style>
    <style type="text/css" media="screen">
      #list_1 { background:#2C4999; }
      #list_2 { background:#99752A; }
      .list { padding:10px; width:200px; }
      .item { background:#FFF; margin:10px; }
    </style>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.js"></script>

    <script type="text/javascript">
      $().ready(function(){
        $( "#list_1" ).sortable({ connectWith:"#list_2" });
        $( "#list_2" ).sortable({ connectWith:"#list_1" });
      });
    </script>
  </head>
  <body>
    <ol id='list_1' class='list'>
      <li id='item_1' class='item'>Item 1</li>
      <li id='item_2' class='item'>Item 2</li>
      <li id='item_3' class='item'>Item 3</li>
      <li id='item_4' class='item'>Item 4</li>
      <li id='item_5' class='item'>Item 5</li>
    </ol>
    <ol id='list_2' class='list'>
      <li id='item_6' class='item'>Item 6</li>
      <li id='item_7' class='item'>Item 7</li>
      <li id='item_8' class='item'>Item 8</li>
      <li id='item_9' class='item'>Item 9</li>
      <li id='item_10' class='item'>Item 10</li>
    </ol>

  </body>
</html>

现在开始看Ruby代码。从capybara调用page.driver.browser获取selenium-webdriver

require 'test_helper'

class DragDropTest < ActionDispatch::IntegrationTest
  setup do
    Capybara.current_driver = Capybara.javascript_driver # :selenium by default
  end

  def test_drag_item_1_to_list_2
    visit '/drag_drop'
    element = page.find(:id, 'item_1')
    target  = page.find(:id, 'list_2')

    selenium_webdriver = page.driver.browser
    selenium_webdriver.mouse.down(element.native)
    selenium_webdriver.mouse.move_to(target.native, 0, 10)
    selenium_webdriver.mouse.up
    sleep 2
  end
end
2exbekwf

2exbekwf3#

selenium-webdriver在可排序列表方面有问题。这篇文章介绍了解决方法:http://www.dixis.com/?p=626

yqyhoc1h

yqyhoc1h4#

#drag_to不适用于可排序的列表,大概是因为您并没有拖动“到”一个元素,而是拖动了一个设定的距离和方向。Selenium的#drag_by是您正在寻找的,但目前不受Capybara支持。
参见:
https://github.com/jnicklas/capybara/issues/222
https://github.com/jnicklas/capybara/issues/119

7gs2gvoe

7gs2gvoe5#

这对我很有效:

def drag_n_drop(item:, location:)
  # this is from Selenium
  page.driver.browser.action.click_and_hold(item.native).perform

  # this is from Capybara
  item.drag_to(location)
end

背景:

警告:我是通过反复试验发现的,实际上我不确定它为什么有效。YMMV和使用风险自担。

相关问题