質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Q&A

解決済

1回答

1911閲覧

リモートwebdriverからdockerコンテナ上のwebページに接続できない

deango

総合スコア161

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

0グッド

0クリップ

投稿2022/10/10 19:06

前提

djangoでWEBアプリを作成しています。
リモートwebdriverを利用して、UIテストを行いたいのですが、
リモートwebdriverから、docker上のwebページにアクセスできず困っています。

お力添えいただけますでしょうか。

発生している問題・エラーメッセージ

test_ui.pyのテスト結果

1====================================================================== 2ERROR: test_1 (diary.tests.test_ui.UiTest) 3ログイン機能を検証する 4---------------------------------------------------------------------- 5Traceback (most recent call last): 6 File "/usr/src/app/nyapu/diary/tests/test_ui.py", line 39, in test_1 7 self.selenium.get('http://localhost:8000' + str(reverse_lazy('account_login'))) 8 File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 441, in get 9 self.execute(Command.GET, {'url': url}) 10 File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 429, in execute 11 self.error_handler.check_response(response) 12 File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 243, in check_response 13 raise exception_class(message, screen, stacktrace) 14selenium.common.exceptions.WebDriverException: Message: unknown error: net::ERR_CONNECTION_REFUSED 15 (Session info: headless chrome=106.0.5249.91) 16Stacktrace: 17#0 0x55ca3e8772c3 <unknown> 18~略~ 19

該当のソースコード

dockercompose.dev.yml

1version: '3.7' 2 3services: 4 # サービス名は自由に設定 5 nyapu: 6 build: ./app 7 # サービス起動後に入力されるコマンドを設定 8 command: python /usr/src/app/nyapu/manage.py runserver 0.0.0.0:8000 --settings nyapu_pj.settings_dev 9 # データを永続化させる場合の設定。`host:container`でパスを記載 10 volumes: 11 - ./app:/usr/src/app 12 # 指定されたポートは接続されたサービスからアクセス可能 13 ports: 14 - 8000:8000 15 # 環境変数を指定 16 env_file: .env 17 # 起動するサービスの依存関係を明記 18 depends_on: 19 - postgres 20 - selenium 21 22 postgres: 23 # 公式からイメージをpull 24 image: postgres:10.17-alpine 25 # データベースの永続化 26 volumes: 27 - postgres_data:/var/lib/postgresql/data 28 env_file: .env.db 29 30 31 selenium: 32 container_name: selenium 33 image: selenium/standalone-chrome:4.5.0-20221004 34 ” ports: 35 - 4444:4444 36 - 5900:5900 37 privileged: true 38 shm_size: "2gb" 39 volumes: 40 - /dev/shm:/dev/shm 41 42 43 44# トップレベルに書く「名前付きvolumes」は複数サービスから参照できる 45volumes: 46 postgres_data: 47

test_ui.py

1from django.contrib.staticfiles.testing import StaticLiveServerTestCase 2from django.urls import reverse_lazy 3from selenium import webdriver 4from selenium.webdriver.support import expected_conditions as EC 5from selenium.webdriver.common.by import By 6 7from selenium.webdriver.common.keys import Keys 8 9from selenium.webdriver.support.ui import WebDriverWait 10 11class UiTest(StaticLiveServerTestCase): 12 fixtures = ['test/test_view.json'] 13 14 @classmethod 15 def setUpClass(cls): 16 super().setUpClass() 17 options = webdriver.ChromeOptions() 18 options.add_argument('--no-sandbox') 19 options.add_argument('--headless') 20 options.add_argument('--disable-gpu') 21 22 cls.selenium = webdriver.Remote( 23 command_executor='http://selenium:4444/wd/hub', 24 options = options, 25 ) 26 27 @classmethod 28 def tearDownClass(cls): 29 cls.selenium.quit() 30 super().tearDownClass() 31 32 def test_1(self): 33 """ログイン機能を検証する""" 34 35 # ログインページを開く 36 self.selenium.get('http://localhost:8000' + str(reverse_lazy('account_login'))) 37 38 # 管理者権限のあるユーザでログイン 39 email_input = self.selenium.find_element(By.NAME, "login") 40 email_input.send_keys('testonly@example.com') 41 password_input = self.selenium.find_element(By.NAME, "password") 42 password_input.send_keys('onlynyapu') 43 44 self.selenium.find_element(By.NAME, "btn").click() 45 46 # ページタイトルの検証 47 self.assertEquals('トップページ | にゃっぷ', self.selenium.title) 48

試したこと

dockerは正常に立ち上がっており、コンテナ間の通信もできます。

ホストOSから[http://localhost:8000]への接続が可能で、webページが正常に表示されることも確認済みです。

また、dockerを使用せず、ローカルにwebdriverをインストールしてテストを行った場合は、このエラーは発生しません。

補足情報(FW/ツールのバージョンなど)

Python 3.7
Django 3.2.14

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

deango

2022/10/11 09:26 編集

見落としておりました、、ありがとうございます。 localhostではなくコンテナ名にすることで、アクセスできました。 # ログインページを開く self.selenium.get('http://nyapu:8000' + str(reverse_lazy('account_login')))
guest

回答1

0

自己解決

localhostではなくコンテナ名にすることで、アクセスできました。

ログインページを開く

self.selenium.get('http://nyapu:8000' + str(reverse_lazy('account_login')))

投稿2022/10/11 09:27

deango

総合スコア161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問