如何移动到在浏览器中不可见的 geb 页面内容window?

How to move to geb page content that is not visible in the browser window?

如何让 geb webdriver 移动到页面上可能不在浏览器视图中的元素。该元素存在于页面上并显示,但该元素可能会出现在页面底部,浏览器需要向下滚动才能显示该元素。

import geb.Page
class myPage extends Page {
  static url = "mypage.xhtml"
  static at = {title == "myPage"}
  static content = {
    someElement = {$("#bottomOfPage")}
    anotherElement = {$(".someClass",5)}
  }

  void clickElement(){
    //possibility to fail because element may not be displayed in browsers view
    //if not in view, scroll to element, then click
    someElement.click()
  }
}

以这个页面为例,如果一个元素在页面上不可见并且可能在最底部,我如何告诉 webdriver 将该元素显示在视图中?当页面内容不可见时,我有一些复杂的测试失败了。在某些情况下,即使不在视图中,驾驶员也会移动到该元素。但是我想明确地告诉驱动程序移动到一个元素,如果它不在视图中,因为它不会自行移动。

selenium 库确实有一个 moveToElement() 函数,但它只接受 WebElement class 的对象。使用 geb,在创建页面 classes 时,我的测试中使用的所有元素都在内容部分声明,因此属于 SimplePageContent class。 SimplePageContent 也不能​​转换为 WebElement。 moveToElement(By.id("bottomOfPage")) 确实有效,但并不理想,因为我不想要硬编码值。如果可能的话,我宁愿传递页面内容对象本身。

根据我的经验,我可以说,如果您要求 WebDriver 单击当前不在视图中的元素,它将首先滚动到该元素,然后单击它。因此,如果它没有发生,你要么遇到了某种错误,要么元素不在视图中的事实并不是导致你的元素不被点击的原因。

如果您仍然想使用 Actions.moveToElement() 显式移动到元素,那么您可以轻松地转换从内容定义返回的对象,因为它们实现了 Navigator,它带有 [=22] =] 当你的 Navigator 恰好有一个 WebElement.

还有一种更简单的方法,不需要从您的 Navigator 中提取 WebElement - 使用 interact {} 块:

interact {
    moveToElement(someElement)
}