📜  python 向 selenium 请求 cookie - TypeScript (1)

📅  最后修改于: 2023-12-03 15:19:08.165000             🧑  作者: Mango

Python 向 Selenium 请求 Cookie - TypeScript

在 Web 应用程序中,Cookie 决定了用户的身份和状态,可以用于跟踪用户会话、记录用户偏好等。如果我们想在 Python 中使用 Selenium 来模拟用户操作,就需要获取用户的 Cookie。

本文将介绍如何使用 Python 和 Selenium 来请求获取 Cookie,并将获取的 Cookie 保存在本地。

1. 安装 Selenium

Selenium 是一个自动化测试工具,可以模拟浏览器的行为,例如自动填写表单、点击按钮等。在 Python 中使用 Selenium,需要先安装它。

在终端中使用以下命令来安装 Selenium:

pip install selenium
2. 启动浏览器并登录

在使用 Selenium 请求 Cookie 之前,需要先启动一个浏览器,并进行登录操作。在本例中,我们使用 TypeScript 实现一个自动登录 GitHub 的脚本,具体代码如下:

import { Builder, WebDriver } from 'selenium-webdriver';
import chrome from 'selenium-webdriver/chrome';
import { Options } from 'selenium-webdriver/chrome';

const options = new Options();

options.setChromeBinaryPath('path/to/chrome/binary');
options.addArguments('--headless');
options.addArguments('--disable-dev-shm-usage');
options.addArguments('--no-sandbox');
options.setUserPreferences({ credential_enable_service: false });

let driver: WebDriver;

beforeAll(async () => {
  driver = await new Builder().forBrowser('chrome').setChromeOptions(options).build();
  await driver.get('https://github.com/login');
  await driver.findElement(By.id('login_field')).sendKeys('your_username');
  await driver.findElement(By.id('password')).sendKeys('your_password');
  await driver.findElement(By.name('commit')).click();
});

afterAll(async () => {
  await driver.quit();
});

在这个 TypeScript 文件中,我们先定义了一个 Chrome 浏览器的配置项 options,其中指定了浏览器二进制文件的路径、无 GUI 模式、禁用 dev-shm-usage 和启用沙箱模式。接着创建了一个浏览器驱动对象(driver)。

beforeAll 函数中,我们使用 driver.get 方法加载了 GitHub 的登录页面,并使用 sendKeysfindElementclick 等方法模拟了填写登录账号和密码,并点击登录按钮的操作。

最后在 afterAll 函数中,我们使用 driver.quit 方法来结束测试,并关闭浏览器。

3. 请求 Cookie

在登录成功后,我们就可以使用 Selenium 来获取 Cookie。为了方便使用,Selenium 提供了 get_cookies 方法以获取当前页面的所有 Cookie。

在 TypeScript 中,我们可以将获取 Cookie 的方法写在 afterAll 函数中,具体代码如下:

import { Cookie, WebDriver } from 'selenium-webdriver';

afterAll(async () => {
  // ...

  const cookies: Cookie[] = await driver.manage().getCookies();
  console.log(cookies);
});

在这个代码片段中,我们在 afterAll 函数中使用了 driver.manage().getCookies() 方法来获取当前页面的所有 Cookie,并将 Cookie 打印到控制台上。

4. 保存 Cookie 到本地

获取 Cookie 后,我们需要将它们保存到本地,以供后续使用。在 Python 中,我们可以将 Cookie 使用 pickle 模块进行序列化,然后保存到文件中。

以下是将 Cookie 序列化并保存到本地的 Python 代码示例:

import pickle
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')

driver = webdriver.Chrome(options=options)

driver.get('https://github.com/login')

driver.find_element_by_id('login_field').send_keys('your_username')
driver.find_element_by_id('password').send_keys('your_password')
driver.find_element_by_name('commit').click()

cookies = driver.get_cookies()

with open('cookies.pkl', 'wb') as f:
    pickle.dump(cookies, f)

driver.quit()

在这个代码片段中,我们使用了 Python 的 pickle 模块来序列化 Cookie,并将序列化后的数据保存到 cookies.pkl 文件中。

5. 从本地加载 Cookie

一旦我们将 Cookie 保存到本地,我们就可以在后续的操作中使用它们。在 Python 中,我们可以使用 pickle 模块来从文件中加载 Cookie。

以下是从文件中加载 Cookie 的 Python 代码示例:

import pickle
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')

driver = webdriver.Chrome(options=options)

driver.get('https://github.com')

with open('cookies.pkl', 'rb') as f:
    cookies = pickle.load(f)

for cookie in cookies:
    driver.add_cookie(cookie)

driver.get('https://github.com')

driver.quit()

在这个代码片段中,我们使用 Python 的 pickle 模块来从 cookies.pkl 文件中加载 Cookie,并使用 driver.add_cookie 方法将它们添加到浏览器中。最后调用 driver.get 方法来加载 GitHub 的首页。