我有几个页面,我想通过递归遍历所有页面:
所以我有这个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
代码,我很乐意为您提供帮助。
答案 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
}
}