检测元素何时刷新,即使值没有改变

2024-04-26 23:51:39 发布

您现在位置:Python中文网/ 问答频道 /正文

(Selenium/webscraping noob警告。)

selenium 3.141.0
chromedriver 78
MacOS 10.14.6

我正在编译一个跨越一系列日期的url列表,以便以后下载。URL位于一个表中,该表显示附近日历上所选日期的信息。当用户单击日历上的新日期时,该表将使用新的URL列表进行异步更新,如果该日期不存在文件,则会在<td class="dataTables_empty">标记中显示一条消息。你知道吗

对于所需范围内的每个日期,我的代码都会单击日历,使用带有自定义WebDriverWaitexpectation跟踪表中第一个href值何时更改(表示表已完成更新),并抓取当天的URL。如果给定日期没有可用的文件,代码将查找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替换我的整个检测方案。


Tags: 文件代码标记url列表urielementcurrent
2条回答

我使用下面的方法来检查元素是否过时。通常预期为假。你知道吗

当你期待的是真的时候,同样的情况也会对你有所帮助。你知道吗

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 = Get First element
# Make changes that causes the refresh
if (isElementStale(driver, element)):
    print('Element refreshed')
else:
    print('Element Not refreshed')

你可以使用变异观察者:

driver.execute_script("""
  new MutationObserver(() => {
    window.lastRefresh = new Date()
  }).observe(document.querySelector('table.my-table'), { attributes: true, childList: true, subtree: true } )
""")

并获取上一次更改表dom的时间:

lastRefresh = driver.execute_script("return window.lastRefresh")

相关问题 更多 >