Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Запуск автотестов на Selenoid - базовые настройки

docker
ubuntu
selenoid
selenium-grid
selenium
webdriver
Теги: #<Tag:0x00007f7b70aa7240> #<Tag:0x00007f7b70aa6fe8> #<Tag:0x00007f7b70aa6e80> #<Tag:0x00007f7b70aa6c78> #<Tag:0x00007f7b70aa6b10> #<Tag:0x00007f7b70aa69a8>

(Павел Сенин) #1

А у кого-то получилось запустить тесты через #selenoid ?
У меня во время инициализации

DesiredCapabilities capabilities = DesiredCapabilities.firefox();
String url = "http://" + seleniumGridHubHostname + ":4444/wd/hub";
WebDriver nestedDriver = new RemoteWebDriver(new URL(url), capabilities);

Драйвер пытается в течении 10 секунд инициализироваться, в это же время поднимается контейнер с нодой и файрфоксом.
Но пото эксепшен происходит.

Запускал по инструкции

http://seleniumGridHubHostname :4444/status - отвечает JSON - все ок


(Sergey Korol) #2

А что за exception то? И что в логах контейнера?


(Павел Сенин) #3

спасибо, решил проблему инициализации драйвера, что сделал:

$ docker events
показал тоже самое - контейнер поднимается и через 10 секунд удаляется

а вот e.printstacktrace дал это:
org.openqa.selenium.WebDriverException: error: http://172.17.0.1:32785 does not respond in 10s
Command duration or timeout: 10.70 seconds

172.17.0.1 это какой-то внутренний адрес для сетевой инфраструктуры контейнеров
и номер порта при каждом запуске увеличивался на на 1

на виртуалке, которая работает в роли докер-хоста, открыл диапазон портов:
$sudo ufw allow 32000:33000/tcp

и это помогло, драйвер инициализировался
это логично, т.к. сначала был открыт только порт 4444 - по которому снаружи можно было попасть на хаб, а порты через которые можно попасть на ноду были закрыты


(vania-pooh) #4

Вообще порт может быть случайный (не только в указанном диапазоне), у Docker его можно задавать параметрами конфигурации демона.


(Павел Сенин) #5

подскажите пожалуйста, как именно нужно добавить флаг -limit int ?
здесь приера нет…


его нужно добавить в browsers.json (как?) или указать при запуске контейнера? (как именно)


(vania-pooh) #6
# docker run -d --name selenoid -p 4444:4444 -v /etc/selenoid:/etc/selenoid:ro -v /var/run/docker.sock:/var/run/docker.sock aandryashin/selenoid:1.0.0 -limit 10

Добавил в документацию: https://github.com/aandryashin/selenoid/blob/master/README.md#flags


(Павел Сенин) #7

спасибо, еще вопрос, тему даже переименовал

не знаю, это баг или фича, если баг, то в вашем проекте на гитхабе его заведу

если тесты были прерваны (или в коде тестов не указано закрытие драйвера), то некоторые контейнеры, которые были подняты для тестов, не уничтожаются, хотя я в доке читал про таймаут в одну минуту

контейнер aandryashin/selenoid версии 1.0.0


(vania-pooh) #8

Попробуйте aandryashin/selenoid:latest. Мы это недавно исправляли. В ближайшие дни хотим сделать новый релиз.


(Павел Сенин) #9

да, эта версия лучше отработала, но из 100 контейнеров с хромом один остался работать (уже 30 мин висит - на этом контейнере тест упал), это не критично, но на всякий случай лог:

[305.992][SEVERE]: Timed out receiving message from renderer: 299.331
[305.993][INFO]: Timed out. Stopping navigation...
[305.993][DEBUG]: DEVTOOLS COMMAND Runtime.evaluate (id=31) {
   "expression": "window.stop();",
   "returnByValue": true
}
[305.997][DEBUG]: DEVTOOLS EVENT Page.frameStoppedLoading {
   "frameId": "104.1"
}
[305.997][DEBUG]: DEVTOOLS RESPONSE Runtime.evaluate (id=31) {
   "result": {
      "type": "undefined"
   }
}
[305.997][DEBUG]: DEVTOOLS COMMAND Runtime.evaluate (id=32) {
   "expression": "1"
}
[305.997][SEVERE]: Timed out receiving message from renderer: -0.006
[305.998][INFO]: Done waiting for pending navigations. Status: timeout: cannot determine loading status
from timeout: Timed out receiving message from renderer: -0.006
[305.998][INFO]: RESPONSE Navigate timeout: cannot determine loading status
from timeout: Timed out receiving message from renderer: -0.006
  (Session info: chrome=56.0.2924.87)

фйл browser.json использует последние версии контейнеров с браузерами:

{
  "firefox": {
    "default": "latest",
    "versions": {
      "latest": {
        "image": "selenoid/firefox:latest",
        "port": "4444"
      }
    }
  },
  "chrome": {
    "default": "latest",
    "versions": {
      "latest": {
        "image": "selenoid/chrome:latest",
        "port": "4444"
      }
    }
  }
}

