如何使用已打开并使用登录凭据登录的浏览器

Posted

技术标签:

【中文标题】如何使用已打开并使用登录凭据登录的浏览器【英文标题】:How to use browser that is already open and logged in with login credentials 【发布时间】:2018-07-30 13:01:42 【问题描述】:

对于使用 selenium 的 python 程序的不同运行,是否有一种方法可以让我使用我的凭据打开并登录的浏览器,在以后的运行中打开并使用?

我正在调试代码。每次我需要使用我的凭据登录时,在浏览器上。目前,每次我停止代码时,网络浏览器都会关闭。有没有办法让我已经打开并登录的浏览器的副本保持打开状态并将其用于我以后的调试,这样每次我都不需要再次输入我的登录凭据?

我打开浏览器的代码如下所示:

driver = webdriver.Chrome(executable_path="/the_path/chromedriver", chrome_options=chrome_options) 
driver.get(url)

编辑:

其实本网站要求认证的方式如下: 首先,它要求输入用户名,然后我需要按继续按钮,然后它要求输入密码,输入密码后,它会向我的手机发送一条短信,我需要输入它才能进入预期的页面。

【问题讨论】:

Python: use cookie to login with Selenium的可能重复 How can I reconnect to the browser opened by webdriver with selenium?的可能重复 我不认为这与其中任何一个重复,请参阅我的问题的编辑部分。 您在问 2 个不相关的问题:“我如何重用现有浏览器”和“我如何自动化多因素身份验证” 【参考方案1】:

好吧,既然这个问题被赞成,但我的标记为重复问题没有被接受,我将在这里发布same exact answer I already posted for a similar question:


您可以使用pickle将cookies保存为文本文件并在之后加载:

def save_cookie(driver, path):
    with open(path, 'wb') as filehandler:
        pickle.dump(driver.get_cookies(), filehandler)

def load_cookie(driver, path):
     with open(path, 'rb') as cookiesfile:
         cookies = pickle.load(cookiesfile)
         for cookie in cookies:
             driver.add_cookie(cookie)

使用如下脚本:

from selenium import webdriver
from afile import save_cookie

driver = webdriver.Chrome()
driver.get('http://website.internets')

foo = input()

save_cookie(driver, '/tmp/cookie')

你可以做的是:

    运行此脚本 在(selenium 的)浏览器上,转到网站,登录 返回您的终端,输入任何内容并按回车键。 在/tmp/cookie 享受您的cookie 文件。您现在可以将其复制到您的代码仓库中,并在需要时将其打包到您的应用中。

所以,现在,在您的主应用代码中:

from afile import load_cookie

driver = webdriver.Chrome()
load_cookie(driver, 'path/to/cookie')

您现在已登录。

【讨论】:

感谢您的回答。这是否适用于我在更新的问题中解释的多因素身份验证(请参阅编辑部分)? 理论上如果您的浏览器在您手动浏览网站时自动记录您,它与cookie方法的工作方式相同。显然你必须先手动登录,但这只有一次 我找不到任何名为 afile 的库,你能详细说明它是什么吗? 这只是一个例子。 afile 是一个 Python 模块。简而言之:一个名为afile.py 的文件包含save_cookieload_cookie 两个函数。 this article 为您提供了一个模块使用示例(在文章中,这家伙使用 test,而我使用 afile)。 哦,我明白了,谢谢。稍后将尝试此操作并报告结果。【参考方案2】:

This was a feature request and closed as not feasible。但这是一种方法,使用文件夹作为配置文件,并通过使用 Chrome 选项user-data-dir 将所有登录信息在会话之间保持持久化,以便将文件夹用作配置文件,我运行:

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com")

您可以在此步骤与打开的窗口进行手动交互,并进行登录以检查人机交互,检查记住密码等一切都在那里。您还可以手动安装扩展并在每个会话中使用它们。 第二次运行,代码和上面一模一样,所有的设置、cookies和登录都在那里:

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com") #Now you can see  the cookies, the settings, Extensions and the logins done in the previous session are present here

优点是你可以使用多个不同设置和cookies的文件夹,扩展程序无需加载、卸载cookies、安装和卸载扩展程序、更改设置、通过代码更改登录名,因此没有办法拥有程序中断等这也比通过代码完成所有操作要快。

【讨论】:

感谢您的回答。我试过了,但是,它并没有解决问题。实际上,当我打开浏览器时,它首先要求输入电子邮件地址,然后我需要单击继续,然后它要求输入密码,然后当我单击确定时,它会向我的手机发送一条带有密码的短信,我需要进入。然后它转到预期的页面。您的解决方案只是绕过了询问电子邮件,但询问密码和短信仍然存在。 @TJ1 如果每次会话都要求进行如此多的检查,那将是一项艰巨的安全检查,我认为这是一个例外而不是规则【参考方案3】:

