2012-03-21 87 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