Python Selenium: возникают проблемы с исправлением исключения NoSuchElementException для определенной кнопки - PullRequest
2 голосов
/ 08 апреля 2019

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

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

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

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

Селектор css из inspect в chrome:

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

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

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

  • 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()

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

Ответы [ 3 ]

1 голос
/ 08 апреля 2019

Требуемый элемент находится в Модальном диалоговом окне , поэтому вам нужно настроить 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
    
0 голосов
/ 08 апреля 2019

Мое предположение было правильным. Был 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()
0 голосов
/ 08 апреля 2019

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