Кнопка входа не может быть найдена с селеном - PullRequest
0 голосов
/ 08 ноября 2019

https://www.sevenonemedia.de/tv/programm/programmwochen

Здесь я хочу войти:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

options = Options()
chrome_path = "T:/Markus/WebScrapingExample/Chromedriver/chromedriver.exe"
driver = webdriver.Chrome(executable_path=chrome_path,chrome_options=options)
driver.set_window_size(1280, 720) 

time.sleep(5)
driver.get("https://www.sevenonemedia.de/tv/programm/programmwochen")
driver.find_element_by_id("_58_login").send_keys("name")
driver.find_element_by_id("_58_password").send_keys("pw")
driver.find_element_by_xpath('//*[@id="sign-in-button"]').click()

ElementNotInteractableException: element not interactable
  (Session info: chrome=78.0.3904.97)

Это моя ошибка enter image description here

Идентификатор есть. Почему это происходит?

Ответы [ 4 ]

0 голосов
/ 08 ноября 2019

Проблема в том, что ваш локатор кнопок не уникален на странице. Он находит две кнопки, первая из которых не видна, что вызывает ElementNotInteractableException.

. Простое исправление состоит в том, чтобы использовать селектор CSS ниже

#main-content #sign-in-button

, который найдет только кнопкуты хочешь. Таким образом, ваши последние несколько строк кода будут

driver.find_element_by_id("_58_login").send_keys("name")
driver.find_element_by_id("_58_password").send_keys("pw")
driver.find_element_by_css_selector('#main-content #sign-in-button').click()
0 голосов
/ 08 ноября 2019

Эта страница содержит дубликат элемента с идентификатором sign-in-button. Если ваш селектор указывает на более чем один элемент, драйвер всегда берет первый из вершины DOM, который в этом случае не взаимодействует. Вы должны обратиться ко второму элементу с этим идентификатором. Попробуйте этот селектор для кнопки «Войти»:

//*[@id="aheadcustom_p_p_id_58"]//button
0 голосов
/ 08 ноября 2019

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

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

    driver.get("https://www.sevenonemedia.de/tv/programm/programmwochen")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@title='Anmelden' and not(contains(@name,'INSTANCE'))]"))).send_keys("a.mai@mediaplus.com")
    driver.find_element_by_xpath("//input[@title='Passwort' and not(contains(@name,'INSTANCE'))]").send_keys("Edidaten17")
    driver.find_element_by_xpath("//input[@title='Passwort' and not(contains(@name,'INSTANCE'))]//following::button[1]").click()
    
  • Примечание : необходимо добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Снимок браузера:

successful.png

0 голосов
/ 08 ноября 2019

Привет, во-первых, вы не должны сообщать свой пароль всему сообществу stackoverflow :)

вы не можете нажать на кнопку, потому что в нижней части страницы есть всплывающее окно, и вы должны нажатьсначала для селена он скрывает вашу кнопку

в последнюю очередь, это полный код? если да, то вы забыли

driver = webdriver.Firefox() #or any other webdriver

вы не создали драйвер без этой строки

EDIT !!

он работал не только с вышеуказанной модификацией, но с этойэто хорошо

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time


time.sleep(5)
driver = webdriver.Firefox()
driver.get("https://www.sevenonemedia.de/tv/programm/programmwochen")
driver.find_element_by_id("_58_login").send_keys("login")
driver.find_element_by_id("_58_password").send_keys("pssd")
driver.find_element_by_xpath("/html/body/div[1]/div/div/div[2]/a").click()
driver.find_element_by_css_selector("#_58_fm > fieldset:nth-child(1) > div:nth-child(6) > button:nth-child(1)").click()

эта работа:)

когда-нибудь CSS-селектор безопаснее и лучше работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...