即使元素的值不变,也要检测元素的刷新时间

时间:2019-10-30 20:02:56

标签: python selenium

(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>闪烁粉红色。这表明即使它们的值保持不变,这些值也正在更新。

问题:

  • Selenium中是否存在一种机制,即使该值没有更改,也可以检测到该值是否被刷新了
  • 如果不是,那么在问题用例中是否有关于如何确定表格的任何创意?我不想盲目等待一段时间。

更新被接受的答案回答了两个问题中的后一个问题,我可以使用MutationObserver替换整个检测方案。

2 个答案:

答案 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 } )
""")