通过递归遍历所有页面

时间:2016-07-31 10:00:43

标签: scala selenium recursion

我有几个页面,我想通过递归遍历所有页面:

所以我有这个isNextPageExist函数来检查我是否有另一个页面要访问:

  def isNextPageExist(): Boolean = {

  }

获取单击WebElement的下一页功能并进入下一页:

  def getNextPage(): Unit = {

  }

现在在这个函数里面我想访问第一页并做我的东西,如果我有另一个页面一次又一次地调用该函数,并在每个页面内进行一些计算并返回Double“< / p>

def getAllPages(value: Double):Double = {

  if(isNextPageExist)  
     // get all elements form page inside `value`
     getNextPage // get the next page
     getAllPages(value) // call the function again
}

用法:

getAllPages(0.0)

这只是pseudo代码,我很乐意为您提供帮助。

2 个答案:

答案 0 :(得分:1)

David,如果您的函数命名为getNextPage(),请尽量避免{{x.name}}返回类型。更好地使用Option [Page]并返回Some(page)或None。 但最简单的代码可能更像是:

Unit

然后你用第一个网页调用它 case class Page(url:String) def calculateValue:Double = {here you calculate your value on the current page} def processPage(page: Option[Page]):List[Double]{ page match{ case Some(p) => { driver.get(page.url) val linksToNextPage = driver.findElements(By.xpath("//your xpath goes here") if(linksToNextPage.size > 0){ val nextPageLink = Page(linksToNexPage.head.getText()) calculateValue() :: processPage(Some(Page(nextPageLink)) } else{ calculateValue() :: processPage(None) } } case None => Nil } ,在结果中,您将获得为每个页面计算的值列表。 我的代码也是一个伪代码,但你应该能够使它工作。

答案 1 :(得分:0)

我的解决方案是不使用Java迭代器界面样式。它是无状态的,因此您需要明确地跟踪页面。 case class Page包含有关您要跟踪的网页的信息。

case class Page()

def getNextPage(currentPage: Page): Option[Page] = { ... }

def getAllPages(currentPage: Page, value: Double, acc: List[Page]): List[Page] {
... // some calculations
  getNextPage(currentPage) match {
    case Some(p) =>  getAllPages(p, value, p :: acc)
    case None => acc
  }
}