【问题标题】:How do you pause between actions with Selenium WebDriver如何在 Selenium WebDriver 的操作之间暂停
【发布时间】:2014-07-08 00:26:22
【问题描述】:

我已经阅读了所有“你为什么要这样做”的答案,以及“不要那样做,这样做”的答案。我同意在自动化测试中暂停是没有意义的,除非你真的在等待一个条件的到来。

也就是说,有时我想在开发过程中“单步执行”不带断点的操作列表,以查看测试顺利运行而不会中断。此外,单步执行断点有时会完全中断测试。所以这里是这样的场景:我有隐藏的菜单,当鼠标悬停在它们上面时会显示出来,然后当你将鼠标悬停在现在可见的选项上时,它们会通过在鼠标从一个移动到另一个时改变它们的背景颜色来突出显示;常见的菜单场景。我想自动化那个东西,并且能够在我开发它的同时看到它工作,然后当我喜欢我看到的东西时把它扔掉。对不起,我不是在喊,只是在强调。

所以我得到了菜单的顶部元素,然后是可供选择的选项列表。然后按顺序将鼠标悬停在前 3 个选项上。

var element = page.WebDriver.FindElement(By.Id("actions"));
var elementLi = element.FindElements(By.TagName("li"));

Actions action = new Actions(page.WebDriver);
action.MoveToElement(element).Perform();
action.MoveToElement(elementLi[1]).Build().Perform();
action.MoveToElement(elementLi[2]).Build().Perform();
action.MoveToElement(elementLi[3]).Build().Perform();

是的,我可以设置断点,但如果我在每个 MoveToElement 调用之间放置隐式等待或 Thread.Sleep(5000),则不会暂停。即,它通过 lickity-split 运行,没有对我眨眼以示睦邻友好。

这不是一个关键问题,我同意。但是为什么没有什么可以暂停呢?

【问题讨论】:

  • 当我想检查鼠标出现时元素的颜色变化时,我实际上做了一些非常相似的事情。我很惊讶地发现睡觉没有帮助。我很感激您在报废并“正确”执行之前暂时在寻找“不理想但合适的答案”。因此,您是否尝试过实例化一个新的 Actions(),执行 moveTo、sleep、新操作、moveTo、sleep 等?
  • 喜欢使用“lickity-split”
  • 我在这个线程中搜索 Actions 类的 pause() 方法,并认为在这种情况下我们可以使用 pause() 方法。

标签: asp.net-mvc-4 selenium ui-automation


【解决方案1】:

大多数人使用 FluentWait ,例如 WebDriverWait 来等待元素出现后再继续。这个网站和整个互联网上有很多例子。只需创建一个名为 waitForElementToAppear( By locator ) 的方法,然后用您的实现填写它。

【讨论】:

  • 显然您没有阅读或理解我的问题。通常人们会这样做,但这不是我在开发中想要做的。这就是我在编写完成的测试用例并需要它来做这件事时所做的事情。
【解决方案2】:

在我的java自动化框架中,我使用了WebDriver$Timeouts.class接口——implicitlyWait(long time, TimeUnit unit)方法。

webdriver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

此方法指定驱动程序在搜索元素时应等待的时间(如果该元素没有立即出现)。

我很确定您会找到适合您的代码的东西。希望这会有所帮助。

【讨论】:

  • 这正是我使用的,只是它不起作用,正如我在帖子中所说的那样。不过,我只花了几个小时;-) 我真的很惊讶它没有用,Thread.Sleep 也没有。就好像 Actions 集合有一些不同的工作方式。
【解决方案3】:

由于您似乎想要在实际上不等待某些东西时会暂停的东西,我怀疑应该使用FluentWait,例如WebDriverWait(如另一个答案中所述),但告诉它等待一个你知道不会发生的情况,抓住并忽略TimeoutException

类似的东西

try {
    WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds, sleepInMilliseconds);
    wait.until(Predicates.<WebDriver> alwaysFalse());
}
catch(TimeoutException e) {
    //Ignore the timeout.  It's what we *want* to happen.
}

使用带有番石榴谓词的WebDriverWait until 的重载。

您会希望通过选择适当的睡眠时间来最大限度地减少对条件的轮询。

【讨论】:

  • 这是一个有趣的想法。我会试试的。顺便说一句,什么是番石榴谓词?啊,Java 的东西。
  • Guava 是来自 Google 的开源集合和函数式编程库,已被 Selenium 使用。我现在已经实现并测试了这段代码,它确实有效。
  • 刚刚注意到您正在为 asp.net 执行此操作,因此可能不使用 Java。不过,类似的东西应该适用于任何语言。
【解决方案4】:

你可以在动作之间使用pause

(new Actions(driver))
.clickAndHold(car1)
.moveToElement(car2Tail)
.pause(java.time.Duration.ofSeconds(2))
.release(car1).build()
.perform();

【讨论】:

    最近更新 更多