2016-03-21 11 views
1

Ich versuche, ein Klicken zu implementieren, ziehen und loslassen an bestimmten Koordinaten für eine Webseite, kopflos mit Capybara. Das Ziel ist ein Element mit einem Kalender, der auf Mausereignisse über Ajax reagiert. Termine werden per Klick, Ziehen und Loslassen hinzugefügt. Ich habe 2 Methoden versucht:Klicken, halten und bewegen an bestimmten Koordinaten mit Capybara (Rubin)

Methode 1

cal = find(:xpath, "//div[@class='dhx_cal_container']") 
page.driver.browser.mouse.move_to(cal.native, 240, 250) 
page.driver.browser.mouse.down 
page.driver.browser.mouse.move_by(0, 150) 
page.driver.browser.mouse.up 

Problem Methode 1: nichts geschieht nach Screenshots.

Methode 2

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 

Problem Methode 2: click_and_hold zielt immer auf die Mitte des Elements.

Haben Sie Ideen, wie Sie das Klicken und Ziehen in diesem Fall implementieren?

Antwort

2

Sie sollten drag_to Capybara die Verwendung Methode

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

Weitere Informationen: http://www.rubydoc.info/github/jnicklas/capybara/Capybara%2FNode%2FElement%3Adrag_to

+1

Die Sache ist, zieht ein Element nicht funktioniert. Es ist notwendig, an einem bestimmten Punkt auf das Kalenderelement zu klicken und die Maus ein paar Pixel nach oben oder unten zu bewegen. –

0

Wie Sie das Capybara Quertreiber drag_to entdeckt haben, zieht die Mitte eines Elements auf die Mitte eines anderen. Da dies nicht Ihren Bedürfnissen entspricht, müssen Sie fahrerspezifisch vorgehen - in Ihrem Fall haben Sie Selen angegeben. #click_and_hold sollte nur auf die Mitte eines Elements klicken, wenn Sie ein Element übergeben, das Sie nicht sind. Unter Ihrer Methode 1 Aktionen und Übersetzen in Methode 2 Stil sollte folgendes tun, was Sie wollen

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 

Die Offsets BEWEGE_ZU bestanden sind von der oberen linken Ecke des cal.native Element. Es scheint komisch, dass das UIs-Verhalten nur darin besteht, den Container herumzuziehen und ihn etwas versetzt wegzulassen, was jedoch nicht auf der Position irgendeines anderen Elements basiert. Sind Sie sicher, dass Sie wirklich Orte basierend auf dem Container auswählen und keine Elemente innerhalb des Containers ziehen möchten?

+0

Leider funktioniert nicht. Wie Sie in Methode 2 der Originalfrage sehen können, zielt click_and_hold auch auf die Mitte des Elements ab. –

+0

Und ja, es ist notwendig, die Maus innerhalb des Elements zu ziehen, bewegliche Elemente innerhalb des Containers ist nicht der Fall. –

+0

@MiikaPalokangas Von Selen - https://github.com/SeleniumHQ/selenium/blob/ab1e647d0fc8fc39e6b00ae94321ab228b6728f2/rb/lib/selenium/webdriver/common/action_builder.rb#L164 - click_and_hold soll sich nur in die Mitte eines Elements bewegen wenn einer übergeben wird (ruft Maus # auf https://github.com/SeleniumHQ/selenium/blob/ab1e647d0fc8fc39e6b00ae94321ab228b6728f2/rb/lib/selenium/webdriver/common/mouse.rb#L49 und bewegt sich nur, wenn das Element übergeben wurde) - ohne ein passendes Element sollte es nur eine Maus nach unten tun. Wenn dies für Sie nicht der Fall ist, können Sie dies dem Selenprojekt melden. –

Verwandte Themen