#python #docker #docker-compose #playwright #playwright-python
Вопрос:
Я пытаюсь запустить тесты end-2 в docker в безголовом режиме и получаю playwright._impl._api_types.Error: net::ERR_CONNECTION_REFUSED at http://app/
. Это происходит только в chromium и firefox. Webkit работает, но есть также проблемы с поиском селекторов. Тесты E2E прошли, когда я запускал их с локального хоста. Запросы выполняются успешно, когда я делаю их с локального хоста. Также запросы выполняются успешно, когда я делаю завиток из контейнера e2e-тестов.
докер-compose.yml :
app:
image: ${APP}
ports:
- 8090:80
environment:
SERVICE_HOST: ${REAL_IP}:8080
KEYCLOAK_URL: 'http://keycloak:8080'
DOLLAR: $
restart: unless-stopped
command: sh -c "envsubst < /etc/nginx/conf.d/proxy.template > /etc/nginx/conf.d/default.conf amp;amp; exec nginx -g 'daemon off;'"
depends_on:
backend:
condition: service_healthy
e2e-tests:
build: ../../auto_tests/end2end
environment:
SERVICE_HOST: 'http://app:80'
HEADLESS_MODE: 1
SERVICE_LOG_LEVEL: DEBUG
depends_on:
- app
хром:
============================= test session starts ==============================
platform linux -- Python 3.8.10, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- /usr/bin/python3
=================================== FAILURES ===================================
__________________________ TestAuth.test_correct_auth __________________________
tests/test_auth.py:6:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
fixture/session.py:10: in login
self.app.navigation.open_home_page()
fixture/navigation.py:15: in open_home_page
page.goto(SERVICE_HOST)
/usr/local/lib/python3.8/dist-packages/playwright/sync_api/_generated.py:7133: in goto
self._sync(
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_sync_base.py:111: in _sync
return task.result()
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_page.py:467: in goto
return await self._main_frame.goto(**locals_to_params(locals()))
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_frame.py:119: in goto
await self._channel.send("goto", locals_to_params(locals()))
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_connection.py:39: in send
return await self.inner_send(method, params, False)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._impl._connection.Channel object at 0x7fa7a814bca0>
method = 'goto', params = {'url': 'http://app:80'}, return_as_dict = False
async def inner_send(
self, method: str, params: Optional[Dict], return_as_dict: bool
) -> Any:
if params is None:
params = {}
callback = self._connection._send_message_to_server(self._guid, method, params)
done, pending = await asyncio.wait(
{self._connection._transport.on_error_future, callback.future},
return_when=asyncio.FIRST_COMPLETED,
)
if not callback.future.done():
callback.future.cancel()
> result = next(iter(done)).result()
E playwright._impl._api_types.Error: net::ERR_CONNECTION_REFUSED at http://app/
E =========================== logs ===========================
E navigating to "http://app/", waiting until "load"
E ============================================================
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_connection.py:57: Error
firefox:
=================================== FAILURES ===================================
tests/test_auth.py:6:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
fixture/session.py:10: in login
self.app.navigation.open_home_page()
fixture/navigation.py:15: in open_home_page
page.goto(SERVICE_HOST)
/usr/local/lib/python3.8/dist-packages/playwright/sync_api/_generated.py:7133: in goto
self._sync(
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_sync_base.py:111: in _sync
return task.result()
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_page.py:467: in goto
return await self._main_frame.goto(**locals_to_params(locals()))
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_frame.py:119: in goto
await self._channel.send("goto", locals_to_params(locals()))
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_connection.py:39: in send
return await self.inner_send(method, params, False)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._impl._connection.Channel object at 0x7f89aa274ca0>
method = 'goto', params = {'url': 'http://app:80'}, return_as_dict = False
async def inner_send(
self, method: str, params: Optional[Dict], return_as_dict: bool
) -> Any:
if params is None:
params = {}
callback = self._connection._send_message_to_server(self._guid, method, params)
done, pending = await asyncio.wait(
{self._connection._transport.on_error_future, callback.future},
return_when=asyncio.FIRST_COMPLETED,
)
if not callback.future.done():
callback.future.cancel()
> result = next(iter(done)).result()
E playwright._impl._api_types.Error: NS_ERROR_CONNECTION_REFUSED
E =========================== logs ===========================
E navigating to "http://app/", waiting until "load"
E ============================================================
webkit:
=================================== FAILURES ===================================
tests/test_auth.py:6:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
fixture/session.py:27: in login
page.click('#username')
/usr/local/lib/python3.8/dist-packages/playwright/sync_api/_generated.py:7813: in click
self._sync(
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_sync_base.py:111: in _sync
return task.result()
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_page.py:624: in click
return await self._main_frame.click(**locals_to_params(locals()))
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_frame.py:448: in click
await self._channel.send("click", locals_to_params(locals()))
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_connection.py:39: in send
return await self.inner_send(method, params, False)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._impl._connection.Channel object at 0x7f5669d6aca0>
method = 'click', params = {'selector': '#username'}, return_as_dict = False
async def inner_send(
self, method: str, params: Optional[Dict], return_as_dict: bool
) -> Any:
if params is None:
params = {}
callback = self._connection._send_message_to_server(self._guid, method, params)
done, pending = await asyncio.wait(
{self._connection._transport.on_error_future, callback.future},
return_when=asyncio.FIRST_COMPLETED,
)
if not callback.future.done():
callback.future.cancel()
> result = next(iter(done)).result()
E playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.
E =========================== logs ===========================
E waiting for selector "#username"
E ============================================================
/usr/local/lib/python3.8/dist-packages/playwright/_impl/_connection.py:57: TimeoutError
Ответ №1:
Я решил свою проблему. На самом деле мой контейнер docker (интерфейс) называется «приложение», которое также является доменным именем приложения fronend. Мое приложение работает локально по протоколу http. Драйверы Chromium и geko принудительно устанавливают соединение http S для некоторых доменных имен, одним из которых является «приложение». Поэтому мне нужно сменить имя для моего контейнера docker, содержащего внешнее приложение.