2012-03-21 120 views
7

是否有任何解决方法可以使用Selenium Webdriver与Ruby进行HTML5拖放操作?我使用的硒的webdriver 2.20.0使用Ruby 1.9.2HTML5拖放使用Selenium Webdriver for Ruby

下面是一个简单的测试来重现问题:

require "selenium-webdriver" 
require "test/unit" 

class Html5DragAndDropTest < Test::Unit::TestCase 

    def setup 
    @driver = Selenium::WebDriver.for :firefox 
    @driver.manage.timeouts.implicit_wait = 30 
    end 

    def teardown 
    @driver.quit 
    end 

    def test_html5_drag_and_drop 
    @driver.get("http://html5demos.com/drag") 
    target = @driver.find_element(:id, "one") 
    source = @driver.find_element(:id, "bin") 
    @driver.action.drag_and_drop(target, source).perform 
    assert target.displayed? == false 
    end 
end 
+0

[这](http://sqa.stackexchange.com/a/1296)或许是答案。 – 2012-03-21 01:55:15

+0

他们在那里使用的方法是高级用户交互API的一部分。更具体地说,[Selenium :: WebDriver :: ActionBuilder](http://selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver/ActionBuilder.html#drag_and_drop-instance_method)此方法不起作用与HTML5拖放。 – 2012-03-21 16:59:36

+0

我有同样的问题。经过对SO和网络的广泛研究后,我认为这是一个硒错误。我在这里提交了一个错误报告:https://code.google.com/p/selenium/issues/detail?id=6315&thanks=6315&ts=1380031813 – 2013-09-24 14:20:14

回答

2

这里是一个临时的解决方法,可以帮助社区与测试在此期间...

1)drag_and_drop_helper.js(https://gist.github.com/2362544)到您的测试/佣工目录

2)在test_helper.rb中创建一个新的方法

def drag_and_drop(source,target) 

    js_filepath=File.dirname(__FILE__)+"/drag_and_drop_helper.js" 
    js_file= File.new(js_filepath,"r") 
    java_script="" 

    while (line=js_file.gets) 
    java_script+=line 
    end 

    js_file.close 

    @driver.execute_script(java_script+"$('#{source}').simulateDragDrop({ dropTarget: '#{target}'});") 

    rescue Exception => e 
    puts "ERROR :" + e.to_s 

end 
+0

不知道HTML5拖放,但碰到这个JavaScript解决方案拖放:http://ynot408.wordpress.com/2011/09/22/drag-and-drop-using-selenium-webdriver – David 2013-01-24 22:35:49

+0

在这个答案中提出的解决方案并不适合我。 – 2013-09-24 14:21:09

0

以下是如何让拖放(dnd)与水豚/硒一起用于黄瓜测试。基本上使用drag_to方法直接从Capybara调用dnd不起作用。你必须退出水豚到Selenium中,并且当使用Selenium时,使用click_and_hold方法,然后拖动和放下,然后释放dnd来工作。以下是代码:

#jump out of capybara for dnd 

#selenium web driver accessed directly using page.driver.browser 
source_selenium_ele = page.driver.browser.find_element(:xpath, "//draggable-element") 
target_selenium_ele = page.driver.browser.find_element(:xpath, "//destination-element") 

#drag and drop actions 
page.driver.browser.action.click_and_hold(source_selenium_ele).perform 
page.driver.browser.action.drag_and_drop(source_selenium_ele, target_selenium_ele).perform 
page.driver.browser.action.release.perform 

#jump back into capybara... 
+0

我可能是错的,但我认为调用.click_and_hold和.release是通过调用.drag_and_drop隐式完成的。所以我认为这个代码在它已经发布之后会在持有和发布的时候点击。 – 2012-07-30 17:51:52

+0

这实际上不起作用。我发布的代码片段使用了一个html5示例(http://html5demos.com/drag),它不适用于您的代码。在这两种情况下硒都只被使用。 – 2013-02-21 02:21:15