मैं फैंटमजेएस से हेडलेस क्रोम की ओर कदम बढ़ाने की कोशिश कर रहा हूं और थोड़ा रोड़ा बन गया हूं। स्थानीय परीक्षण के लिए, मैं सभी आश्रित सेवाओं को चलाने और चलाने के लिए डॉकर कंपोज़ का उपयोग कर रहा हूं। Google Chrome को प्रोविज़न करने के लिए, मैं एक ऐसी छवि का उपयोग कर रहा हूं जो पोर्ट 4444 पर परोसते समय इसे और ChromeDriver दोनों को एक साथ बंडल करती है। फिर मैं इसे इस सरलीकृत docker-compose.yml फ़ाइल में निम्नानुसार अपने ऐप कंटेनर से लिंक करता हूं:

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: ""

फिर, मेरे पास एक spec/spec_helper.rb फ़ाइल है जो परीक्षण वातावरण और संबंधित टूलिंग को बूटस्ट्रैप करती है। मैं :headless_chrome ड्राइवर को परिभाषित करता हूं और इसे क्रोमड्राइवर के स्थानीय बाध्यकारी पर इंगित करता हूं; http://chromedriver:4444. मुझे पूरा यकीन है कि निम्नलिखित सही है:

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

हम वीसीआर का भी उपयोग करते हैं, लेकिन मैंने इसे क्रोमड्राइवर द्वारा उपयोग किए गए पोर्ट के किसी भी कनेक्शन को अनदेखा करने के लिए कॉन्फ़िगर किया है:

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

मैं डॉकर कंपोज़ के साथ सेवाएं शुरू करता हूं, जो टेस्ट रनर को ट्रिगर करता है। आदेश बहुत ज्यादा है:

$ bundle exec rspec --format progress --profile --tag 'broken' --tag 'js' --tag '~quarantined'

थोड़ी प्रतीक्षा के बाद, मुझे पहली असफल परीक्षा का सामना करना पड़ा:

  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)>'

सभी विनिर्देशों में एक ही त्रुटि है। इसलिए, मैं मैन्युअल रूप से परीक्षण चलाने के लिए कंटेनर में खोल देता हूं और उस HTML को कैप्चर करता हूं जिसके खिलाफ यह परीक्षण कर रहा है। मैं इसे स्थानीय रूप से सहेजता हूं और निम्न क्रोम त्रुटि पृष्ठ द्वारा स्वागत करने के लिए इसे अपने ब्राउज़र में खोलता हूं। ऐसा लगता है कि क्रोमड्राइवर स्पेक के एचटीएमएल का मूल्यांकन नहीं कर रहा है क्योंकि यह उस तक नहीं पहुंच सकता है, इसलिए यह इस त्रुटि पृष्ठ के खिलाफ परीक्षण चलाने का प्रयास करता है।

उपरोक्त जानकारी को देखते हुए, मैं यहाँ क्या गलत कर रहा हूँ? मैं किसी भी और सभी मदद की सराहना करता हूं क्योंकि PhantomJS से दूर जाने से हमारे लिए तो कई सिरदर्द हल हो जाएंगे।

अग्रिम में बहुत बहुत धन्यवाद। कृपया मुझे बताएं कि क्या आपको अतिरिक्त जानकारी की आवश्यकता है।

enter image description here

15
Wilhelm Murdoch 6 सितंबर 2017, 13:21
1
क्या आप डॉकर इंस्टेंस या अपनी स्थानीय मशीन पर आरएसपीसी/कैपीबारा चला रहे हैं? यदि बाद वाला आपको Capybara.app_host सेट करने की आवश्यकता है, तो यह इंगित करने के लिए कि आपकी स्थानीय मशीन docker उदाहरण से किसी भी पते पर है।
 – 
Thomas Walpole
6 सितंबर 2017, 20:04
इस मामले में यह पूर्व है, मुझे डर है। सभी चीजें कंटेनरों में चल रही हैं। उत्तर देने के लिये धन्यवाद!
 – 
Wilhelm Murdoch
7 सितंबर 2017, 01:52
आह, क्षमा करें - मुझे "वेब" कंटेनर याद आया - उत्तर नीचे आ रहा है।
 – 
Thomas Walpole
7 सितंबर 2017, 02:02

1 उत्तर

सबसे बढ़िया उत्तर

आपकी समस्या यह है कि Capybara, डिफ़ॉल्ट रूप से, AUT को 127.0.0.1 के लिए बाध्य करता है और फिर ड्राइवर को उसी से ब्राउज़र अनुरोध करने के लिए कहता है। आपके मामले में हालांकि 127.0.0.1 वह जगह नहीं है जहां ऐप चल रहा है (ब्राउज़र परिप्रेक्ष्य से), क्योंकि यह ब्राउज़र से अलग कंटेनर पर है। इसे ठीक करने के लिए, आपको Capybara.server_host को "वेब" कंटेनर के बाहरी इंटरफ़ेस पर सेट करना होगा (जो "क्रोमेड्रिवर" कंटेनर से पहुंचा जा सकता है)। इससे Capybara उस इंटरफ़ेस से AUT को बाँध देगा और ड्राइवर को ब्राउज़र से अनुरोध करने के लिए कहेगा।

आपके मामले में शायद इसका मतलब है कि आप 'वेब' निर्दिष्ट कर सकते हैं

Capybara.server_host = 'web'
3
Thomas Walpole 9 सितंबर 2017, 03:35