LoginSignup
42
54

More than 5 years have passed since last update.

Python requests で取得したログインセッションクッキーを Selenium ブラウザに渡してログインする

Last updated at Posted at 2016-01-14

何を言ってるのか

クライアントがモバイルアプリなど、Webブラウザ以外を想定している Web アプリがあるとします。

それは、よくある Web サービスで見るようなログインページを持たないとします。クライアントアプリにログインフォームが入っているためです。

でも、自動テストとかする時は、Selenium のブラウザからアクセスして動作を見たい。
そんな時。

コード

python
import requests
from selenium import webdriver

cookie_name = 'session_id'

# requests でログインしてセッションクッキーを作る
s = requests.session()
login_data = {
    'email': 'xxxx@xxxx.xx',
    'password': 'xxxxxxxxxx',
}
res = s.post('https://example.com/login/', data=login_data)
res.raise_for_status()

# セッションクッキーの値
cookie_value = s.cookies.get(cookie_name)

# Firefox起動
driver = webdriver.Firefox()
# 事前に、ターゲットドメインの適当なページを開いておく。
# これをしないと、add_cookie でエラーになる
driver.get('https://example.com/')
# requests で取得したセッションクッキーを Firefox に渡す
driver.add_cookie({
        'name': cookie_name,
        'value': cookie_value,
        'domain': 'example.com'})
# ログイン後のページを表示
driver.get('https://example.com/mypage/')

これで、Firefox でログイン後のページが見れます。

なお、webdriver.Chrome でも同様に add_cookie メソッドが動きますので、同様にログインできます。多分、他の web ドライバでも動きます。

ダメだった例

ローカルに、適当なフォームの HTML を作り、その action= をログインURL にした場合、method="POST" にしてもなぜか GET でリクエストされました。最近のブラウザだとセキュリティのためかクロスドメインでの POST での送信はできなくなっている模様。

がんばれば selenium だけでできるかもしれない案

Selenium で、ログイン先のドメインの適当なページを開いて、JS でログインフォームを作り、そこから POST 送信すればログインできるかもしれません。でも大変そうなのでやってないです。

42
54
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
54