GOOGLE ADS

Samstag, 30. April 2022

Problem, wenn ich mich in Tkinter und Selenium bei Facebook anmelde und die Textfelder für Benutzer und Passwort verwende

Ich möchte mich bei Facebook anmelden, nachdem ich Benutzername und Passwort in einem tkinter-Fenster eingegeben habe. Das Problem ist, dass, nachdem ich den Benutzernamen und das Passwort eingegeben habe, wenn ich auf die Schaltfläche „Anmelden" klicke, die Facebook-Seite geöffnet wird, aber ohne mich anzumelden. Vielleicht ist es ein Problem mit driver.find_element. Wie löst man? HINWEIS: Bitte ändern Sie nicht die Art und Weise, wie ich mich mit Firefox verbinde.

import tkinter as tk  
from tkinter import ttk
from tkinter import *
from time import sleep
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
import os
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
root = tk.Tk()
root.title("Login")
root.geometry('630x500')
topbar = tk.Frame(root, bg='#3c5999', height=42)
topbar.pack(fill='x')
#TEXTBOX
label_email = Label(root, text="email", bg='#3c5999', foreground="white")
label_email.place(x=2, y = 10)
email = tk.Entry(root)
email.place(x=50, y = 9)
label_password = Label(root, text="password", bg='#3c5999', foreground="white")
label_password.place(x=260, y = 10)
password = tk.Entry(root)
password.place(x=335, y = 9)
def login():
#Access Facebook
profile_path = '/usr/bin/firefox/firefox'
#/usr/bin/firefox/firefox
options=Options()
options.set_preference('profile', profile_path)
options.set_preference('network.proxy.type', 4)
options.set_preference('network.proxy.socks', '127.0.0.1')
options.set_preference('network.proxy.socks_port', 9050)
options.set_preference("network.proxy.socks_remote_dns", False)
service = Service('/home/jass/bin/geckodriver')
driver = Firefox(service=service, options=options)
driver.get("http://www.facebook.com")
WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "accept_only_essential_button"))).click()
username_box = driver.find_element('email')
username_box.send_keys(email)

password_box = driver.find_element('pass')
password_box.send_keys(password)

login_box = driver.find_element('loginbutton')
login_box.click()
button = Button(root, text="Login", bg='white', foreground='black', width=7, command=login)
button.place(x=530, y=5)
root.mainloop()


Lösung des Problems

Wenn Sie Code in der Konsole ausführen würden, sollten Sie Fehler sehen, die Ihnen helfen sollten, das Problem zu erkennen.

Du hast zwei Fehler.


  • Sie verwenden find_element()es falsch - es muss find_element(By.ID, 'email')eventuell älter sein find_element_by_id('email')(dasselbe gilt für passundbutton


  • you have to use .get() to get text from Entry - so you need email.get() and password.get()



 username_box = driver.find_element(By.ID, 'email')
username_box.send_keys(email.get())

password_box = driver.find_element(By.ID, 'pass')
password_box.send_keys(password.get())

login_box = driver.find_element(By.ID, 'loginbutton')
login_box.click()

Es gibt auch ein anderes Problem (zumindest auf meinem Computer) - beim Start zeigt es eine Meldung über Cookies und ich muss es schließen, weil es sich versteckt loginbuttonund Selen nicht darauf klicken kann.

BEARBEITEN:

Um die Cookie-Nachricht zu schließen, müssen Sie den richtigen CSS-Selektor verwenden

(By.CSS_SELECTOR, 'button[data-cookiebanner="accept_only_essential_button"]')

und Sie müssen länger als 1 Sekunde warten.

Vollständiger Arbeitscode:

import os
import tkinter as tk # PEP8: `import *` is not preferred
from tkinter import ttk
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
# --- functions --- # PEP8: all functions after imports
def login():
profile_path = '/usr/bin/firefox/firefox'
options = Options()
options.set_preference('profile', profile_path)
options.set_preference('network.proxy.type', 4)
options.set_preference('network.proxy.socks', '127.0.0.1')
options.set_preference('network.proxy.socks_port', 9050)
options.set_preference("network.proxy.socks_remote_dns", False)
service = Service('/home/jass/bin/geckodriver')
driver = Firefox(service=service, options=options)
driver.get("https://www.facebook.com") # https instead of http
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-cookiebanner="accept_only_essential_button"]'))).click()
username_box = driver.find_element(By.ID, 'email')
username_box.send_keys(email.get())

password_box = driver.find_element(By.ID, 'pass')
password_box.send_keys(password.get())

login_box = driver.find_element(By.ID, 'loginbutton')
login_box.click()
# --- main ---
root = tk.Tk()
root.title("Login")
root.geometry('630x500')
topbar = tk.Frame(root, bg='#3c5999', height=42)
topbar.pack(fill='x')
label_email = tk.Label(topbar, text="email", bg='#3c5999', foreground="white")
label_email.place(x=2, y=10)
email = tk.Entry(topbar)
email.place(x=50, y=9)
label_password = tk.Label(topbar, text="password", bg='#3c5999', foreground="white")
label_password.place(x=260, y=10)
password = tk.Entry(topbar)
password.place(x=335, y=9)
button = tk.Button(topbar, text="Login", bg='white', foreground='black', width=7, command=login)
button.place(x=530, y=5)
root.mainloop()

PEP 8 – Style Guide für Python-Code

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...