2015-02-27 3 views
2

У меня возникла проблема с инъекционным скриптом в Capybara. Вот фрагмент кода.Capybara - введите тег скрипта и дождитесь завершения задачи async

Capybara.register_driver :poltergeist do |app| 
     Capybara::Poltergeist::Driver.new(app, :phantomjs_options => ['--debug=no', '--ignore-ssl-errors=yes'], :js_errors => false) 
    end 

    Capybara.configure do |c| 
     c.javascript_driver = :poltergeist 
     c.default_driver = :poltergeist 
     c.app_host = "http://www.google.com" 
     c.default_wait_time = 120 
    end 

    Capybara.current_session.driver.headers = { 
     'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36', 
     'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' 
    } 
    visit('/') 
    Capybara.current_session.driver.execute_script("alert('Working!');") 
    sleep(1) 
    system('rm /tmp/screenshot.png') 
    Capybara.current_session.driver.save_screenshot('/tmp/screenshot.png') 

Здесь я впрыскиваю скрипт, который вызывает некоторые вызовы ajax и изменяет dom. Однако, когда я делаю снимок, я не вижу никаких изменений на странице, как будто сценарий никогда не был там. Я также попытался добавить простой оператор предупреждения, но не вижу предупреждения в снимке. Что мне здесь не хватает?

ответ

2

http://somescript.js кажется очень невероятным URL-адресом для вашего скрипта src, вы уверены, что это то, что разрешено локально для скрипта?

+0

Я заменил сценарии в фрагмент с фиктивными URL-адресами для конфиденциальности, но я использую рабочие URL-адреса в своем коде. – 3coins

+0

Что еще вы заменили? Любой из них может стать потенциальной причиной проблемы. Пожалуйста, соберите [Минимальный, Полный и Подтверждающий пример] (http://stackoverflow.com/help/mcve), чтобы показать проблему, т.е. мы можем управлять собой. Покажите код сценария, используйте 'alert()', если хотите, тогда у нас будет определенная надежда на возможность отладки проблемы. – smathy

+1

Упрощен пример с помощью оператора предупреждения и рабочих URL. Проблема в том, что я не вижу всплывающее окно предупреждения в снимке. – 3coins

2

Alert, который является модальным диалогом, не будет отображаться на снимках экрана.

Причина это потому, что PhantomJS является обезглавленное браузер, который на самом деле не делает всю страницу, на скриншоте момент сделан, все содержимое веб-страницы сохраняется (оказанной) в файл (без дополнительного модальный окна!). Следовательно, модальность Alert вообще не будет отображаться в скриншотах PhantomJs.

Таким образом, вы не можете снять снимок экрана. Что вы можете сделать, чтобы получить контекст предупреждения с onAlert обработчиком:

page.onAlert = function(msg) { 
    console.log('ALERT: ' + msg); 
}; 

Или, если вы используете Capybara с помощью яваскрипта драйвера, как Селен:

alert = page.driver.browser.switch_to.alert 
alertTest = alert.text 
alert.accept 
+0

Спасибо за ответ. Как насчет других асинхронных взаимодействий, таких как загрузка js-скрипта, который изменяет dom. Являются ли эти изменения тем, что PhantomJS сможет захватить? – 3coins

+0

Возможно, если вы выберете правильный обработчик события или запуск события внутри функции, которая изменит dom. – Stas