问题描述
div class for the calendar item that is refreshed
我有一个在页面上使用 Selenium 运行无头 chromedriver/chromium 的刮刀,可以从日历元素中抓取特定日期。以前,scraper python 代码运行得很好,但现在用于抓取突出显示的类“passholder_reservation_calendar”下的任何子元素的 Xpath 无法定位元素。
我在检查页面时注意到突出显示的 div 每秒闪烁紫色约 4 次,这表明幕后数据几乎不断刷新。我需要在这个父元素下面抓取各种数据和按钮等,但没有一个典型的技巧起作用。我相信这可能是因为 Selenium 不相信这些元素存在,因为它们会不断刷新。 该元素之外的任何其他元素都可以按照正常的抓取方式定位而不会出现任何问题。
-在 webdriver 上使用 execute_script 来确保查看/执行命令,包括:
driver.execute_script("arguments[0].scrollIntoView();",element)
driver.execute_script("arguments[0].click();",element)
-使用我通常用来等待动态元素条件的各种等待命令:
我认为使用具有足够高的超时值和 0.1 秒的重试率并忽略相关异常的流畅等待可能会在元素刷新之前通过 Xpath 定位/抓取元素,但没有运气。
正常:
wait.until(EC.presence_of_element_located/clickable/visible etc((By.XPATH,"element")))
无论使用哪个路径/class_name/id/css_selector,每次都会抛出超时异常,添加任何 time.sleep() 命令都无济于事。我认为这个问题与页面加载速度无关,而是与 javascript 与该元素的交互有关。
我以为我可以使用操作链移动到元素或悬停/单击等,但任何形式的操作链也失败,包括停止页面加载或发送转义键命令:
webdriver.ActionChains(driver).send_keys(Keys.ESCAPE).perform()
任何版本的 Xpath 包括:
'//descendant::(any type)'
'//*'
'//[@class="passholder_reservations__calendar__days"]'
无法在任何版本的 find_elements_by_xpath 中获取父级下方的任何元素并返回长度为 0 的列表 - 我相信是因为无法获取更新元素下方的任何元素
我想知道是否有任何方法可以直接与特定元素上的 javascript 交互并暂时暂停任何后台进程以抓取元素并单击以与页面交互。
根据我对此所做的研究,似乎在 chromedriver 实例上禁用 javascript 的任何选项都会破坏 Selenium 和/或 webdriver,并且不允许在不打开另一个新驱动程序的情况下在当前会话中重新启用 javascript>
我当前的 webdriver.Chrome 选项:
options = Options()
options.add_argument('--window-size=1920x1080')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--headless')
options.add_argument('--no-sandBox')
options.add_argument('--single-process')
options.add_argument('--disable-extensions')
options.add_argument('--start-maximized')
options.add_argument('--disable-gpu')
options.add_argument('--allow-running-insecure-content')
options.add_argument('--disable-extensions')
options.page_load_strategy = 'eager'
有谁知道在 Selenium Python 实例中是否存在运行 javascript 函数的有效选项,该函数可能允许与页面元素进行交互?在正常的 chrome 检查视图中是否有一个相当于“中断”“属性修改”的调用来暂停元素,可以在 Selenium 中调用?
最好能够暂时暂停任何 javascript 然后重新启用
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)