何を言ってるのか
クライアントがモバイルアプリなど、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 送信すればログインできるかもしれません。でも大変そうなのでやってないです。