Как я могу убедиться, что некоторые элементы HTML загружены для Selenium + Python?
Исходя из этой ссылки, я предполагаю, что 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&o=1">Symbol</a></th>
<th id="f13" style="width: 267px;"><a href="t/?i=614&o=2">Name</a></th>
</tr>
</thead>
</table>
2 ответа
В соответствии с вашими испытаниями кода вы используете ChromeDriver и Chrome Browser для автоматизации шагов. Как вы настроили set_page_load_timeout(10)
Возникает исключение тайм-аута, поскольку страница не была полностью загружена в течение периода, настроенного через 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
: Ожидание проверки элемента является видимым и включенным, так что вы можете щелкнуть по нему.
В соответствии с вариантом использования, который вы упомянули, вы можете составить список всех
<th>
элементы, видимые в дереве DOM, ожидающие настраиваемого количества времени, вызывающего 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, используемым только для демонстрационных целей.
Я нашел ответ, проверив поведение загрузки HTML.
По сути, HTML загружается вверх ногами, это значит, что я просто должен проверить, есть ли элемент за элементом, например, если после него появляется другой элемент, просто проверьте, представлен ли другой элемент или нет. Если да, то все элементы должны быть загружены.