首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用geb/selenium遍历页面

使用geb/selenium遍历页面
EN

Stack Overflow用户
提问于 2020-01-29 07:32:07
回答 1查看 289关注 0票数 0

我想遍历页面列表,验证每个页面的内容

使用GEB,我想迭代遍历eg。然后,https://github.com/trending访问trending中的每一页并验证标题,然后继续下一页。

然而,org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document错误困扰着我。

代码语言:javascript
复制
@Grapes([
    @Grab('org.gebish:geb-core:3.3'),
    @Grab('org.seleniumhq.selenium:selenium-support:3.141.59'),
    @Grab('org.seleniumhq.selenium:selenium-chrome-driver:3.141.59'),
    @GrabExclude('org.codehaus.groovy:groovy-all:2.5.9')])
import geb.Browser
import geb.navigator.Navigator
import groovy.transform.CompileStatic
import groovy.transform.TypeChecked
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver

import geb.Page

import static geb.Browser.drive

System.setProperty("webdriver.chrome.driver","/Users/v/Downloads/chromedriver")
def chromeDriver = new ChromeDriver()
println chromeDriver.getSessionId()
drive(driver: chromeDriver, baseUrl: "https://github.com") { 
    to ProviderListPage
    Navigator pages = list()
    pages.each {
        to ProviderPage, it.attr("href").split('/').reverse()[1],it.attr("href").split('/').reverse()[0]
        waitFor { 5 }
        driver.navigate().back()
    }
    driver.quit()
}

class ProviderListPage extends Page {
    static url = "/trending"

    static content = {
        providers { $(".h3 a") }
    }
    def list() {
        return providers
    }

}
class ProviderPage extends Page {
    static content = {
        heading { $(".h3 a").text() }
    }
    def waitForHeading() {
        waitFor { assert $(".h3 a") }
    }
}

这是我的例子,每个人都可以复制。仅更改webdriver.chrome.driver

我确实理解页面从ListPage更改为ProviderPage #1并导致错误:StaleElementReferenceException。但我不清楚的是,我如何能够在页面之间来回导航,并浏览我的页面列表。ProviderPage #2

EN

回答 1

Stack Overflow用户

发布于 2020-01-30 10:42:27

问题是:

  • 从概览页导航到另一个页面,然后使用"browser back",即再次加载概览页(即使可能是从浏览器缓存)。
  • 但您仍然引用第一次加载概览页时的导航器,通过each遍历它们。这意味着元素已经过时。

相反,您应该在第一次打开概述页面时获得迭代列表所需的所有信息。这也将节省时间,并使“浏览器返回”完全多余。这对我来说很有效:

代码语言:javascript
复制
package de.scrum_master.stackoverflow.q59958656

import geb.spock.GebReportingSpec

class GitHubTrendingIT extends GebReportingSpec {
  def test() {
    given:
    browser.baseUrl = "https://github.com"
    def providerListPage = to ProviderListPage
    report "provider list page"
    providerListPage
      .list()
      .collect {
        def pageInfo = it.attr("href").split('/').reverse()
        [pageInfo[1], pageInfo[0]]
      }
      .each {
        println "trending page = $it"
        to ProviderPage, it[0], it[1]
        report "trending page"
      }

    expect:
    true
  }
}

我将代码封装到一个Groovy测试类中。如果你想从脚本中执行代码,只需要删除你不需要的部分(我从来不这样做)。

顺便说一句,在编写本文时,测试将打印以下内容:

代码语言:javascript
复制
trending page = [wuhan2020, WebApp]
trending page = [oldboyxx, jira_clone]
trending page = [wuhan2020, wuhan2020]
trending page = [microsoft, ApplicationInspector]
trending page = [wuhan2020, api-server]
trending page = [lispczz, pneumonia]
trending page = [sundowndev, hacker-roadmap]
trending page = [binhnguyennus, awesome-scalability]
trending page = [puppeteer, puppeteer]
trending page = [nicrusso7, rex-gym]
trending page = [smicallef, spiderfoot]
trending page = [willmcgugan, rich]
trending page = [SwiftDocOrg, swift-doc]
trending page = [outflanknl, Scripts]
trending page = [globalcitizen, 2019-wuhan-coronavirus-data]
trending page = [sam-hosseini, freelancing-in-finland]
trending page = [hzwer, shareOI]
trending page = [sebastianruder, NLP-progress]
trending page = [giswqs, earthengine-py-notebooks]
trending page = [aamini, introtodeeplearning]
trending page = [Kethku, neovide]
trending page = [redcanaryco, atomic-red-team]
trending page = [baowenbo, DAIN]
trending page = [joeycastillo, The-Open-Book]
trending page = [meik97, XSpotify]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59958656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档