2013-03-05 10 views
17

Ich möchte von Selenium zu Poltergeist wechseln, aber ich muss einen Barcode-Scanner simulieren, der aussieht wie ein Tastatureintrag zum <body>-Tag. Ich benutze diesen Code mit Selen:send_keys Unterstützung für Poltergeist?

native.send_keys(send_key) 

Gibt es eine Möglichkeit mit Poltergeist eine Reihe von Tasten, um ein beliebiges Element zu senden (dh nicht ein Eingang)?

+0

Bitte wählen Sie die Antwort von @ Matt Sanders als beste Antwort, wie es am genauesten Frage von heute anspricht. –

+1

Jahre später ... dank @Matt Sanders –

Antwort

18

Poltergeist jetzt has send_keys support:

element = find('input#id') 

# send a simple string 
element.native.send_key('String') 

# send a series of keystrokes 
element.native.send_keys('H', 'elo', :Left, 'l') # => 'Hello' 

# symbol for special keys 
element.native.send_key(:Enter) # triggers Enter key 
2

Nein, derzeit gibt es keine Möglichkeit, dies zu tun. PhantomJS stellt hierfür eine API zur Verfügung, die in Zukunft hinzugefügt werden könnte, aber derzeit nicht unterstützt wird.

Ich würde vorschlagen, versuchen, die DOM Tastatur Ereignisse in Javascript zu generieren. Oder behalten Sie diese Spezifikationen mit Selenium und verwenden Sie Poltergeist für den Rest.

+0

Dies ist nicht wahr; phantomjs unterstützt das Senden von Tastatur, Maus und verschiedenen anderen Ereignissen an den Browser (nicht nur die begrenztere Auslösung, die in der Browser-Sandbox verfügbar ist): https://github.com/ariya/phantomjs/wiki/API-Reference-WebPage#wiki -webpage-sendEvent –

+1

Ja, * PhantomJS * unterstützt es (wie ich schon sagte), aber die Frage war * Poltergeist *. Poltergeist hat keinen Haken in diesem Teil der PhantomJS API. – jonleighton

+0

In der Tat - Entschuldigung! Wäre ein clientseitiger Hack (ab) mit '__poltergeist' möglich? –

3

Seit PhantomJS 1.7 (veröffentlicht 2012-09-22) können Sie Tastaturereignisse unter Verwendung von page.sendEvent an den Headless-Browser senden.

Die Dokumentation enthält ein Beispiel simuliert Shift-A:

page.sendEvent('keypress', page.event.key.A, 
       null, null, 0x02000000 | 0x08000000); 

Wie genau, dass die Eingabe von der Seite behandelt wird (also das, was gezielte ist) auf dem Zustand der Seite abhängen wird, wie zum Beispiel, wo der Schwerpunkt .

+1

könnten Sie einen Link zu der Seite in der Dokumentation veröffentlichen, in der Sie diese gefunden haben? Wenn Sie nur eine Taste drücken wollten, was wäre die Syntax? –

+0

https://github.com/ariya/phantomjs/wiki/API-Reference-WebPage#wiki-webpage-sendEvent - aber beachten Sie, dass dies das Problem nicht von selbst löst, obwohl der Poltergeist diese API nicht durchlässt. Sie können es wahrscheinlich entweder im Poltergeist selbst oder indem Sie einige andere exponierte Interna missbrauchen, aber es ist keine Plug-and-Play-Lösung. –

+0

Diese Lösung scheint ideal zum Testen von https://github.com/jeresig/jquery.hotkeys. Kannst du erklären, wie 'sendEvent' durch rspec und poltergeist an phantomjs übergeben wird? –

2

Ab Version 1.5.0 unterstützt Poltergeist grundlegende send_keys.

https://github.com/jonleighton/poltergeist/blob/master/CHANGELOG.md#150

+0

Ich bekomme diesen Fehler, wenn ich 'send_keys' versuche:' NoMethodError: undefinierte Methode 'send_keys' für "1": String' Mein Setup ist 'Capybara.driver =: webkit' und' Capybara.javascript_driver =: poltergeist' mit Poltergeist v1 .7. Was mache ich falsch? – sameers

+0

@samees, ich denke, Sie sollten ein Problem auf Poltergeist github Seite einreichen. 1.7 wurde gerade veröffentlicht, also habe ich es noch nicht ausprobiert – Valentin

+0

werde ich tun, ich hatte angenommen, dass es meine Schuld war, aber vielleicht schob ich in poltergeist selbst ... – sameers