Обнаружение, когда элемент обновляется, даже если значение не изменяется - PullRequest
1 голос
/ 30 октября 2019

(предупреждение о селене / веб-скопировании.)

selenium 3.141.0
chromedriver 78
MacOS 10.14.6

Я составляю список URL-адресов по диапазону дат для последующей загрузки. URL-адреса находятся в таблице, которая отображает информацию о дате, выбранной в ближайшем календаре. Когда пользователь щелкает новую дату в календаре, таблица обновляется асинхронно с новым списком URL-адресов или - если файлов на эту дату не существует - с сообщением внутри тега <td class="dataTables_empty">.

Для каждогодата в желаемом диапазоне, мой код щелкает по календарю, используя WebDriverWait с пользовательским expectation, чтобы отслеживать изменение первого значения 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> мигает розовым. Это говорит о том, что значения обновляются, даже если их значения остаются прежними.

Вопросы:

  • Есть ли в Selenium механизм для определения того, что значениебыло обновлено , даже если оно не изменилось ?
  • Если нет, какие-нибудь творческие идеи о том, как определить, обновилась ли таблица в случае проблемного использования? Я не хочу ждать вслепую в течение некоторого произвольного промежутка времени.

ОБНОВЛЕНИЕ: Принятый ответ ответил на последний из двух вопросов, и я смогзаменить всю мою схему обнаружения с помощью MutationObserver.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Вы можете использовать MutationObserver:

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")
0 голосов
/ 31 октября 2019

Я использую этот метод ниже, чтобы проверить, устарел ли элемент или нет. Обычно ожидая ложного.

То же самое может помочь в вашем случае, когда вы ожидаете истину.

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...