Как я могу убедиться, что некоторые элементы HTML загружены для Selenium + Python? - PullRequest
0 голосов
/ 03 мая 2018

Исходя из этой ссылки, я предполагаю, что DOM сначала должен быть загружен целиком в RAM.

Как DOM работает / загружается? (в HTML)

Но затем я тестирую в Selenium с исключением тайм-аута. Кажется, даже исключение тайм-аута возникает, некоторые элементы уже могут быть найдены, так что это не пустой объект.

Но мне интересно, как я могу убедиться, что некоторые элементы уже загружены? Например. пример HTML, как я могу убедиться, что все элементы <th> загружены? Учитывая тот факт, что я на самом деле не знаю количество элементов <th>.

Пробный код:

driver = webdriver.Chrome()
driver.set_page_load_timeout(10)
try:
    driver.get(url)
    print('load success!')
except TimeoutException:
    print(self.page_source)

Пример HTML:

<table width="910" border="0" cellpadding="3" cellspacing="0" id="fth1_" class="fth1_" style="display: none; position: fixed; top: 29px; left: 99px;">
     <thead style="background-color: rgb(233, 233, 233);">
        <tr align="center">
           <th id="f13" style="width: 121px;"><a href="t/?i=614&amp;o=1">Symbol</a></th>
           <th id="f13" style="width: 267px;"><a href="t/?i=614&amp;o=2">Name</a></th>
        </tr>
     </thead>
</table>

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Я нашел ответ, проверив поведение загрузки HTML.

По сути, HTML-код загружается вверх ногами, поэтому мне просто нужно проверить, есть ли элемент за элементом, например, если после этого появляется другой элемент, просто проверьте, представлен ли другой элемент или нет. Если да, то все элементы должны быть загружены.

0 голосов
/ 03 мая 2018

В соответствии с испытаниями кода вы используете ChromeDriver и Браузер Chrome до Автоматизация шагов. Поскольку вы настроили set_page_load_timeout(10), исключение timeout возникает, поскольку страница не была полностью загружена в течение периода, настроенного с помощью set_page_load_timeout(). Но так как вы вызвали print(self.page_source), элементы, отображаемые в частично визуализированном HTML DOM , извлекаются.

Теперь о ваших индивидуальных запросах:

  • How can I make sure some elements are already loaded?: идеальный тестовый сценарий будет иметь определенный шаг, например для проверки наличия элемента, для проверки видимости элемента или для проверки интерактивности (при щелчке) элемента. С этой точки зрения проверка того, что элементы уже загружены, может не включать требуемый элемент. Следовательно, вместо таких более широких критериев поиска вам необходимо сузить свои критерии поиска до некоторой определенной вещи, например

    • Заголовок страницы
    • Заголовок страницы
    • Наличие оповещения
    • Атрибут элемента
    • Наличие элемента
    • Наличие группы элементов
    • Видимость элемента
    • Видимость группы элементов
    • Кликабельность элемента
    • StalenessOf элемента
    • FrameToBeAvailableAndSwitchToIt

Реализация этих суженных критериев поиска может сэкономить время выполнения с помощью WebDriverWait в сочетании с expected_conditions.

  • How can I make sure all elements are loaded?: Опять же, наши тесты должны быть сосредоточены только на элементе / элементах, с которыми нам нужно взаимодействовать, и не проверять состояние / состояние других элементов, которые не представляют нашего интереса.

  • Теперь, следуя двум пунктам, упомянутым выше, это 3 наиболее часто используемых варианта использования :

    • presence_of_element_located: ожидание проверки наличия элемента в DOM страницы. Это не обязательно означает, что элемент видим.
    • visibility_of_element_located: ожидание проверки наличия элемента в DOM страницы и его видимости. Видимость означает, что элемент не только отображается, но и имеет высоту и ширину, превышающие 0.
    • element_to_be_clickable: Ожидание проверки элемента является видимым и включенным, так что вы можете щелкнуть по нему.
  • В соответствии с usecase , который вы упомянули, вы можете создать List всех <th> элементов, видимых в DOM Tree при ожидании настраиваемого количества времени, вызывающего WebDriverWait следующим образом:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC 
    
    headerList = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@class='fth1_' and @id='fth1_']/thead/tr//th")))
    

Примечание : xpath , использованный на этой иллюстрации, представляет собой образец xpath , используемый только для демонстрационных целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...