【问题标题】:python selenium | ask for input, output it to a website?蟒蛇硒|要求输入,输出到网站?
【发布时间】:2020-12-08 22:12:54
【问题描述】:

这是我第一次在这里发帖,如果我犯了任何错误,请见谅..无论如何:

我有这个脚本可以在我学校的网站上输入我的登录信息,并勾选基本上意味着我感觉良好(并且我没有感染 COVID)的内容。

我想把这个送给我在学校的朋友,但我不想给他们代码,因为我害怕他们会碰它并搞砸一些东西......所以我想做一些像这样简单的事情: simple GUI i made using tkinter

问题是,我不知道如何将从那里得到的输入存储到一个变量中,以便稍后在脚本中调用以在学校网站上打印出来。这是我的代码:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time

import tkinter as tk

def show_entry_fields():
    print("Username: %s\nPassword: %s" % (e1.get(), e2.get()))

master = tk.Tk()
tk.Label(master,
         text="Username").grid(row=0)
tk.Label(master,
         text="Password").grid(row=1)

e1 = tk.Entry(master)
e2 = tk.Entry(master)

e1.grid(row=0, column=1)
e2.grid(row=1, column=1)

username = e1.get()
password = e2.get()

tk.Button(master, 
          text='Go', 
          command=master.quit).grid(row=3, 
                                    column=0, 
                                    sticky=tk.W, 
                                    pady=4)


tk.mainloop()


#opens the browser & website
browser = webdriver.Chrome(executable_path=r"D:\Documents\Mashov\Haxarat Briut\chromedriver.exe")
browser.maximize_window()
browser.get("blah blah blah")
time.sleep(2)

#types the school name
school = browser.find_element_by_xpath("//input[@id='mat-input-3']")
school.send_keys("blah blah bla")
school.send_keys(Keys.ENTER)
time.sleep(2)



#types username
username = browser.find_element_by_xpath("//*[@id='mat-input-0']")
username.send_keys(username)
username.send_keys(Keys.ENTER)
time.sleep(2)



#types password
password = browser.find_element_by_xpath('//*[@id="mat-input-4"]')
password.send_keys(password)
password.send_keys(Keys.ENTER)
time.sleep(2)

如果有人有任何指示或任何帮助,我将不胜感激! 祝你假期愉快!

编辑:如果有一种简单的方法来存储这些数据,这样他们就不必在每次打开程序时都输入它。这也会很有帮助 (基本上只是他们第一次打开程序时,它会询问登录详细信息,然后下次打开它时,它会自动转到网站,甚至不询问您的登录详细信息)

