需要在capybara(红宝石)的某些坐标处单击,按住并移动

时间:2016-03-21 15:40:07

标签: ruby selenium capybara headless webautomation

我试图在网页的某些坐标处实现点击,拖动和释放,无头地使用Capybara。目标是包含日历的元素,日历通过ajax响应鼠标事件。通过单击,拖动和释放添加计划。我尝试了两种方法:

方法1

driver.browser.action.move_to(native).move_by(x1, y1).click_and_hold.perform
driver.browser.action.move_to(native).move_by(x2, y2).release.perform

方法1的问题:根据屏幕截图没有发生任何事情。

方法2

{{1}}

方法2的问题: click_and_hold始终以元素的中心为目标。

在这种情况下如何实现点击和拖动的任何想法?

3 个答案:

答案 0 :(得分:2)

你应该使用capybara的drag_to方法

source = page.find('#foo')
target = page.find('#bar')
source.drag_to(target)

更多信息:http://www.rubydoc.info/github/jnicklas/capybara/Capybara%2FNode%2FElement%3Adrag_to

答案 1 :(得分:1)

当您发现Capybara十字驱动程序时,drag_to将一个元素的中间拖到另一个元素的中间。由于这不能满足您的需求,您必须特定于驾驶员 - 在您的情况下,您已经指出了硒。 #click_and_hold只应点击一个元素的中间,如果你传递一个元素,你不会。采用方法1操作并转换为方法2样式,以下内容应该可以执行您想要的操作

cal = find(:xpath, "//div[@class='dhx_cal_container']")
page.driver.browser.action.move_to(cal.native, 240, 250).
                           click_and_hold.
                           move_to(cal.native, 240, 400).
                           release.
                           perform

传递给move_to的偏移量来自cal.native元素的左上角。看起来奇怪的是,UI的行为只是拖动容器并将其丢弃一些偏移量,而不是基于任何其他元素的位置。你确定你真的想要根据容器选择位置,而不是在容器内拖动元素吗?

答案 2 :(得分:0)

我的理解是,您需要的是一些东西,而不仅仅是移动元素的中间部分。 Selenium的draganddropby动作会成功吗?它允许您设置x,y偏移坐标。

https://www.selenium.dev/documentation/en/support_packages/mouse_and_keyboard_actions_in_detail/#draganddropby