使用Selenium Actionchains时指定操作之间的等待时间

2024-05-18 13:57:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我将从google 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()

谢谢!


Tags: 方法bydriverseleniumelementfindselectorcss
3条回答

我试过了,看起来很管用

from selenium import webdriver 

action = webdriver.ActionChains(driver)

action.pause(3)

action.perform()

driver.close()

下面是一个基于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

然后你的测试变成:

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

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

您可以从Actions创建自己的类ActionsEx。然后声明一个方法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);
    }
}

动作性爱课:

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

相关问题 更多 >

    热门问题