2016-07-25 39 views
7

Weiß jemand, wie man ein Element in Android über Appium Python-Client zoomen?Zoom-Aktion in Android mit Appium-Python-Client

Ich bin derzeit mit

self.driver.zoom(self.element, percent) aber das gibt einen Fehler

self.driver.zoom(self.element, percent) 
File "/usr/local/lib/python2.7/site-packages/appium/webdriver/webdriver.py", line 308, in zoom 
self.execute_script('mobile: pinchOpen', opts) 
File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 461, in execute_script 
{'script': script, 'args':converted_args})['value'] 
File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 233, in execute 
self.error_handler.check_response(response) 
File "/usr/local/lib/python2.7/site-packages/appium/webdriver/errorhandler.py", line 29, in check_response 
raise wde 
WebDriverException: Message: Method has not yet been implemented 

ich auch durch MultiAction versucht.

loc = self.element.location 
print loc 
xx, yy = loc["x"], loc["y"] 
xx=700 
action1 = TouchAction(self.driver) 
action1.long_press(x=xx, y=yy).move_to(x=0, y=1000).release() 
action2 = TouchAction(self.driver) 
action2.long_press(x=xx, y=yy).move_to(x=0, y=-1000).release() 
m_action = MultiAction(self.driver) 
m_action.add(action1, action2) 
m_action.perform() 

Aber auch in diesem führt keine zoom.Instead es nach unten scrollt die list.Does jemand über eine Ahnung, was hier los ist.

Appium Logs

[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got data from client: {"cmd":"action","action":"element:getLocation","params":{"elementId":"83"}} 
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command of type ACTION 
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command action: getLocation 
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Returning result: {"status":0,"value":{"x":0,"y":1225}} 
[debug] [AndroidBootstrap] Received command result from bootstrap 
[MJSONWP] Responding to client with driver.getLocation() result: {"x":0,"y":1225} 
[HTTP] <-- GET /wd/hub/session/c1a4d17f-0dc6-4445-bfad-776ec65bddb5/element/83/location 200 26 ms - 88 
[HTTP] --> POST /wd/hub/session/c1a4d17f-0dc6-4445-bfad-776ec65bddb5/touch/multi/perform {"sessionId":"c1a4d17f-0dc6-4445-bfad-776ec65bddb5","actions":[[{"action":"longPress","options":{"y":1225,"x":700,"duration":1000}},{"action":"moveTo","options":{"y":1000,"x":0}},{"action":"release","options":{}}],[{"action":"longPress","options":{"y":1225,"x":700,"duration":1000}},{"action":"moveTo","options":{"y":-1000,"x":0}},{"action":"release","options":{}}]]} 
[MJSONWP] Calling AppiumDriver.performMultiAction() with args: [[[{"action":"longPress","o... 
[debug] [AndroidBootstrap] Sending command to android: {"cmd":"action","action":"performMultiPointerGesture","params":{"actions":[[{"action":"longPress","time":0.005,"touch":{"y":1225,"x":700,"duration":1000}},{"action":"moveTo","time":0.01,"touch":{"y":2225,"x":700}}],[{"action":"longPress","time":0.005,"touch":{"y":1225,"x":700,"duration":1000}},{"action":"moveTo","time":0.01,"touch":{"y":225,"x":700}}]]}} 
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got data from client: {"cmd":"action","action":"performMultiPointerGesture","params":{"actions":[[{"action":"longPress","time":0.005,"touch":{"y":1225,"x":700,"duration":1000}},{"action":"moveTo","time":0.01,"touch":{"y":2225,"x":700}}],[{"action":"longPress","time":0.005,"touch":{"y":1225,"x":700,"duration":1000}},{"action":"moveTo","time":0.01,"touch":{"y":225,"x":700}}]]}} 
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command of type ACTION 
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command action: performMultiPointerGesture 
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Returning result: {"status":0,"value":"OK"} 
[debug] [AndroidBootstrap] Received command result from bootstrap 
[MJSONWP] Responding to client with driver.performMultiAction() result: "OK" 
[HTTP] <-- POST /wd/hub/session/c1a4d17f-0dc6-4445-bfad-776ec65bddb5/touch/multi/perform 200 133 ms - 76 
[HTTP] --> DELETE /wd/hub/session/c1a4d17f-0dc6-4445-bfad-776ec65bddb5 {} 

Antwort

4

Die Multiaction Versuch sieht gut aus, aber nach einem bisschen Testen auf meinem Handy native Kamera-App, konnte ich eine schöne Zoom-Geste erhalten, indem das Hinzufügen 500ms wait() nach dem moveTo() :

# Zoom 
action1.long_press(x=xx, y=yy).move_to(x=0, y=50).wait(500).release() 
action2.long_press(x=xx, y=yy).move_to(x=0, y=-50).wait(500).release() 
m_action.add(action1, action2) 

# Pinch 
action3.long_press(x=xx, y=yy-50).move_to(x=0, y=50).wait(500).release() 
action4.long_press(x=xx, y=yy+50).move_to(x=0, y=-50).wait(500).release() 
m_action2.add(action3, action4) 

m_action.perform() 
m_action2.perform() 

Dies führte zu einem schönen und langsamen Zoom auf die Kamera-App. Ohne das Warten() waren die Gesten zu schnell und machten nicht wirklich viel. Es befindet sich auf Appium der Dokumentation bei Github erwähnt, kann das wait() verwendet werden, um das Timing einer Geste zu steuern: https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/touch-actions.md

ich die xx und yy bis in der Mitte des Bildschirms in meiner Kamera-App-Set mit:

xx = self.driver.get_window_size()['width']/2 
yy = self.driver.get_window_size()['height']/2 

Bitte denken Sie daran, dass Koordinaten niemals außerhalb der Bildschirmgrenzen des Geräts liegen sollten. Daher kann es sinnvoll sein, nach Bildschirmrändern zu suchen, wenn Sie dies zu einer wiederverwendbaren Funktion machen möchten.

Ich konnte die MultiAction-Gesten auch nicht bei der Automatisierung von Chrome verwenden (nicht einmal beim Wechsel in den NATIVE_APP-Kontext. Die Gesten hatten keine Wirkung.) Daher ist es möglich, dass die Verwendung von MultiActions in WebView-Szenarien nicht unterstützt wird.

+1

Ich denke, dass die 500ms in den meisten Fällen gut funktionieren werden. Ich habe einen Link zu Dokumenten hinzugefügt, wo das "Warten" genau zum Zweck der Zeitmessung einer Geste gemeint ist. Könnten Sie meine Antwort akzeptieren, wenn es Ihnen geholfen hat? – Domestus

+0

Der Antwort wurde eine Pinch-Geste hinzugefügt. Es schien, als arbeite man mit genau der entgegengesetzten Geste, indem man die Anfangskoordinate und die Richtung einstellt. – Domestus