Niewłaściwy kod źródłowy strony zamiast formularza logowania na Librusie

Niewłaściwy kod źródłowy strony zamiast formularza logowania na Librusie
BE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
1

Próbuję zrobić web scraper, który zaloguje się do serwisu librus i pobierze wiadomości. Problem w tym, że kiedy program dochodzi do formularza logowanie nie moge odszukać żadnego pola "<input " bo selenium pokazuje inne źródło, niż jest wyświetlone.

Kopiuj
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from bs4 import BeautifulSoup, NavigableString  # BeautifulSoup is in bs4 package
import time

driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get('https://portal.librus.pl//rodzina/synergia/loguj')

# wyszukuję i klikam na button, "Akceptuj cookie"
btn = driver.find_element(By.CLASS_NAME, "modal-button__primary")
btn.click()
time.sleep(2)
# wyszukuję i klikam na menu "LIBRUS Synergia" aby je rozwinąć
link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,'//a[@href="#"]')))
link.click()
time.sleep(2)
# wyszukuję i klikam na pozycję z menu "Zaloguj"
link = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//a[@href="/rodzina/synergia/loguj"]')))
link.click()
time.sleep(5) # dodałem aby na 100% strona się załadowała
soup = BeautifulSoup(driver.page_source, 'html.parser') # parsuje do testu wyświetloną stronę
input_Login = WebDriverWait(driver, 2).until(EC.presence_of_element_located((By.ID, "Login")))
input_Login.send_keys("22437039")

problem w tym, że nie odnajduje mi pola formularza "Login" i nie wpisuje w nim tekstu.
Dodatkowo dodałem:

Kopiuj
soup = BeautifulSoup(driver.page_source, 'html.parser')

aby sprawdzić aktualne źródło strony i okazuje się, że jest to poprzedni widok strony głównej a nie formularza logowania. Dlaczego?

Dodałem nawet sleep(5) przed wyszykiwaniem pola Login aby wszystk się załadowało, ale to i tak nic nie daje.

Pozdro.

marian pazdzioch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 790
2

Ale sleenium to dla masochistów.

Użyj nowoczesnej kielni https://playwright.dev/

DarekRepos
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 50
2

Sprawdzilem ten przyklad i elementy logowania znajdują się w elemencie iframe, musisz przełączyć się na ten element iframe przed rozpoczęciem interakcji z elementem w selenium.

Poniżej daje kod na któym działa mi wpisywanie tej liczby:

Kopiuj
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from bs4 import BeautifulSoup, NavigableString  # BeautifulSoup is in bs4 package
import time

driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get('https://portal.librus.pl/rodzina/synergia/loguj')

# wyszukuję i klikam na button, "Akceptuj cookie"
btn = driver.find_element(By.CLASS_NAME, "modal-button__primary")
btn.click()
time.sleep(2)
# wyszukuję i klikam na menu "LIBRUS Synergia" aby je rozwinąć
link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,'//a[@href="#"]')))
link.click()
time.sleep(2)
# wyszukuję i klikam na pozycję z menu "Zaloguj"
link = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//a[@href="/rodzina/synergia/loguj"]')))
link.click()
time.sleep(5) # dodałem aby na 100% strona się załadowała
soup = BeautifulSoup(driver.page_source, 'html.parser') # parsuje do testu wyświetloną stronę

#przełacz sie do iframe
iframe = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'iframe')))
driver.switch_to.frame(iframe)

# zlokalizuj "login" element input
input_Login = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "Login")))
input_Login.send_keys("22437039")

# Po zakończeniu przełącz się z powrotem do domyślnej zawartości
driver.switch_to.default_content()

soup = BeautifulSoup(driver.page_source, 'html.parser')
#print(soup)
print("end")

BE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0
DarekRepos napisał(a):

Sprawdzilem ten przyklad i elementy logowania znajdują się w elemencie iframe, musisz przełączyć się na ten element iframe przed rozpoczęciem interakcji z elementem w selenium.

Dzięki. To rozwiązuje problem. Faktycznie, nie zauważyłem, że to w oddzielnym iframe.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.