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

docker
spring
container
java
webdriver
selenide
angularjs
Теги: #<Tag:0x00007f7b64742bb0> #<Tag:0x00007f7b64742a70> #<Tag:0x00007f7b64742908> #<Tag:0x00007f7b64742778> #<Tag:0x00007f7b64742638> #<Tag:0x00007f7b64742458> #<Tag:0x00007f7b647421b0>

(All Safe) #1

Я использую 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


(All Safe) #2

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


(Евгений) #3

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

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/");

(All Safe) #4

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

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

(Евгений) #5

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

docker-machine ls

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


(All Safe) #6

Нет, у меня рабочая машина 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

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


(Евгений) #7

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

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


(All Safe) #8

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

Все примеры, как, например, https://github.com/selenide-examples/testcontainers работают вообще без проблем! Все проблемы начинаются, когда я хочу запустить мое SpringBootAngularReactVue etc, приложение, а не просто дернуть URL в интернете, как написано в этих примерах.


(Евгений) #9

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

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


(All Safe) #10

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


(Евгений) #11

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

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


(All Safe) #12

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

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

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


(Евгений) #13

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


(All Safe) #14

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

@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.


(Евгений) #15

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

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


(All Safe) #16

Да, приложение доступно. Но я поменял определение 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.