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

问题描述 投票:1回答:5

使用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()

谢谢!

python selenium
5个回答
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()

4
投票

我不懂Python,但我认为它和C#一样。我希望我的代码对您而言可读。

你可以创建自己的类ActionsEx派生自Actions。然后你声明一个方法public Actions Wait(TimeSpan duration)。在这个方法中,你调用AddAction(new SleepAction(duration));AddAction()是Selenium的Actions类的受保护方法,只有从这个类派生才能访问它。

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();

4
投票

我试过这个似乎工作

from selenium import webdriver 

action = webdriver.ActionChains(driver)

action.pause(3)

action.perform()

driver.close()

2
投票

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

from time import sleep

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

希望这对你有所帮助。


2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.