我有一个完全相同的场景,我想重用一次经过身份验证/登录的会话。我同时使用多个浏览器。

我从博客和 *** 答案中尝试了很多解决方案。

1. 使用 user-data-dir 和 profile-directory

如果您一次打开一个浏览器,这些 chrome 选项可以解决问题,但如果您打开多个窗口,它会抛出错误提示 user data directory is already in use

2. 使用 cookie

Cookie 可以在多个浏览器之间共享。 SO答案中可用的代码具有有关如何在硒中使用cookie的大部分重要块。在这里,我将扩展这些解决方案以完成流程。

代码

# selenium-driver.py
import pickle
from selenium import webdriver


class SeleniumDriver(object):
    def __init__(
        self,
        # chromedriver path
        driver_path='/Users/username/work/chrome/chromedriver',
        # pickle file path to store cookies
        cookies_file_path='/Users/username/work/chrome/cookies.pkl',
        # list of websites to reuse cookies with
        cookies_websites=["https://facebook.com"]

    ):
        self.driver_path = driver_path
        self.cookies_file_path = cookies_file_path
        self.cookies_websites = cookies_websites
        chrome_options = webdriver.ChromeOptions()
        self.driver = webdriver.Chrome(
            executable_path=self.driver_path,
            options=chrome_options
        )
        try:
            # load cookies for given websites
            cookies = pickle.load(open(self.cookies_file_path, "rb"))
            for website in self.cookies_websites:
                self.driver.get(website)
                for cookie in cookies:
                    self.driver.add_cookie(cookie)
                self.driver.refresh()
        except Exception as e:
            # it'll fail for the first time, when cookie file is not present
            print(str(e))
            print("Error loading cookies")

    def save_cookies(self):
        # save cookies
        cookies = self.driver.get_cookies()
        pickle.dump(cookies, open(self.cookies_file_path, "wb"))

    def close_all(self):
        # close all open tabs
        if len(self.driver.window_handles) < 1:
            return
        for window_handle in self.driver.window_handles[:]:
            self.driver.switch_to.window(window_handle)
            self.driver.close()

    def __del__(self):
        self.save_cookies()
        self.close_all()


def is_fb_logged_in():
    driver.get("https://facebook.com")
    if 'Facebook – log in or sign up' in driver.title:
        return False
    else:
        return True


def fb_login(username, password):
    username_box = driver.find_element_by_id('email')
    username_box.send_keys(username)

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

    login_box = driver.find_element_by_id('loginbutton')
    login_box.click()


if __name__ == '__main__':
    """
    Run  - 1
    First time authentication and save cookies

    Run  - 2
    Reuse cookies and use logged-in session
    """
    selenium_object = SeleniumDriver()
    driver = selenium_object.driver
    username = "fb-username"
    password = "fb-password"

    if is_fb_logged_in(driver):
        print("Already logged in")
    else:
        print("Not logged in. Login")
        fb_login(username, password)

    del selenium_object

运行 1:登录并保存 Cookies

$ python selenium-driver.py
[Errno 2] No such file or directory: '/Users/username/work/chrome/cookies.pkl'
Error loading cookies
Not logged in. Login

这将打开 facebook 登录窗口并输入用户名密码登录。登录后,它将关闭浏览器并保存 cookie。

运行 2:重用 cookie 以继续登录会话

$ python selenium-driver.py
Already logged in

这将使用存储的 cookie 打开登录的 facebook 会话。

【讨论】:

【参考方案4】:

我为您找到了解决方案。只需按照上述步骤操作即可。

结果:无需重启浏览器即可在已经打开的窗口上运行脚本。

第一步:我们要设置一个chrome应用的环境变量。为此,请转到 chrome 应用程序所在的目录。复制路径并将其粘贴到环境变量中。第 2 步:创建一个目录,您将在其中存储远程调试 chrome 窗口。像“D:\Selenium\Chrome_Test_Profile”。第三步:打开CMD并编写命令

chrome.exe -remote-debugging-port=9014 --user-data dir="D:\Selenium\Chrome_Test_Profile"

第 4 步:使用以下代码

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.chrome.options import Options


path = r"C:\Program Files (x86)\chromedriver.exe"
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9014")
#Change chrome driver path accordingly
chrome_driver = path
driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)
print (driver.current_url)

你就完成了。

【讨论】:

【参考方案5】:

用泡菜保存饼干。对我来说,我还需要在单击最后一个按钮后执行 driver.refresh() ,否则浏览器会冻结。

【讨论】:

以上是关于如何使用已打开并使用登录凭据登录的浏览器的主要内容,如果未能解决你的问题,请参考以下文章

当他使用相同的凭据登录两次时如何使用户会话无效

无法使用有效凭据登录jenkins

记住我功能如何运作?

测试保持与Rspec签署

在flutter inappWebview中自动填充登录凭据

如何在 IIS 中关闭凭据缓存?