Перебирать страницы с помощью geb / selenium - PullRequest
0 голосов
/ 29 января 2020

Я хочу перебрать список страниц, проверяя содержимое каждой страницы

С GEB я бы хотел перебрать, например. https://github.com/trending Затем перейдите на каждую страницу в тренде и проверьте заголовок, а затем перейдите к следующей странице.

Однако ошибка org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document беспокоит меня.

@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. Но мне не ясно, как я могу перемещаться между страницами и go по моему списку страниц, например. ProviderPage #2

1 Ответ

0 голосов
/ 30 января 2020

Проблема заключается в следующем:

  • На странице обзора вы переходите на другую страницу, затем используете «браузер назад», т. Е. Страница обзора загружается снова (хотя, возможно, из кеша браузера).
  • Но, тем не менее, вы обращаетесь к навигаторам с момента первой загрузки страницы обзора, перебирая их с помощью each. Это означает, что элементы уже устарели.

Вместо этого вы должны получить всю информацию, необходимую для перебора списка при первом открытии страницы обзора. Это также сэкономит время и сделает «браузер обратно» совершенно ненужным. Это работает для меня:

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 тестовый класс. Просто удалите части, которые вам не нужны, если вы хотите выполнить код из скрипта (я никогда этого не делаю).

Кстати, во время написания теста выдается следующее:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...