【问题讨论】:

    标签: python selenium selenium-webdriver tkinter selenium-chromedriver


    【解决方案1】:

    我的建议是在一个容易找到的地方创建一个名为“autologin config”之类的目录。让您的脚本检查是否存在名为“autologin.txt”或类似文件的文本文件。如果它不存在,请创建它,询问用户名并将其写入文件。然后写一个换行符(\n),并要求输入密码。将其附加到文件的第二行。如果文件确实存在,或者在创建后,自动转到学校的网站并从“C:\Users\User\Desktop\autologin config\autologin.txt”或任何你的文件中提取登录凭据,并使用它们登录。

    【讨论】:

    • 我希望这有助于很好地满足您的需求。我实际上会写一个示例脚本,但我现在正在工作。
    • 在这里考虑加密......使用您机器的序列号作为密钥。 (因为您正在存储登录信息。)
    • 绝对是@pcalkins。
    【解决方案2】:

    使用加密是明智之举。话虽如此,我冒昧地制作了一个模板,使用自行生成的 CSV 文件来存储用户信息。

    我建议将我在下面写的内容分开,然后根据您的需要自行调整。

    import tkinter as tk
    import csv 
    import os 
    
    class Window(tk.Frame):
        def __init__(self, root):
            tk.Frame.__init__(self, root)
            self.root = root 
            self.username = "" 
            self.password = ""
    
            # Some random consant file name
            self.USER_PROFILE = 'user-profile.csv' 
    
            # Entries 
            self.username_entry = tk.Entry(self.root)
            self.password_entry = tk.Entry(self.root)
    
            # Buttons
            self.go_button = tk.Button(self.root, command=self.goPressed, text='Go')
         
        def setUI(self):
            # Labels
            tk.Label(self.root, text='Username').grid(row=0, column=0)
            tk.Label(self.root, text='Password').grid(row=1, column=0)
    
            # Entries
            self.username_entry.grid(row=0, column=1)
            self.password_entry.grid(row=1, column=1)
    
            #Buttons
            self.go_button.grid(row=3, column=0, sticky=tk.W, pady=4)
    
        def show(self):
            self.setUI()
    
        def goPressed(self):
            self.updateUserProfile()
            self.root.quit()
    
        def updateUserProfile(self):
            self.username = self.username_entry.get()
            self.password = self.password_entry.get()
            # Create the user profile file if it doesn't exist
            if not os.path.isfile(self.USER_PROFILE):
                # Make sure user filled the entries
                if self.username and self.password:
                    with open(self.USER_PROFILE, 'w', newline='') as up:
                        writer = csv.writer(up)
                        # Write the row for the user name into the file 
                        writer.writerow(['username', self.username])
                        # and password...
                        writer.writerow(['password', self.password])
    
            # Otherwise, a profile already exists, I would modify this to
            # change the username and password if say, a "change username or password"
            # checkbox is set. 
            else:
                # Read the user profile
                with open(self.USER_PROFILE, 'r') as up:
                    reader = csv.reader(up)
                    # Read user info into selenium.
                    # Right here I just have it write into the entry, but
                    # it should be easy for you to change that to a selenium entry.
                    for line in reader:
                        if line[0] == 'username':
                            self.username = line[1]
                            self.username_entry.insert(0, self.username)
                        elif line[0] == 'password':
                            self.password = line[1]
                            self.password_entry.insert(0, self.password)
        
    def main():
        root = tk.Tk()
        window = Window(root)
        window.show()
        root.mainloop()
    
        #opens the browser & website
        browser = webdriver.Chrome(executable_path=r"D:\Documents\Mashov\Haxarat 
        Briut\chromedriver.exe")
        browser.maximize_window()
        browser.get("blah blah blah")
        time.sleep(2)
    
        #types the school name
        school = browser.find_element_by_xpath("//input[@id='mat-input-3']")
        school.send_keys("blah blah bla")
        school.send_keys(Keys.ENTER)
        time.sleep(2)
    
        #types username
        username = browser.find_element_by_xpath("//*[@id='mat-input-0']")
        username.send_keys(window.username)
        username.send_keys(Keys.ENTER)
        time.sleep(2)
    
        #types password
        password = browser.find_element_by_xpath('//*[@id="mat-input-4"]')
        password.send_keys(window.password)
        password.send_keys(Keys.ENTER)
        time.sleep(2)
    
       if __name__ == '__main__':
          main()
    

    【讨论】:

    • 我会努力做的,如果我成功了我会回复的。非常感谢!
    • 这是运行就绪的代码,您可以随意复制和粘贴,看看它是如何工作的。如果这对您有帮助,请将其设置为接受的答案。
    • 它工作得很好,我唯一的问题是在 selenium 脚本中打印出用户名和密码,知道怎么做吗?我尝试使用 self.username 甚至只是用户名,但它不起作用..
    • 使用您的代码尝试在您的问题中进行编辑,我会指导您完成它。
    • 另外,如果您在“Window”类之外使用 Selenium,则必须通过类对象访问用户信息。假设您有一个名为“self.username”的成员,一旦您在 self.username 中有用户条目,您将编写“username.send_keys(window.username)”。
    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 2021-06-28
    • 2021-07-07
    • 2023-02-06
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多