web-dev-qa-db-ja.com

ChromeドライバーにCookieを追加するときにSeleniumで「無効な引数:無効な 'expiry'」を修正する方法

ブラウザにCookieを追加しようとしていますが、次のエラーが発生します。

メッセージ:無効な引数:無効な 'expiry'(セッション情報:chrome = 75.0.3770.90)

このコードは、Cookieを読み込んで追加する方法を示しています。

for cookie in pickle.load(open(r'{0}\{1}_cookie.pkl'.format(settings.COOKIES_PATH, self.tv_username), 'rb')):
    self.browser.add_cookie(cookie)

クッキーの値:

{'__utmc': '226258911', '_sp_id.cf1a': '0b243b32-8dee-46d9-a243-bb4d2bfcb805.1560942815.1.1560942821.1560942815.5941cbc0-0500-4a17-8f6c-4ee3f133f67c', 'km_vs': '1', '__utmt': '1', '__utma': '226258911.510671571.1560942814.1560942814.1560942814.1', 'km_ai': 'm6caeIAUtEqx%2BIWda%2F7klZER%2F1Y%3D', 'kvcd': '1560942821112', '__utmb': '226258911.2.10.1560942814', 'km_lv': '1560942821', '__utmz': '226258911.1560942814.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', 'etg': 'undefined', '_sp_ses.cf1a':'*'}

以前のバージョンのChromeでは問題なく動作しました。何か助けていただければ幸いです!

8
andreilozhkin

問題は、Seleniumが予期する形式とは異なる形式のCookieを追加しようとしていることです。

python Selenium api reference は、そのようなdictでcookieを挿入する必要があることを示しています

driver.add_cookie({'name' : 'foo', 'value' : 'bar'})

したがって、キーと値の形式を使用するようにループを調整する必要があります

for key, value in pickle.load(open(r'{0}\{1}_cookie.pkl'.format(settings.COOKIES_PATH, self.tv_username), 'rb')):
    self.browser.add_cookie({'name' : key, 'value' : value})

私の場合、前の回答は機能しませんでした。オブジェクトから有効期限キーを削除する必要がありました。

 for cookie in pickle.load(open(PATH, "rb")):
     if 'expiry' in cookie:
         del cookie['expiry']

     self.driver.add_cookie(cookie)

これは、ドライバーから返されたCookieを以前に直接ピクルした場合に発生します。

pickle.dump(browser.get_cookies(), open(PATH, "wb"))
18

私のバージョンのpythonおよびSeleniumでは、SeleniumがCookieの有効期限値を出力する方法とそれをインポートする方法に違いがあることがわかりました。

driver.get_cookies()

ドライバは、整数ではなく浮動小数点数である有効期限値を出力できます。これらのフロートはエポック時間単位(1970年1月1日からの秒数)のようです。これらの正確なCookieをドライバーに再度追加しようとすると、ドライバーは整数の有効期限値を持つCookieしか受け入れないため、失敗します。この行では:

driver.add_cookie({'name': name, 'value': value, 'expiry': expiry})

expiryの値は整数でなければなりません。そうしないと、値エラーが発生します。次のコードを使用してこれを修正しました。

# Saving current cookies and reformatting them
cookies = driver.get_cookies()
for cookie in cookies:
    if 'expiry' in cookie:
        cookie['expiry'] = int(cookie['expiry'])

# Adding cookies back into the driver
for cookie in cookies:
    driver.add_cookie(cookie)

これは私にとってはうまくいきました、そして私はもはやエラーを受け取りません。

6
Scott Driggers