【问题标题】:RSelenium will run when running each line individually but not when running in code chunksRSelenium 将在单独运行每一行时运行,但在代码块中运行时不会运行
【发布时间】:2020-12-26 00:04:10
【问题描述】:

我正在尝试学习 RSelenium 包,以便我可以自动从网页中提取数据。当我这样做时,我遇到了一个奇怪的错误。

 "no such element: Unable to locate element: {\"method\":\"css selector\",\"selector\":\"[name='rankings_table_length']\"}
(Session info: chrome=87.0.4280.88)

奇怪的是,当我单独运行每一行时,我能够完美地运行脚本,但是当我尝试以块或循环的形式运行这些行时,rselenium 无法找到元素。我知道我通过检查它们得到了正确的元素。有更多 RSelenium 经验的人知道为什么代码在单独运行每一行而不是在一个块中运行时可能工作吗?

下面的完整代码可重现性:

conn <- rsDriver(browser = "chrome",
                 port = 950L,
                 chromever = "87.0.4280.88")

chooseStat <- c("Total Offense", 
  "Total Defense", 
  "3rd Down Conversion Pct"
  )

year <- "2020"

conn$client$open()

conn$client$navigate("https://stats.ncaa.org/")

sportInput <- conn$client$findElement(using = "css", "[name = 'sport']")
sportInput$clickElement()
sportInput$sendKeysToElement(list("football", key = "enter"))

yearInput <- conn$client$findElement(using = "css", "[name = 'acadyr']")
yearInput$clickElement()
yearInput$sendKeysToElement(list(year, key = "enter"))

divInput <- conn$client$findElement(using = "css", "[name = 'u_div']")
divInput$clickElement()
divInput$sendKeysToElement(list("FBS", key = "enter"))

selectTeam <- conn$client$findElement(using = "css", "[id = 'stat_type_T_N']")
selectTeam$clickElement()

statInput <- conn$client$findElement(using = "css",
                                     "[id = 'Stats']")
statInput$clickElement()
statInput$sendKeysToElement(list(chooseStat[1], key = "enter"))

lenInput <- conn$client$findElement(using = "css selector",
                                "[name='rankings_table_length']")

lenInput$clickElement()
lenInput$sendKeysToElement(list("130", key = "enter"))



tbl <- conn$client$getPageSource()[[1]] %>% 
  readHTMLTable()

stat_tbl <- tbl$rankings_table

assign(str_replace_all(chooseStat[1], " ", "_"), stat_tbl)

【问题讨论】:

    标签: r selenium web-scraping rselenium


    【解决方案1】:

    这段代码是出现错误的地方:

    lenInput <- conn$client$findElement(using = "css selector",
                                    "[name='rankings_table_length']")
    

    这是因为此 CSS 选择器表示在其他 selenium 调用在该页面上操作之前未加载到网页上(因此无法操作)的元素的路径。这里真正的问题是网页反映这些操作(并加载该特定元素)所需的时间。

    我建议在整个代码中插入sys.sleep(2) 函数调用,以便在尝试操作元素之前加载元素。这应该使您能够将代码作为块运行,而不是逐行运行。告诉我你的进展情况。

    【讨论】:

    • 那行得通。我曾尝试添加 Sys.sleep(),但没有将其放在整个代码中。这样做似乎有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2017-10-20
    • 2011-11-17
    相关资源
    最近更新 更多