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


何を言ってるのか

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

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

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

コード

python
import requests
from selenium import webdriver

cookie_name = 'session_id'

# requests でログインしてセッションクッキーを作る
s = requests.session()
login_data = {
    'email': '[email protected]',
    '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 送信すればログインできるかもしれません。でも大変そうなのでやってないです。