Я бы использовал тот факт, что find_elements_by_xpath
возвращает список найденных элементов, а пустые списки являются ложными. Поэтому вам не понадобится попытка / исключение и функция, которая возвращает значения bool
или tuple
(что не является наиболее оптимальным поведением).
Было бы легче дать хороший ответ с некоторыми html исходный пример, но я предполагаю, что вы хотели бы сделать следующее:
def handle_label_inputs(label, value):
# if there is a such label, this result won't be empty
found_labels = driver.find_elements_by_xpath('//label[contains(.,"{}")]'.format(label))
# if the list is not empty
if found_labels:
l = found_labels[0]
# any options with the given value as text
following_select_option_values = l.find_elements_by_xpath('./following::select//option[text()="{}"]'.format(value))
# any inputs next to the label
following_inputs = l.find_elements_by_xpath('./following::input')
# did we find an option?
if following_select_option_values:
following_select_option_values[0].click()
# or is there an input?
elif following_inputs:
in_field = following_inputs[0]
in_field.clear()
in_field.send_keys(value)
else:
print("Can't match: {} - {}".format(label, value))
driver.get('http://thenewcode.com/166/HTML-Forms-Drop-down-Menus')
handle_label_inputs('State / Province / Territory', 'California')
Я не знаю, насколько аккуратна страница, с которой вы работаете, но если она хорошо сделана, тогда ваш ярлык должен иметь атрибут for="something"
. Если это так, то вы можете просто найти label-related-element и выяснить, введен ли его тег (или выбрать):
related_element_if_done_properly = driver.find_elements_by_xpath('//*[@id="{}"]'.format(label_element.get_attribute("for")))
if related_element_if_done_properly:
your_element = related_element_if_done_properly[0]
is_input = your_element.tagname.lower() == "input"
else:
print('Ohnoes')