(Selenium / webscraping noob警告。)
selenium 3.141.0
chromedriver 78
MacOS 10.14.6
我正在整理一系列日期范围内的URL列表,以供以后下载。 URL在一个表中,该表显示附近日历上所选日期的信息。当用户单击日历上的新日期时,该表将使用新的URL列表进行异步更新;如果该日期不存在文件,则会使用<td class="dataTables_empty">
标记内的消息进行异步更新。
对于所需范围内的每个日期,我的代码单击日历,并使用WebDriverWait
和自定义expectation
来跟踪表中的第一个href
值何时更改(指示表已完成更新),然后抓取当天的网址。如果在给定日期没有可用的文件,则代码将寻找dataTables_empty
标记消失以指示下一个日期的URL已加载。
if current_first_uri != NO_ATT_DATA:
element = WebDriverWait(browser, 10).until_not(
text_to_be_present_in_href((
By.XPATH, first_uri_in_att_xpath),
current_first_uri))
else:
element = WebDriverWait(browser, 10).until_not(
EC.presence_of_element_located((
By.CLASS_NAME, "dataTables_empty")))
这在我所有的用例中都很好用,但有一个用例:如果连续两天或两天以上没有数据,则代码不会注意到表已刷新,因为dataTables_empty
类保留在表中(并且单元在所有其他方面都相同)。
在Chrome检查器中,当我从一个没有数据的日期单击到另一个日期时,相应的<td>
闪烁粉红色。这表明即使它们的值保持不变,这些值也正在更新。
问题:
更新:被接受的答案回答了两个问题中的后一个问题,我可以使用MutationObserver替换整个检测方案。
答案 0 :(得分:0)
我使用以下方法检查元素是否过时。通常期望为假。
同样的情况可能对您有所帮助。
isElementStale(driver, element) {
try:
wait = WebDriverWait(browser, 2)
element.isEnabled()
element = wait.until(EC.element_to_be_clickable(element))
if element != null:
return False
except:
print('')
return True
}
因此您可以将element传递给此方法,并检查它是否发生了任何变化
# element = Get First element
# Make changes that causes the refresh
if (isElementStale(driver, element)):
print('Element refreshed')
else:
print('Element Not refreshed')
答案 1 :(得分:0)
您可以使用MutationObserver:
predict()
获取表dom上次更改的时间:
driver.execute_script("""
new MutationObserver(() => {
window.lastRefresh = new Date()
}).observe(document.querySelector('table.my-table'), { attributes: true, childList: true, subtree: true } )
""")