Нажмите на ярлык Автоматизация Selenium

У меня проблемы с возможностью выбрать опцию RUC в этом программном обеспечении с селеном, метки не содержат идентификаторов, которые их различают, и классы одинаковы:

HTML-элементы

Я использую следующий код, но он не работает для меня:

label_tipo_documento = driver.find_element_by_xpath('//div[@id = "form-group-tipo_documento"]//div[@class = "col-sm-3"]//label[@class = "radio-inline"][2]')
print(label_tipo_documento.text)
label_tipo_documento.click()

Я пытаюсь выбрать второй вариант среди меток [2] (RUC) и получаю следующее сообщение:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@id = "form-group-tipo_documento"]//div[@class = "col-sm-3"]//label[@class = "radio-inline"][2]"}
  (Session info: chrome=87.0.4280.88)

Однако, когда я делаю это с [1] вместо [2], он находит значение:

DNI
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 148
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Используйте следующий xpath, чтобы нажать на 2-й переключатель.

label_tipo_documento = driver.find_element_by_xpath("//label[./input[@value='RUC']]")
print(label_tipo_documento.text)
label_tipo_documento.click()

Если вы хотите использовать индексацию, попробуйте этот код.

label_tipo_documento = driver.find_element_by_xpath('(//div[@id = "form-group-tipo_documento"]//div[@class = "col-sm-3"]//label[@class = "radio-inline"])[2]')
print(label_tipo_documento.text)
label_tipo_documento.click()

Это сработает, возможно, лучше использовать find_elements_by_xpath, а затем выполнять индексацию в python, а не в xpath.

DMart 10.12.2020 17:32
//div[@id = "form-group-tipo_documento"]//div[@class = "col-sm-3"]//label[@class = "radio-inline"][2]

Означает, что вы хотите выбрать вторую метку потомка узла div (у него только одна метка потомка). Пока вам нужно выбрать второе вхождение метки. Так что либо попробуй

label_tipo_documento = driver.find_element_by_xpath('(//div[@id = "form-group-tipo_documento"]//div[@class = "col-sm-3"]//label[@class = "radio-inline"])[2]')

или

label_tipo_documento = driver.find_elements_by_xpath('//div[@id = "form-group-tipo_documento"]//div[@class = "col-sm-3"]//label[@class = "radio-inline"]')[1]

Доброе утро.

Итак, основываясь на вашем изображении, я считаю, что xpath вам понадобится это.

# XPATH
//div[contains(@id, 'tipo_documento')]//label[@class='radio-inline']//input[@value='DNI']

На основе этого xpath вы должны создать переменную для radio button, которую вы хотите щелкнуть, а затем выполнить ее с помощью следующей команды.

myValue = "DNI"
driver.find_element(By.XPATH, "//div[contains(@id, 'tipo_documento')]//label[@class='radio-inline']//input[@value='{0}']".format(myValue)).click()

Основываясь на этом коде, вы можете изменить «DNI» на «RUC» или «CEX», и все будет готово.

Ответ принят как подходящий

Чтобы щелкнуть элемент, связанный с текстом как RUC, вы можете использовать любую из следующих стратегий локатора:

  • Использование css_selector вместо <input>:

    driver.find_element_by_css_selector("div#form-group-tipo_documento label.radio-inline > input[value='RUC']").click()
    
  • Использование текста xpath и <label>:

    driver.find_element_by_xpath("//div[@id='form-group-tipo_documento']//label[@class='radio-inline' and contains(., 'RUC')]/input").click()
    

В идеале, чтобы щелкнуть элемент, вам нужно вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать одну из следующих стратегий локатора:

  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div#form-group-tipo_documento label.radio-inline > input[value='RUC']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='form-group-tipo_documento']//label[@class='radio-inline' and contains(., 'RUC')]/input"))).click()
    
  • Примечание. Вы должны добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Рекомендации

Вы можете найти пару соответствующих обсуждений NoSuchElementException в:

Другие вопросы по теме