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

时间:2016-04-08 20:57:55

标签: selenium automation geb

如何让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类的对象。使用geb时,在创建页面类时,我的测试中使用的所有元素都在内容部分中声明,因此属于SimplePageContent类。 SimplePageContent也不能转换为WebElement。 moveToElement(By.id("bottomOfPage"))确实有效但不理想,因为我不想要硬编码值。如果可能的话,我更愿意传递页面内容对象本身。

1 个答案:

答案 0 :(得分:3)

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

如果您仍想使用Actions.moveToElement()显式移动到该元素,那么您可以使用Navigator附带WebElement实现Navigator的事实轻松转换从内容定义返回的对象如果您希望在Navigator只有一个WebElement时获得多元素WebElementsingleElement()的第一个Navigator,则应该使用该字段。

还有一种更简单的方法,不需要从interact { moveToElement(someElement) } 中提取{{1}} - 使用interact {}块:

{{1}}