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

Jon*_*nas 1 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()
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一种在两个动作之间插入等待时间的方法

ActionChains(driver).move_to_element(menu)**(..wait some seconds)**.click(hidden_submenu).perform()
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 9

这是一个基于Kim Homann提示的Python示例.它扩展了ActionChainsSelenium类以添加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
Run Code Online (Sandbox Code Playgroud)

然后你的测试成为:

Actions(driver) \
    .move_to_element(menu) \
    .wait(2) \
    .click(hidden_submenu) \
    .perform()
Run Code Online (Sandbox Code Playgroud)


Kim*_*ann 5

我不懂 Python,但我认为它与 C# 中的相同。我希望我的代码对你来说是可读的。

您可以ActionsExActions. 然后你声明一个方法public Actions Wait(TimeSpan duration)。在此方法中,您调用AddAction(new SleepAction(duration));. AddAction()是 SeleniumActions类的受保护方法,仅当您从此类派生时才能访问该方法。

SleepAction是一个实现IAction接口的类,您必须创建它。它看起来像这个例子:

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

    private TimeSpan _duration;

    void IAction.Perform()
    {
        ToolBox.Sleep((int) _duration.TotalMilliseconds);
    }
}
Run Code Online (Sandbox Code Playgroud)

ActionsEx 类:

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

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

        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用一个动作链:

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

((ActionsEx)actions
    .Wait(duration)
    .MoveToElement(element))
    .Wait(duration)
    .Click()
    .Build()
    .Perform();
Run Code Online (Sandbox Code Playgroud)


小智 5

我尝试了这个并且似乎可以正常工作

from selenium import webdriver 

action = webdriver.ActionChains(driver)

action.pause(3)

action.perform()

driver.close()
Run Code Online (Sandbox Code Playgroud)

  • 这是链接:http://selenium-python.readthedocs.io/api.html?highlight=pause#selenium.webdriver.common.action_chains.ActionChains.pause (3认同)