如何等待所有WebElements在Haskell WebDriver客户端中消失?

时间:2014-12-29 10:13:14

标签: haskell selenium selenium-webdriver webdriver

我正在使用Haskell WebDriver client编写测试。

我有一个页面 - 当它最初加载时 - 包含几个"面板加载"动画元素。在开始与页面交互之前,我想等待这些元素消失。 如何使用Test.WebDriver.Commands.Wait表达此逻辑?

换句话说,我想使用Java WebDriver的API表示以下代码的Haskell等价物

private void waitForPageLoad() {
    new WebDriverWait(driver, 15/*wait timeout in seconds*/, 100/*poll interval in miliseconds*/)
     .until(ExpectedConditions.not(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector(".panel_loading")));
}

..以便我以后可以在WD monad中使用它,如:

doStuff :: WD ()
doStuff = do
  openPage "blabla"
  waitForPageToLoad -- how to define this?
  input <- findElem $ ById "someID"
  --etc...

1 个答案:

答案 0 :(得分:2)

我实际上没有运行它,但以下代码类型检查。

要等到没有类“panelLoading”的元素,请尝试类似:

doStuff' :: WD ()
doStuff' = do
  openPage "blabla"
  waitWhile 30 $ findElem (ByClass "panelLoading")
  ...

说明:

waitUntil将重复操作,直到成功为止。一个示例(来自onTimeout文档)等待有一个元素具有CSS类“class”然后返回其文本:

waitUntil 5 (getText <=< findElem $ ByCSS ".class")

findElem如果失败则会抛出NoSuchElement例外。

waitWhile会反转等待条件,因此您可以将其与findElem结合使用,等待某个类/ css选择器等没有元素。

您可以使用unexpected创建自定义等待条件,例如:

-- wait until there are an even number of elements having class "class"
waitUntil 5 $ do elems <- findElems $ ByCSS ".class"
                 if (odd (length elems))
                   then unexpected "odd number of elements"
                   else return ()

另请参阅waitUntil'waitWhile'以控制投票频率。