13

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.

enter image description here

+1

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

+0

@ThomasWalpole To jest pierwsze w tym przypadku, obawiam się. Wszystkie rzeczy działają w pojemnikach. Dziękuję za odpowiedź! –

+0

Ah, przepraszam - brakowało mi kontenera "web" - odpowiedź poniżej. –

Odpowiedz

2

Kwestia masz jest Kapibara, domyślnie uruchamia AUT związany 127.0.0.1 a następnie informuje kierowcę, aby mieć żądania przeglądarkę tak samo. W twoim przypadku jednak 127.0.0.1 nie jest tam, gdzie działa aplikacja (z punktu widzenia przeglądarek), ponieważ znajduje się w innym pojemniku niż przeglądarka. Aby to naprawić, musisz ustawić Capybara.server_host na dowolny zewnętrzny interfejs kontenera "web" (który jest dostępny z kontenera "chromedriver"). To spowoduje, że Capybara zwiąże AUT do tego interfejsu i powie kierowcowi, że przeglądarka wysyła do niego żądania.

W twoim przypadku to prawdopodobnie oznacza, że ​​można określić „www”

Capybara.server_host = 'web'