2016-04-12 3 views
0

Die ActionChains sind eine sehr praktische Methode, wenn Sie Selenium verwenden. Es funktioniert wirklich gut, nur was ich vermisse, ist das Einfügen von Wartezeiten zwischen den Aktionen.Geben Sie die Wartezeit zwischen Aktionen an, wenn Sie Selenium Actionchains verwenden.

Ich werde das gleiche Beispiel aus der offiziellen Google Selenium Dokumentation nehmen. https://selenium.googlecode.com/git/docs/api/py/webdriver/selenium.webdriver.common.action_chains.html

menu = driver.find_element_by_css_selector(".nav") 
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1") 

ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform() 

Was ich suche ist eine Möglichkeit,

ActionChains(driver).move_to_element(menu)**(..wait some seconds)**.click(hidden_submenu).perform() 

Dank zwischen den beiden Aktionen Wartezeiten einfügen!

Antwort

6

Hier ein Python-Beispiel basiert auf Kim Homanns Tipp. Es erweitert die ActionChains Selen-Klasse um eine wait Aktion hinzuzufügen.

import time 
from selenium.webdriver import ActionChains 

class Actions(ActionChains): 
    def wait(self, time_s: float): 
     self._actions.append(lambda: time.sleep(time_s)) 
     return self 

Dann wird Ihr Test wird:

Actions(driver) \ 
    .move_to_element(menu) \ 
    .wait(2) \ 
    .click(hidden_submenu) \ 
    .perform() 
+1

Dies sollte akzeptiert werden .. – maQ

2

Importieren Sie einfach die Zeit modul und Schlaf benutzen, wann immer Sie es brauchen:

from time import sleep 

action = webdriver.ActionChains(driver) 
action.move_to_element(menu) 
sleep(5) 
action.click(hidden_submenu).perform() 

hoffe das hilft dir ein wenig.

+2

Arbeits Wenn ich ausführen, dass, dann wird es keine Kette mehr sein. Sie werden separate Aktionen sein. Zum Beispiel, wenn ich auf einen Menüpunkt klicken und dann ein wenig warten möchte und dann Abdrücken und dann Enter drücken, sollten diese drei Aktionen als Kette ausgeführt werden. – Jonas

+0

check my edit, sollte auch so funktionieren, aber ich habe nie getestet – Roman

+0

ActionChains hat kein Attribut schlafen :) – Jonas

4

Ich weiß nicht, Python, aber ich denke, es ist das gleiche wie in C#. Ich hoffe, dass mein Code für Sie lesbar ist.

Sie können Ihre eigene Klasse ActionsEx erstellen, die von Actions stammt. Dann deklarieren Sie eine Methode public Actions Wait(TimeSpan duration). Innerhalb dieser Methode rufen Sie AddAction(new SleepAction(duration));. AddAction() ist eine geschützte Methode der Klasse Actions von Selenium, auf die nur zugegriffen werden kann, wenn Sie von dieser Klasse abgeleitet sind.

SleepAction ist eine Klasse, die die IAction Schnittstelle implementiert, die Sie erstellen müssen. Es kann wie in diesem Beispiel aussehen:

public class SleepAction : IAction 
{ 
    public SleepAction(TimeSpan duration) 
    { 
     _duration = duration; 
    } 

    private TimeSpan _duration; 

    void IAction.Perform() 
    { 
     ToolBox.Sleep((int) _duration.TotalMilliseconds); 
    } 
} 

ActionsEx Klasse:

public class ActionsEx : Actions 
{ 
    public ActionsEx(IWebDriver driver) : base(driver) 
    { 
    } 

    public Actions Wait(TimeSpan duration) 
    { 
     AddAction(new SleepAction(duration)); 

     return this; 
    } 
} 

Dann können Sie eine Aktion Kette wie folgt aufrufen:

var actions = new ActionsEx(driver); 
var duration = TimeSpan.FromSeconds(1); 

((ActionsEx)actions 
    .Wait(duration) 
    .MoveToElement(element)) 
    .Wait(duration) 
    .Click() 
    .Build() 
    .Perform(); 
2

Ich glaube, das Problem ist, dass eine Verzögerung außerhalb des ActionChain ausgeführt wird einmal außer Acht gelassen werden perform genannt wird. Stellen Sie sich die Kette wie eine Warteschlange von Aktionen in sched vor: Sie könnten Stunden und Stunden zwischen warten, indem Sie Elemente zur Warteschlange hinzufügen, aber sobald Sie run aufrufen, wird jede Aufgabe in einfacher Reihenfolge ohne Verzögerung ausgeführt.

Also, um eine Verzögerung innerhalb der Kette zu erstellen, würde ich Seleniums pause Methode verwenden.

Docs hier: http://selenium-python.readthedocs.io/api.html

0

habe ich versucht, diese und scheint

from selenium import webdriver 

action = webdriver.ActionChains(driver) 

action.pause(3) 

action.perform() 

driver.close() 
Verwandte Themen