2016-04-12 4 views
0

ActionChains - очень удобный метод при использовании Selenium. Это работает очень хорошо, только мне не хватает, как вставить время ожидания между Actions.Укажите время ожидания между действиями при использовании Selenium Actionchains

Я приведу тот же пример из официальной документации Google по селену. 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() 

Что я ищу способ, чтобы вставить время ожидания между двумя действиями

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

Спасибо!

ответ

6

Вот пример Python основан на Kim Гоманн. Он расширяет класс Selenium ActionChains, чтобы добавить действие wait.

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 

Тогда ваш тест становится:

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

Это должно быть принято. – maQ

2

Просто импортируйте время Modul и использовать сон всякий раз, когда вам это нужно:

from time import sleep 

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

Надеется, что это поможет вам немного.

+2

Если я выполнить это, то это не будет цепь больше. Они будут отдельными действиями. Например, если я хочу щелкнуть элемент меню, а затем немного подождать, а затем нажать «Вниз» и затем нажать «Ввод», эти три действия должны выполняться как цепочка. – Jonas

+0

проверить мое редактирование, должно также работать так, но я никогда не тестировал – Roman

+0

ActionChains hat no attribute sleep :) – Jonas

4

Я не знаю Python, но я думаю, что это то же самое, что и в C#. Надеюсь, мой код читаем для вас.

Вы можете создать свой собственный класс ActionsEx исходя из Actions. Затем вы объявляете метод public Actions Wait(TimeSpan duration). Внутри этого метода вы вызываете AddAction(new SleepAction(duration));. AddAction() - защищенный метод класса Actions Selenium, доступный только в том случае, если вы получаете этот класс.

SleepAction - это класс, реализующий интерфейс IAction, который вы должны создать. Это может выглядеть как в этом примере:

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

    private TimeSpan _duration; 

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

ActionsEx класс:

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

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

     return this; 
    } 
} 

Тогда вы можете позвонить в цепочку действий, как это:

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

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

Я считаю, что вопрос заключается в том, что задержка выполняется за пределами ActionChain будет игнорироваться один раз perform называется. Подумайте о цепочке, подобной очереди действий в sched: вы можете подождать часы и часы между , добавив в очередь пунктов, но как только вы позвоните run, каждая задача будет выполняться в простой последовательности без задержки.

Итак, чтобы создать задержку внутри цепи, я бы использовал метод Selenium pause.

Docs здесь: http://selenium-python.readthedocs.io/api.html

0

Я попытался это и, кажется, работает

from selenium import webdriver 

action = webdriver.ActionChains(driver) 

action.pause(3) 

action.perform() 

driver.close() 
Смежные вопросы