Селен (Python) - Проверка параметра рядом с ЭТИКЕТКОЙ и вставка значения ИЛИ выбор параметра - PullRequest
0 голосов
/ 28 апреля 2020

IF хотел бы создать общий c код (с помощью Selenium), который будет искать метку и находить рядом с тегом ввода метки (ИЛИ select) и вставлять значение.

Основная функция:

for l in label: 
        try:
            xpathInput = "//label[contains(.,'{}')]/following::input".format(l)

            checkXpathInput, pathInput= check_xpath(browser,xpathInput)

            if checkXpathInput is True:
                pathInput.clear()
                pathInput.send_keys("\b{}".format(value))
                break

            for op in option:

                xpathSelect = "//label[contains(.,'{}')]/following::select/option[text()='{}']".format(l,op)
                checkXpathSelect, pathSelect= check_xpath(browser,xpathSelect)

                if checkXpathSelect is True:
                    pathSelect.click()
                    break


        except:
            print("Can't match: {}".format(l)) 

Проверка пути:

def check_xpath(browser,xpath):
    try:
        path = browser.find_element_by_xpath(xpath)
    except NoSuchElementException:
        return False
    return True , path

Какова текущая проблема?

  • Мне нужно, чтобы LABEL был, например, TITLE Код проверит, что рядом с меткой «Заголовок» есть метка NO input, а затем он go и проверит, есть ли метка select рядом с меткой «Заголовок» и т. д. c ....

В моем текущем случае он найдет метку «Заголовок» и затем введет значение для первого следующего ввода (что неверно, поскольку «Заголовок» использует тег SELECT)

1 Ответ

1 голос
/ 28 апреля 2020

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