У меня есть страница, которую я пытаюсь использовать с селеном (в python, но я понимаю, что это может относиться к другим языкам, в которых реализован Selenium).
Страница содержит разбитую на страницы таблицу ифильтр строки.
Действие, которое я пытаюсь выполнить, - найти строку в таблице и щелкнуть ссылку в этой строке. Чтобы избежать проблем с разбиением на страницы (моя строка может быть не видна в таблице), я заполняю фильтр, активирую фильтр, и тогда у меня будет разумное ожидание, что моя строка будет там. Если это не так, то я должен получить исключение, которое является приемлемым.
У меня две проблемы.
Во-первых, я мог перейти на эту страницу откуда угодно, в том числестр. Поэтому, когда я пытаюсь найти элемент фильтра, он может сделать это до завершения навигации, поэтому обнаруженный элемент фильтра оказывается устаревшим. Я подумал о том, чтобы сделать ограниченный цикл повторов, чтобы исключить устаревший элемент, но, как я вижу, это не рекомендуется, хотя я не могу найти жизнеспособную альтернативу.
Во-вторых, один разфильтр активирован, я ищу строку, используя wait.until
. Однако строка, возможно, уже была на первой странице разбитой на страницы таблицы, поэтому она находит ее немедленно, но затем фильтр выполняет магию ajax, и элемент становится устаревшим. Есть ли способ обнаружить изменение содержимого, поэтому мой wait.until
не включается, пока не будет выполнено изменение. В настоящее время я поставил thread.sleep(1)
после того, как фильтр активирован, чтобы дать возможность ajax работать, но я читал, что это тоже не здорово.
Мой код фильтра выглядит следующим образом, и показываетиспользование его через is_call_route_setup
.
Мой класс BasePage
дает мне некоторые основы, такие как доступ к веб-драйверу на self.driver
и предварительно настроенный WebDriverWait
, доступный на self.wait
.
Существует небольшая вероятность того, чтоприложение может вообще не использовать Ajax для применения фильтра и может просто использовать простой метод POST для получения результатов.
Существуют ли способы остановки операций, пока страница не выполнит свою операцию Ajax или POST?
class CallRoutingPage(BasePage):
def filter(self, filters):
"""Use the filter, but be sure to clear the filters first"""
default_filters = {
'filter_rule': None,
'filter_name': None,
}
new_filters = default_filters.copy()
new_filters.update(filters)
element = None
for name, value in new_filters.items():
element = self.wait.until(EC.element_to_be_clickable((By.NAME, name)),
message='Unable to locate filter input with name {}'.format(name))
element.clear()
if value is not None:
element.send_keys(value)
element.send_keys(Keys.ENTER) # can't use .submit, due to invalid form element in table markup
sleep(1) # wait for ajax to kick in so we don't locate stale elements
def is_call_route_setup(self, source: str, destination: str, clazz: str, host: str, status: str,
first_connection: str, route_name: str) -> Tuple[bool, Union[str, None]]:
"""Generic function to test if a call route has been set up"""
logger.debug('Verifying call route setup for route_name {}'.format(route_name))
# find a route by route name
self.filter({'filter_name': route_name})
try:
sleep(1) # manual sleep to prevent picking up the table cell before the refresh has executed
route_name_element = self.wait.until(EC.presence_of_element_located(
(By.XPATH, "//td[@class='tblcell'][text() = '{}']".format(route_name))
))
except TimeoutException:
return False, 'ROUTE_NAME_NOT_FOUND'
# more stuff happens after