Selenium(RSelenium)点击刚查询元素报StaleElementReference错误原因咨询
问题原因分析
- 核心原因是关闭单个通知触发了Shiny通知面板的全量DOM重绘
你提前批量查找到了所有通知的关闭按钮存储在buttons变量中,当你点击第一个按钮关闭对应通知后,Shiny会自动重绘整个shiny-notification-panel节点,移除已关闭的通知、重新排布剩余通知的DOM结构。此时你之前查找的剩余按钮引用,指向的都是重绘前已经被销毁的旧DOM节点,哪怕页面上通知看起来还存在,对应的DOM元素已经是全新的节点,所以触发StaleElementReferenceException报错。 - 次要原因是XPath语法不规范,可能匹配到不稳定节点
你使用的XPath//[@id='shiny-notification-panel']///div[contains(text(),'×')]存在两处不规范写法:- 开头
//[@id缺少节点通配符,正确写法为//*[@id='shiny-notification-panel'] - 中间
///属于无效XPath层级语法,应该替换为标准的//
不规范的XPath可能匹配到临时渲染的异常节点,进一步提升元素引用失效的概率。
- 开头
修复方案
不要提前批量查找所有关闭按钮,改为每次循环只查找并点击第一个存在的关闭按钮,点击后重新查找下一个,规避DOM重绘导致的引用失效问题:
close_notifications <- function() { while(TRUE) { # 每次操作前重新查找当前页面的通知关闭按钮 close_btns <- remDr$findElements(using = "xpath", "//*[@id='shiny-notification-panel']//div[contains(text(),'×')]") # 没有可关闭的通知时退出循环 if(length(close_btns) == 0) break close_btns[[1]]$clickElement() # 可选添加短延时,等待Shiny完成DOM重绘,避免偶发报错 Sys.sleep(0.1) } }
内容的提问来源于stack exchange,提问作者mpartan
相关产品推荐
相关产品推荐

