使用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()
谢谢!
答案 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
方法。