Próbuję przenieść się z PhantomJS do Headless Chrome i wpadłem w szczyptę. W przypadku testów lokalnych używam aplikacji Docker Compose, aby uruchomić wszystkie usługi zależne. Aby udostępnić Google Chrome, używam obrazu, który łączy go z ChromeDriverem i wyświetla na porcie 4444
. I następnie połączyć go z pojemnika moim app następująco w tej uproszczonej docker-compose.yml
pliku:"Odmówił połączenia" przy użyciu ChromeDriver, Capybara i Docker Compose
web:
image: web/chrome-headless
command: [js-specs]
stdin_open: true
tty: true
environment:
- RACK_ENV=test
- RAILS_ENV=test
links:
- "chromedriver:chromedriver"
chromedriver:
image: robcherry/docker-chromedriver:latest
ports:
- "4444"
cap_add:
- SYS_ADMIN
environment:
CHROMEDRIVER_WHITELISTED_IPS: ""
Następnie Mam plik spec/spec_helper.rb
że siłach środowiska testowego i powiązanych narzędzi. Definiuję sterownik :headless_chrome
i kieruję go na lokalne powiązanie ChromeDriver; http://chromedriver:4444
. Jestem prawie pewien, że jest poprawny następuje:
Capybara.javascript_driver = :headless_chrome
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.register_driver :headless_chrome do |app|
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
chromeOptions: { args: %w[headless disable-gpu window-size=1440,900] },
)
Capybara::Selenium::Driver.new app,
browser: :chrome,
url: "http://chromedriver:4444/",
desired_capabilities: capabilities
end
również użyć magnetowidu, ale już skonfigurowane, aby pominąć wszelkie połączenia do portu używanego przez ChromeDriver:
VCR.configure do |c|
c.cassette_library_dir = 'spec/vcr_cassettes'
c.default_cassette_options = { record: :new_episodes }
c.ignore_localhost = true
c.allow_http_connections_when_no_cassette = false
c.configure_rspec_metadata!
c.ignore_hosts 'codeclimate.com'
c.hook_into :webmock, :excon
c.ignore_request do |request|
URI(request.uri).port == 4444
end
end
ja uruchomić usługi z Docker Compose, który uruchamia bieg próbny. Polecenie to jest dość dużo:
$ bundle exec rspec --format progress --profile --tag 'broken' --tag 'js' --tag '~quarantined'
Po chwili oczekiwania, spotykam pierwszy nieudany Test:
1) Beta parents code redemption: redeeming a code on the dashboard when the parent has reached the code redemption limit does not display an error message for cart codes
Failure/Error: fill_in "code", with: "BOOK-CODE"
Capybara::ElementNotFound:
Unable to find field "code"
# ./spec/features/beta_parents_code_redemption_spec.rb:104:in `block (4 levels) in <top (required)>'
Wszystkie specyfikacje mają ten sam błąd. Otwieram kontener, aby ręcznie uruchomić testy i przechwycić testowany kod HTML. Zapisuję ją lokalnie i otwieram w przeglądarce, by powitać ją na poniższej stronie błędu Chrome. Wygląda na to, że ChromeDriver nie analizuje kodu HTML specyfikacji, ponieważ nie może go osiągnąć, dlatego próbuje uruchomić testy na tej stronie błędu.
Biorąc pod uwagę powyższe informacje, co ja tu robię źle? Doceniam wszelką pomoc, ponieważ odejście od PhantomJS rozwiąże dla nas , więc wiele boli.
Dziękuję bardzo z góry. Daj mi znać, jeśli potrzebujesz dodatkowych informacji.
Czy działa rspec/Capybara na przykład Döcker lub komputerze lokalnym? Jeśli to ostatnie, musisz ustawić "Capybara.app_host" tak, aby wskazywał na dowolny adres twojego lokalnego komputera z instancji docker. –
@ThomasWalpole To jest pierwsze w tym przypadku, obawiam się. Wszystkie rzeczy działają w pojemnikach. Dziękuję za odpowiedź! –
Ah, przepraszam - brakowało mi kontenera "web" - odpowiedź poniżej. –