使用Selenium Actionchains时,在Actions之间指定等待时间

时间:2016-04-12 11:38:34

标签: python selenium

使用Selenium时,ActionChains是一种非常方便的方法。 它工作得很好,我唯一缺少的是如何在Actions之间插入等待时间。

我将从官方谷歌Selenium文档中采用相同的示例。 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()

谢谢!

5 个答案:

答案 0 :(得分:8)

这是基于Kim Homann的提示的Python示例。它扩展了ActionChains Selenium类以添加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 :(得分: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); } } 接口的类,您必须创建该接口。它看起来像这样的例子:

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

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

        return this;
    }
}

ActionsEx类:

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

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

然后你可以调用这样的动作链:

.exe

答案 2 :(得分:4)

我试过这个似乎正在工作

from selenium import webdriver 

action = webdriver.ActionChains(driver)

action.pause(3)

action.perform()

driver.close()

答案 3 :(得分:2)

只需输入时间模块并在需要时使用睡眠:

from time import sleep

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

希望这会对你有所帮助。

答案 4 :(得分:2)

我认为问题是,在调用ActionChain后,perform之外执行的延迟将被忽略。将链视为sched中的一系列操作:您可以在项添加到队列之间等待数小时,但是一旦您调用run,每个任务都会以简单的顺序执行,没有延迟。

因此,要在链中创建延迟 ,我会使用Selenium的pause方法。

文档:http://selenium-python.readthedocs.io/api.html