Python Selenium: возникли проблемы с исправлением NoSuchElementException для определенной кнопки

Я пытаюсь нажать кнопку с селеном в питоне. Я не могу найти его с помощью селектора xpath или css.

Для остальных вещей в сценарии я использовал xpath, и он отлично работает, но xpath этой кнопки кажется относительным каждый раз, когда я его открываю. Поэтому я попытался получить доступ с помощью селектора css.

Элемент, к которому я пытаюсь получить доступ, выглядит так:

<button type = "button" data-dismiss = "modal" class = "btn btn-primary pull-right">Opret AnnonceAgent</button>

Селектор css из проверки в хроме:

#\35 d167939-adc2-0901-34ea-406e6c26e1ab > div.modal-footer > div > button.btn.btn-primary.pull-right

Дайте мне знать, если я должен опубликовать больше html.

Я пробовал много вопросов о переполнении стека и пробовал много вариантов селектора css, например, как:

  • driver.find_element_by_class_name('#\35 d167939-adc2-0901-34ea-406e6c26e1ab.div.modal-footer.div.button.btn.btn-primary.pull-rightdiv.button.btn.btn-primary-pull-right').click()

  • driver.find_element_by_class_name('div.button.btn.btn-primary-pull-right').click()

  • driver.find_element_by_class_name('button.btn.btn-primary-pull-right').click()

  • driver.find_element_by_class_name('btn.btn-primary-pull-right').click()

  • driver.find_element_by_class_name('btn-primary-pull-right').click()

Я также пробовал таймер сна.

Кнопка находится в окне, которое открывается при нажатии предыдущей кнопки с серым фоном, если это помогает. Картина.

# This opens up the window in which to press the next button (works fine)
button = driver.find_element_by_xpath('//*[@id = "content"]/div[1]/section/div[2]/button')
button.click()
driver.implicitly_wait(15)
time.sleep(5)
# This is what doesn't work
driver.find_element_by_class_name('button.btn.btn-primary-pull-right').click()

Я ожидаю, что программа нажмет кнопку, а она не нажимает, она просто сидит там.

Попробуйте это посмотреть, если это работает driver.find_element_by_css_selector('button.btn.btn-primary.‌​pull-right').click()

KunduK 08.04.2019 11:57

Спасибо, но все равно не работает. Я получаю AttributeError: 'list' object has no attribute 'click', предполагая, что это элемент [ы] - это было преднамеренно?

Bertil Johannes Ipsen 08.04.2019 12:00

это была опечатка.попробуйте еще раз driver.find_element_by_css_selector('button.btn.btn-primary.‌​pull-right').click()

KunduK 08.04.2019 12:01

Не работает, я понимаю NoSuchElementException

Bertil Johannes Ipsen 08.04.2019 12:03

Можете ли вы проверить, есть ли какая-либо рамка, которая блокирует поиск кнопки?

KunduK 08.04.2019 12:04

Если это общедоступная ссылка, можете ли вы поделиться URL-адресом, чтобы проверить, что там не так?

KunduK 08.04.2019 12:12

Это не так, так как вы должны войти в систему. Проверьте это, хотя - вы можете увидеть, как он находится внутри другого div, это то, что я должен учитывать? Картина. Редактировать: я выделил кнопку и то, что внутри.

Bertil Johannes Ipsen 08.04.2019 12:15
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
7
433
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

class_name получает один класс в качестве параметра, но вы используете синтаксис css в качестве локатора.

С css_selector

driver.find_element_by_css_selector('button.btn.btn-primary-pull-right')

Что означает тег <button> с 2 классами, btn и btn-primary-pull-right

С class_name

driver.find_element_by_class_name('btn-primary-pull-right')

@BertilJohannesIpsen Пожалуйста, уточните. Что именно произошло?

Guy 08.04.2019 13:13

Правильно, извините! У меня такое же исключение, NoSuchElementException: Message: no such element: Unable to locate element: {"method":"class name","selector":"btn-primary-pull-right"}, и аналогично для другого.

Bertil Johannes Ipsen 08.04.2019 13:25

@BertilJohannesIpsen Попробуйте добавить явное ожидание. Вы также должны проверить, находится ли кнопка в <iframe>

Guy 08.04.2019 13:30

спасибо, я уже пробовал и то, и другое (time.sleep(t) а также в треде @KajulKundu)

Bertil Johannes Ipsen 08.04.2019 13:35

Мое предположение было верным. Был iframe, который останавливался для доступа к элементу. Сначала вам нужно переключиться на iframe, чтобы получить доступ к элементу button. Попробуйте сейчас со следующим кодом.

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

#WebDriverWait(driver,20).until(expected_conditions.frame_to_be_available_and_switch_to_it((By.XPATH,'//iframe[starts-with(@id,"rdr_")]')))
WebDriverWait(driver,20).until(expected_conditions.frame_to_be_available_and_switch_to_it((By.XPATH,'//iframe[@id = "qualaroo_dnt_frame"]')))
driver.find_element_by_css_selector('button.btn.btn-primary').click()

Вы можете составить это слово? Когда я реализую это, я получаю TimeoutException.

Bertil Johannes Ipsen 08.04.2019 12:33

ну сделай одну вещь попробуй это WebDriverWait(driver,20).until(expected_conditions.frame_to_‌​be_available_and_swi‌​tch_to_it((By.XPATH,‌​'//iframe[@id = "quala‌​roo_dnt_frame"]'))) driver.find_element_by_css_selector('button.btn.btn-primary'‌​).click()

KunduK 08.04.2019 12:37

Хм, за это я снова получаю NoSuchElementException за кнопку.

Bertil Johannes Ipsen 08.04.2019 12:40

вы можете сделать одну вещь вместо изображения, можете ли вы поделиться html, чтобы я мог скопировать весь html и проверить на своем ноутбуке, что не так?

KunduK 08.04.2019 12:42

Это тот же html, который вы ищете? Я не могу найти здесь iframe, когда вижу html, однако, когда вы разместили изображение, он показывал iframe?

KunduK 08.04.2019 12:55

Ах, извините, это исходный код страницы, но материал, с которым мы работаем, отображается после javascript. Есть ли способ получить html с селеном, чтобы я мог отправить вам?

Bertil Johannes Ipsen 08.04.2019 12:58

Как только вы перейдете на страницу, нажмите F12 в Chrome и получите HTML

KunduK 08.04.2019 13:02
Ответ принят как подходящий

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

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btn.btn-primary.pull-right[data-dismiss='modal']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='btn btn-primary pull-right' and @data-dismiss='modal'][text()='Opret AnnonceAgent']"))).click()
    
  • Примечание: Вы должны добавить следующие импорты:

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

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