ChromeDriverでSeleniumを使用して、ローカルホスト(HTTPSなし)で統合テストを実行しようとしています。
Chromeにはhttps証明書が必要ですが、 this の質問から、arg --ignore-certificate-errors
を使用してこれを回避できることを理解しています
これは適切な一連のアクションのように思えるので、自分の機能acceptInsecureCerts
にも追加しました( docs )
Chromedriverからの応答はまだ私が期待していたものではありません:
このサイトは、無効な応答を送信した安全な接続アプリを提供できません。 ERR_SSL_PROTOCOL_ERROR
私のコードは以下です:
from Selenium import webdriver
from Selenium.webdriver.chrome.options import Options
# make options (principally to ignore certificate)
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
# add acceptInsecureCerts
capabilities = options.to_capabilities()
capabilities['acceptInsecureCerts'] = True
print(capabilities) # see below
driver = webdriver.Remote(
command_executor=Selenium_HUB,
desired_capabilities=capabilities
)
print(driver.__dict__) # see further below
app_login_url = 'http://app:8000/accounts/login/'
driver.get(app_login_url)
私の能力:
{'acceptInsecureCerts': True,
'browserName': 'chrome',
'goog:chromeOptions': {'args': ['--ignore-certificate-errors'],
'extensions': []},
'platform': 'ANY',
'version': ''}
これが私のドライバー情報です、acceptInsecureCerts
引数のみが考慮されているようです:
{'_file_detector': <Selenium.webdriver.remote.file_detector.LocalFileDetector object at 0x7fb42bde10f0>,
'_is_remote': True,
'_mobile': <Selenium.webdriver.remote.mobile.Mobile object at 0x7fb42bb5e400>,
'_switch_to': <Selenium.webdriver.remote.switch_to.SwitchTo object at 0x7fb42bdd4898>,
'capabilities': {'acceptInsecureCerts': True,
'acceptSslCerts': True,
'applicationCacheEnabled': False,
'browserConnectionEnabled': False,
'browserName': 'chrome',
'chrome': {'chromedriverVersion': '74.0.3729.6 '
'(255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29})',
'userDataDir': '/tmp/.com.google.Chrome.vc1ZvB'},
'cssSelectorsEnabled': True,
'databaseEnabled': False,
'goog:chromeOptions': {'debuggerAddress': 'localhost:40815'},
'handlesAlerts': True,
'hasTouchScreen': False,
'javascriptEnabled': True,
'locationContextEnabled': True,
'mobileEmulationEnabled': False,
'nativeEvents': True,
'networkConnectionEnabled': False,
'pageLoadStrategy': 'normal',
'platform': 'Linux',
'proxy': {},
'rotatable': False,
'setWindowRect': True,
'strictFileInteractability': False,
'takesHeapSnapshot': True,
'takesScreenshot': True,
'timeouts': {'implicit': 0,
'pageLoad': 300000,
'script': 30000},
'unexpectedAlertBehaviour': 'ignore',
'version': '74.0.3729.169',
'webStorageEnabled': True,
'webdriver.remote.sessionid': '1cf77f237e966bac6ca15d4d9c107423'},
'command_executor': <Selenium.webdriver.remote.remote_connection.RemoteConnection object at 0x7fb42be0cf98>,
'error_handler': <Selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7fb427d08a20>,
'session_id': '1cf77f237e966bac6ca15d4d9c107423',
'w3c': False}
なぜERR_SSL_PROTOCOL_ERROR
がまだ表示されるのですか?
このエラーメッセージ...
This site can’t provide a secure connection app sent an invalid response. ERR_SSL_PROTOCOL_ERROR
...これは、ChromeDriverが新しいWebBrowserつまりChrome Browserローカルホストでのセッションを開始した.
ローカルホスト(HTTPSなし)でこの問題が発生しているため、this comment のようにargument
--allow-insecure-localhost
からchromeOptions()
まで:
'goog:chromeOptions': {'args': ['--allow-insecure-localhost'],
'extensions': []}
ただし、主な問題は機能にあるようです。ここでplatform
を設定すると、次のようにs ANY
が設定されます。
{'acceptInsecureCerts': True,
'browserName': 'chrome',
'goog:chromeOptions': {'args': ['--ignore-certificate-errors'],
'extensions': []},
'platform': 'ANY',
'version': ''}
WebDriver-W3C Living DocumentplatformNameセクションで言及されているように、次のプラットフォーム名はよく理解されているセマンティクスで一般的に使用されており、機能を一致させると、それらを尊重することで最大の相互運用性を実現できます。よく知られたオペレーティングシステムの有効な同義語として:
Key System
--- ------
"linux" Any server or desktop system based upon the Linux kernel.
"mac" Any version of Apple’s macOS.
"windows" Any version of Microsoft Windows, including desktop and mobile versions.
Note:このリストは完全なものではありません。
新しいセッションから機能を返す場合、より具体的なplatformNameを返すことは有効であり、ユーザーはWebDriver実装が実行されているオペレーティングシステムを正しく識別できます。
したがって、desiredCapabilitiesオブジェクト内で"platform":"ANY"
を渡す代わりに、より具体的な"platform":"linux"
がより望ましいアプローチになります。
関連および関連するディスカッションは、 Curl error thrown for http POST to/session with params:{“ desiredCapabilities”:{“ browserName”:“ chrome”、“ platform”:“ ANY” with Selenium and PHPUnit
ChromeDriver、ChromeおよびSelenium Clientvrsionに関するいくつかの詳細情報は、問題をより適切に分析するのに役立ちました。ただし、ChromeDriverの履歴に従い、-証明書エラーの処理に関連する次の問題は、ChromeDriverの最後のいくつかのリリースで対処されました。
--ignore-certificate-errors
など)のCLIスイッチを介して制御されていたが、黙って行われた無視され、devtoolsを介してのみ設定できます。そのため、ブラウザターゲットのDevToolsクライアントでcertificateError
イベントをオーバーライドして処理する必要がありました。 fix がリリースされました。新しいDevToolsメソッドを使用して、ブラウザー全体で証明書エラー処理をオーバーライドし、ヘッドレスモードでも証明書エラーを無視できるようになりました。Security.enable
/Security.setOverrideCertificateErrors
コマンドを十分迅速に送信する。 fix は、より単純な「すべての証明書エラーを無視する」モードで公開されましたが、代わりに古いオーバーライドコマンドが廃止され、新しいsetIgnoreCertificateErrors
コマンドが優先され、ブラウザターゲットのセキュリティドメインも公開されます。このオーバーライドをブラウザー全体にグローバルに適用することを容易にします。--allow-insecure-localhost
acceptInsecureCerts
--ignore-certificate-errors
'chromedriverVersion': '74.0.3729.6'
を使用しているときは、'chrome': '74.0'
も使用していることを確認してください( ChromeDriver v74.0.3729.6 リリースノートに従って)Fix "Aw、Snap!" page crashes and other page loading errors-Computer-Google Chrome Help (「ページの読み込みエラーコードと問題」セクションを展開してください) )、ChromeはERR_SSL_PROTOCOL_ERROR
すべてのSSL関連エラー。これには以下が含まれます。
Chromeからこれ以上詳細を取得できないため、別のアプリ(Firefoxなど、または openssl s_client
)は、何が起こっているかについての詳細を示すことができます。
パケットをスニッフィングします。 Wireshark は、ネゴシエーションステージを含む接続の初期ステージを表示できます。サーバーが自分のものである(つまり、秘密鍵を持っている)場合は、 暗号化された部分を復号化する -で全体像を知ることもできます。
HTTP
ではなくHTTPS
を介してページをリクエストしています。 Chromeは安全でないHTTP
サーバーに接続しません。
これにより、TLS/SSLネゴシエーションが失敗します。
TCPポート8000でサーバーがHTTPS
を実行していることを確認する必要があります。
とともに --ignore-certificate-errors
オプションでは、自己署名証明書を生成し、それをWebサーバーに適用できます。
次に、HTTPS
を使用するようにURL行を変更します。
app_login_url = 'https://app:8000/accounts/login/'