(vania-pooh) #10

Это похоже на багу. Заводи тикет в Гитхабе, будем смотреть. Контейнеры должны быстро удаляться (по умолчанию таймаут 1 минута, как в Selenium server).


(vania-pooh) #11

Забыл еще вот что написать. Мы скоро опубликуем статью про это, но мы там наделали контейнеров для Firefox, Chrome, Opera. Смотреть можно здесь:

Через какое-то время Selenoid будет уметь сам скачивать образы и обновлять свою конфигурацию (https://github.com/aandryashin/selenoid/issues/33).


(Oleksandr Khotemskyi) #12

Когда я вырасту я хочу быть таким же крутым как вы.


(vania-pooh) #13

Ешь больше морковки.


(Maxim Ivanov) #14

Привет, у меня точно такая же ошибка. Centos7 + firewalld.
Я добавил рулы на firewalld, но это не помогло.

Сейчас у меня вот такие настройки firewalld

firewall-cmd --list-all

public (default, active)
interfaces: docker0 eth0
sources:
services: dhcpv6-client http ssh
ports: 10000-12000/tcp 4444/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Но этого не достаточно. Смущает следующее:

iptables -L -t nat

MASQUERADE all – 172.17.0.0/16 anywhere
POSTROUTING_direct all – anywhere anywhere
POSTROUTING_ZONES_SOURCE all – anywhere anywhere
POSTROUTING_ZONES all – anywhere anywhere
MASQUERADE tcp – 172.17.0.2 172.17.0.2 tcp dpt:krb524
Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp – anywhere myhost tcp dpt:krb524 to:172.17.0.2:4444

А при этом selenoid пытается достучаться до 172.17.0.1 (контейнер с chrome при этом нормально поднимается):

2017/04/10 08:27:39 [NEW_REQUEST]
2017/04/10 08:27:39 [NEW_REQUEST_ACCEPTED]
2017/04/10 08:27:39 Locating the service for chrome
2017/04/10 08:27:39 Using default version: latest
2017/04/10 08:27:39 Using docker service for chrome latest
2017/04/10 08:27:39 Creating Docker container selenoid/chrome:latest …
2017/04/10 08:27:39 Starting container…
2017/04/10 08:27:40 Container 116905f338a07a42e1335b9b55ba1f5a59e2f6af869fcc1e69d51b87a588d00f started
Removing container 116905f338a07a42e1335b9b55ba1f5a59e2f6af869fcc1e69d51b87a588d00f
Container 116905f338a07a42e1335b9b55ba1f5a59e2f6af869fcc1e69d51b87a588d00f removed
2017/04/10 08:28:10 [SERVICE_STARTUP_FAILED] [error: http://172.17.0.1:10254 does not respond in 30s]

Похоже на проблему с моим окружением. Все настраиваю на одной виртуалке, selenoid + chrome на ней же.
Буду очень признателен, если кто-то подскажет, куда еще можно покопать.


(Павел Сенин) #15

Насколько я знаю, CentOS 7 более замороченная в плане настройки файрвола и они в последних редакциях меняли режим его работы. Точно не скажу. Попробуй использовать Ubntu 16.04 - все прекрасно взлетает и файрвол проще настраивается.


(Eugene Tsekhmeistruk) #16

С подобной ошибкой столкнулся на днях разворачивая это дело (selenoid) на aws ec2.
Интересно узнать как вы решили эту проблему,если решили.
Может это 30 сек маловато чтобы в контейнере все что нужно поднялось. хз. сегодня еще локально попробую.


(Eugene Tsekhmeistruk) #17

локально работает норм… хм…на aws в настройках security group открыл всё для всех. Все равно 30с not respond ошибка. (local ubuntu 16, aws ubuntu 14)


(Павел Сенин) #18

на удаленном хосте посмотрите логи:

$ docker logs ID

где ID - id или имя контейнера
еще проверьте, что контейнреы с браузером хотябы пытаются запуститься в момент обращения тестов к хабу:

$ docker ps

эта команда показывает запущенные в данный момент контейнеры

и на чем у вас тесты запускаются, на том же хосте в Амазоне или удаленно?


(Maxim Ivanov) #19

В моем случае это была проблема внутренней маршрутизации между конейнерами именно под центосом с firewalld. У меня селенойд поднимался на 172.17.0.2, хром на 172.17.0.3, а docker0 (это бридж для докера) имел инерфейс 172.17.0.1. Селенойд поднимал хром и пытался достучаться до него через 172.17.0.1, а нужно было либо напрямую на 172.17.0.3, либо через eth0 с реальным адресом. Вот.

В последней версии selenoid Александр Андряшин пофиксил эту проблему.

Попробуйте спулить последнюю версию селенойда. А вообще в убунту такой проблемы не должно быть.


(Eugene Tsekhmeistruk) #20

запулил latest: все заработало с первого раза. Очень шустро как по мне. Круто, спасибо за подсказку, и отдельное спасибо кто фиксил баги! =)