Использование SpringBoot + Angular + Selenide + TestContainers

Я использую SpringBoot + Angular + Selenide + TestContainers.
При попытке запуска теста, у меня веб интерфейс в контейнере не отображается, выводится ошибка:

This site can’t be reached

localhost refused to connect.

Это я вижу по скриншоту, который получается по завершению теста:

Мой код выглядит таким образом:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = EditorConfig.class)
@EnableAutoConfiguration
public class UITest {

    @Rule
    public BrowserWebDriverContainer chrome =
            new BrowserWebDriverContainer()
                    .withDesiredCapabilities(DesiredCapabilities.chrome());

    @LocalServerPort
    int port;

    @Before
    public void setUp() {
        RemoteWebDriver driver = chrome.getWebDriver();
        WebDriverRunner.setWebDriver(driver);
        Configuration.baseUrl = "http://localhost:" + port;
    }

    @Test
    public void campaignsExist() {
        open("/");
        ElementsCollection addedCampaigns = $(By.id("campaignList")).findAll(tagName("li"));
        addedCampaigns.shouldHaveSize(2); 
    }

    @After
    public void tearDown() {
        WebDriverRunner.closeWebDriver();
    }
}

Логи и ошибка вот такая, соответственно не найдет нужный мне элемент:

Caused by: NoSuchElementException: no such element: Unable to locate element: {“method”:“id”,“selector”:“campaignList”}

Версии ОС и софта следующие: TestContainers: 1.10.1, Selenide: 5.0.1

У меня предположение, что нужно как-то прокинуть порт, но я не пойму как, ни одного вменяемого примера не нашел

Возможно это ваш случай

https://www.testcontainers.org/usage/webdriver_containers.html#example

Note that, if you want to test a web application running on the host machine (the machine the JUnit tests are running on - which is quite likely), you’ll need to replace any references to localhost with an IP address that the Docker container can reach. Use the getTestHostIpAddress() method, e.g.:

driver.get("http://" + chrome.getTestHostIpAddress() + ":8080/");

Я уже так пробовал сделать, в этом случае я получаю ошибку:

java.lang.UnsupportedOperationException: getTestHostIpAddress() is only implemented for docker-machine right now

at org.testcontainers.containers.GenericContainer.getTestHostIpAddress(GenericContainer.java:1020)

Установил docker-machine, также падаю теперь с такой ошибкой:

 java.lang.RuntimeException: org.testcontainers.utility.CommandLine$ShellCommandException: Exception when executing docker-machine ssh  echo $SSH_CONNECTION

т.е. у вас на рабочей машине Windows?
Если так, то смотрите URL вашей докер-машины командой

docker-machine ls

Далее, как понимаю, вам нужно заменить localhost в тестах на полученный URL

Нет, у меня рабочая машина Ubuntu 16.04.
На ней стоит docker: Docker version 18.09.0, build 4d60db4
docker-machine: docker-machine version 0.14.0, build 89b8332

На этой же машине я веду разработку автотестов.

$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS

выводит пустоту.

Я использую SpringBoot + Angular + Selenide + TestContainers.

думаю, тут не помешают детали. Например, где крутится ваш тестируемый сервис, а где сами тесты

Пока все крутится на моей локальной рабочей машине. Я использую Intellij IDEA для написания тестов и из нее же их и запускаю для проверки.

Все примеры, как, например, GitHub - selenide-examples/testcontainers: Selenide + TestContainers (Docker) sample project работают вообще без проблем! Все проблемы начинаются, когда я хочу запустить мое SpringBootAngularReactVue etc, приложение, а не просто дернуть URL в интернете, как написано в этих примерах.

Пока все крутится на моей локальной рабочей машине. Я использую Intellij IDEA для написания тестов и из нее же их и запускаю для проверки.

понятно, а что у вас в контейнере(ах) запускается?

в контейнере мне нужно запустить браузер, в котором тест прощелкает мой GUI на Angular’e. По моему все должно быть просто, но что-то не идет…

попробуйте указать host network для вашего контейнера:

    @Rule
    public BrowserWebDriverContainer chrome =
            new BrowserWebDriverContainer()
                    .withNetworkMode("host")
                    .withDesiredCapabilities(DesiredCapabilities.chrome());

Ничего не поменялось, все также есть ошибка:

java.lang.RuntimeException: org.testcontainers.utility.CommandLine$ShellCommandException: Exception when executing docker-machine ssh  echo $SSH_CONNECTION

Я так пониманию, он что-то хочет сделать с docker-machine. Но там нет никакого образа, может его надо как-то установить(сказать, собрать etc)?

localhost не меняйте :slight_smile: только код выше

Получается такой код:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = EditorConfig.class)
@EnableAutoConfiguration
public class UITest {

    @Rule
    public  BrowserWebDriverContainer browser =
            (BrowserWebDriverContainer)new BrowserWebDriverContainer()
                    .withDesiredCapabilities(DesiredCapabilities.chrome()).withNetworkMode("host");

    @LocalServerPort
    int port;

    @Before
    public void setUp() {
        RemoteWebDriver driver = browser.getWebDriver();
        WebDriverRunner.setWebDriver(driver);
        Configuration.baseUrl = "http://localhost:" + port;
    }

    @Test
    public void campaignsExist() {
        open("/");
        ElementsCollection addedCampaigns = $(By.id("campaignList")).findAll(tagName("li"));
        addedCampaigns.shouldHaveSize(2);
    }

    @After
    public void tearDown() {
        WebDriverRunner.closeWebDriver();
    }
}

Все равно ни в какую. Ошибка та же: localhost refused to connect.

Ошибка та же: localhost refused to connect.

при этом ваше тестируемое приложение действительно находится по этому урлу?

Да, приложение доступно. Но я поменял определение IP адреса, взял его отсюда:

Задал базовый URL:

 Configuration.baseUrl = "http://" + getDetectedDockerHostIp() + ":" + port;

И по данному адресу действительно есть приложение. Но тест падает. По записанному видео я вижу, что хром вместо этого адреса подставил data:, и на нем завис. А Firefox упал с ошибкой:

org.openqa.selenium.WebDriverException: Reached error page: about:neterror?e=netTimeout&u=http%3A//172.17.0.1%3A34551/&c=UTF-8&f=regular&d=The%20server%20at%20172.17.0.1%20is%20taking%20too%20long%20to%20respond.