当我在 Tkinter 和 Selenium 中使用用户和密码的文本框登录 Facebook 时出现问题
Problem when I log into Facebook in Tkinter and Selenium, using the textboxes for user and password
我想在 tkinter window 中输入用户名和密码后登录 Facebook。问题是,在输入用户名和密码后,当我点击登录按钮时,Facebook 页面打开但没有登录。可能是 driver.find_element 的问题。怎么解决?
注意:请不要更改我与 Firefox 的连接方式。
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()
如果您 运行 在控制台中编写代码,那么您应该会看到错误,这有助于您发现问题。
你有两个错误。
你以错误的方式使用 find_element()
- 它必须是 find_element(By.ID, 'email')
最终更旧 find_element_by_id('email')
(pass
和 [=17 相同=]
您必须使用 .get()
从 Entry
获取文本 - 因此您需要 email.get()
和 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()
还有其他问题(至少在我的电脑上)- 开始时它显示有关 cookie 的消息,我必须关闭它,因为它隐藏了 loginbutton
并且 Selenium 无法单击它。
编辑:
要关闭 cookie 消息,您必须使用正确的 css 选择器
(By.CSS_SELECTOR, 'button[data-cookiebanner="accept_only_essential_button"]')
而且您必须等待超过 1 秒。
完整的工作代码:
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()
我想在 tkinter window 中输入用户名和密码后登录 Facebook。问题是,在输入用户名和密码后,当我点击登录按钮时,Facebook 页面打开但没有登录。可能是 driver.find_element 的问题。怎么解决? 注意:请不要更改我与 Firefox 的连接方式。
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()
如果您 运行 在控制台中编写代码,那么您应该会看到错误,这有助于您发现问题。
你有两个错误。
你以错误的方式使用
find_element()
- 它必须是find_element(By.ID, 'email')
最终更旧find_element_by_id('email')
(pass
和 [=17 相同=]您必须使用
.get()
从Entry
获取文本 - 因此您需要email.get()
和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()
还有其他问题(至少在我的电脑上)- 开始时它显示有关 cookie 的消息,我必须关闭它,因为它隐藏了 loginbutton
并且 Selenium 无法单击它。
编辑:
要关闭 cookie 消息,您必须使用正确的 css 选择器
(By.CSS_SELECTOR, 'button[data-cookiebanner="accept_only_essential_button"]')
而且您必须等待超过 1 秒。
完整的工作代码:
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()