RSelenium 将 运行 当 运行 单独地每一行而不是 运行 在代码块中
RSelenium will run when running each line individually but not when running in code chunks
我正在尝试学习 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)
这段代码是出现错误的地方:
lenInput <- conn$client$findElement(using = "css selector",
"[name='rankings_table_length']")
这是因为此 CSS 选择器表示在其他 selenium 调用在该页面上操作之前未加载到网页上(因此无法操作)的元素的路径。这里真正的问题是网页反映这些操作(并加载该特定元素)所花费的时间。
我建议在整个代码中插入 sys.sleep(2)
函数调用,以便在尝试对元素进行操作之前加载这些元素。这应该使您能够 运行 您的代码作为一个块,而不是逐行。让我知道你过得怎么样。
我正在尝试学习 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)
这段代码是出现错误的地方:
lenInput <- conn$client$findElement(using = "css selector",
"[name='rankings_table_length']")
这是因为此 CSS 选择器表示在其他 selenium 调用在该页面上操作之前未加载到网页上(因此无法操作)的元素的路径。这里真正的问题是网页反映这些操作(并加载该特定元素)所花费的时间。
我建议在整个代码中插入 sys.sleep(2)
函数调用,以便在尝试对元素进行操作之前加载这些元素。这应该使您能够 运行 您的代码作为一个块,而不是逐行。让我知道你过得怎么样。