Selenium не может найти ни одного элемента с помощью css, xpath, имени, идентификатора (python)

#python #html #selenium #authentication #automation

#питон #HTML #селен #идентификация #автоматизация

Вопрос:

Я хочу войти на форум, уже обошел сообщение cookie, переключившись на его iframe, но я не могу получить доступ ни к чему на странице. Это мой код:

 #set path, open firefox path = r'C:UsersAnwenderDownloadsgeckodriver-v0.30.0-win64geckodriver.exe' driver = webdriver.Firefox(executable_path=path)  #open bym forum driver.get('https://www.bym.de/forum/') driver.maximize_window()  #deal with cookie wait = WebDriverWait(driver,20) wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[title='SP Consent Message']"))) wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"button[title='Zustimmen']"))).click() driver.implicitly_wait(30)  

Пока все идет хорошо. Теперь появляется тонна объявлений. Я пытаюсь войти в систему:

 username = driver.find_element_by_id('navbar_username') username.send_keys("name") password = driver.find_element_by_id('navbar_password') password.send_keys("pw") driver.find_element_by_xpath("/html/body/div[1]/div[2]/main/div[3]/div[1]/ul/li[2]/form/fieldset/div/div/input[4]").click()  

Я пробовал разные варианты этого, используя селектор css или xpath. Не сработало. Затем я попробовал подождать 20 секунд, пока все загрузится. Не сработало. Я попытался получить доступ к другому элементу (к подфоруму). Не сработало. Я пытался:

 try:  wait.until(  EC.presence_of_element_located((By.ID, "navbar_username"))  ) finally:  driver.quit()  

Селен просто не может найти этот элемент, браузер просто закрыт. Я искал iframes, но не смог найти их в html. Возможно ли, что я даже не нахожусь в главном «окне»? «Подстава»? «Сайт»? Я не знаю, как это назвать.

Любая помощь будет очень признательна!

Ответ №1:

Вы переключились на iframe и закрыли его, но так и не переключились обратно! Селен все еще находится в закрытом и отсутствующем iframe. Переключитесь обратно на главную страницу, используя:

 driver.switch_to.default_content()