Giter VIP home page Giter VIP logo

ferrum's People

Contributors

aaronjensen avatar alexanderadam avatar alexwayfer avatar betelgeuse avatar buonomo avatar denisadamchik avatar drnluz avatar erickgskovik avatar ericparshall avatar francisbeaudoin avatar gbaptista avatar gordonbondon avatar intrepidd avatar janbiedermann avatar julioolvr avatar mifrill avatar msnexploder avatar nakilon avatar nenoganchev avatar nickhammond avatar postmodern avatar rmarot avatar route avatar sebyx07 avatar sigmike avatar sloanesturz avatar stoivo avatar ttilberg avatar valve avatar zw963 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ferrum's Issues

Spec error "There aren't targets available" on Windows 7

Hi, I'm using Ferrum 0.2.1 on Windows 7 Professional SP1. I tried running the first "save a screenshot" example from README.md, and I get the error "There aren't targets available (Ferrum::EmptyTargetsError)"

I get the same error running the specs:

C:\ferrum-master>bundle exec rake
C:/Ruby/Ruby255-x64/bin/ruby.exe -I'C:/Ruby/Ruby255-x64/lib/ruby/gems/2.5.0/gems/rspec-core-3.8.2/lib';'C:/Ruby/Ruby255-x64/lib/ruby/g
ems/2.5.0/gems/rspec-support-3.8.2/lib' 'C:/Ruby/Ruby255-x64/lib/ruby/gems/2.5.0/gems/rspec-core-3.8.2/exe/rspec' --pattern 'spec/**{,/*/*
*}/*_spec.rb'
Starting Puma
* Version 4.1.0 , codename: Fourth and One
* Min threads: 0, max threads: 4
* Listening on tcp://127.0.0.1:60259

basic http authentication
  denies without credentials (FAILED - 1)

Failures:

  1) basic http authentication denies without credentials
     Got 0 failures and 2 other errors:

     1.1) Failure/Error: raise EmptyTargetsError if targets.empty?

          Ferrum::EmptyTargetsError:
            There aren't targets available
          # ./lib/ferrum/targets.rb:110:in `block in targets'
          # ./lib/ferrum.rb:95:in `with_attempts'
          # ./lib/ferrum/targets.rb:105:in `targets'
          # ./lib/ferrum/targets.rb:12:in `initialize'
          # ./lib/ferrum/browser.rb:109:in `new'
          # ./lib/ferrum/browser.rb:109:in `targets'
          # ./spec/browser/basic_auth_spec.rb:8:in `block (2 levels) in <module:Ferrum>'

     1.2) Failure/Error: raise EmptyTargetsError if targets.empty?

          Ferrum::EmptyTargetsError:
            There aren't targets available
          # ./lib/ferrum/targets.rb:110:in `block in targets'
          # ./lib/ferrum.rb:95:in `with_attempts'
          # ./lib/ferrum/targets.rb:105:in `targets'
          # ./lib/ferrum/targets.rb:12:in `initialize'
          # ./lib/ferrum/browser.rb:109:in `new'
          # ./lib/ferrum/browser.rb:109:in `targets'
          # ./lib/ferrum/browser.rb:94:in `reset'
          # ./spec/spec_helper.rb:58:in `block (2 levels) in <top (required)>'

Finished in 1.8 seconds (files took 2.23 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/browser/basic_auth_spec.rb:7 # basic http authentication denies without credentials

C:/Ruby/Ruby255-x64/bin/ruby.exe -I'C:/Ruby/Ruby255-x64/lib/ruby/gems/2.5.0/gems/rspec-core-3.8.2/lib';'C:/Ruby/Ruby255-x64/lib/ruby/g
ems/2.5.0/gems/rspec-support-3.8.2/lib' 'C:/Ruby/Ruby255-x64/lib/ruby/gems/2.5.0/gems/rspec-core-3.8.2/exe/rspec' --pattern 'spec/**{,/*/*
*}/*_spec.rb' failed

C:\ferrum-master>ruby -v
ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32]

Thanks for any assistance!

Is there any way I could use a proxy?

Hi, thanks for the great tools, seems all good, and I am looking around if I could pass in a proxy setting in the middle of my local machine to target website. Is there any options for me to do that now?

how to pass Basic Auth when opening a page

I Know with puppeteer you can simply pass basic auth by:

page.authenticate({'username':'YOUR_BASIC_AUTH_USERNAME', 'password': 'YOUR_BASIC_AUTH_PASSWORD'});

is there a way to do it with Ferrum ?

Allow Ferrum to use default (non incognito) context

I'd like my browser state/session to be preserved between uses of my script.

Currently, Ferrum places all commands inside a BrowserContext, which acts like an Incognito session and doesn't load stored cookies.

I would like to use the browser's default session (which isn't inside a context), and take advantage of the --user-data-dir flag to be able to persist state across sessions. This would require modifying how Ferrum uses and creates contexts to allow for non-browserContext requests. I am happy to do this, and submit a PR, but would like some author feedback (if possible) about whether such an option is in line with the project's vision before I start working on code for this.

Jruby error

below script works fine on MRI but fails sometime on Jruby

require 'ferrum'
require 'concurrent'


browser = Ferrum::Browser.new(process_timeout: 10, headless: false)
pool = Concurrent::FixedThreadPool.new(5)

context = browser.contexts.create

page = context.create_page
page.goto("https://www.google.com/search?q=Ruby+static+typing")
page.close

def extract_data(context)
    page = context.create_page
    page.goto("https://www.google.com/search?q=Ruby+static+typing")
    p page.at_xpath('/html/body/div[6]/div[3]/div[8]/div[1]/div[2]/div/div[2]/div[2]/div/div/div[1]/div/div[1]/a/h3').text
    page.close

end

100.times do 
    pool.post do
        begin
            extract_data(context)
        rescue Exception => e
            p e.message
        end
    end
end

pool.shutdown
pool.wait_for_termination

context.dispose
browser.quit

output

warning: thread "Ruby-0-Thread-3: /home/oshan/.asdf/installs/ruby/jruby-9.2.11.1/lib/ruby/gems/shared/gems/ferrum-0.8/lib/ferrum/browser/client.rb:19" terminated with exception (report_on_exception is true):
Concurrent::MultipleAssignmentError: Concurrent::MultipleAssignmentError
         set at /home/oshan/.asdf/installs/ruby/jruby-9.2.11.1/lib/ruby/gems/shared/gems/concurrent-ruby-1.1.6/lib/concurrent-ruby/concurrent/ivar.rb:114
  initialize at /home/oshan/.asdf/installs/ruby/jruby-9.2.11.1/lib/ruby/gems/shared/gems/ferrum-0.8/lib/ferrum/browser/client.rb:31

please run multiple attempts to see the errors.
I can see browser opening blank tabs. that cause to print Timed out waiting for response. It's possible that this happened because something took a very long time (for example a page load was slow). If so, setting the :timeout option to a higher value might help. and when I wasn't handling the exception rescue I got same warning as above. so I guess it relate to page close method?

Xvfb support

Hey, I've got ferrum working with xvfb. Are you interested to have ferrum automatically handle Xvfb opening and choosing a display?

Like when you pass headless: :xfb

I could PR on this

Brave instead of Chrome?

Is it possible to use Brave browser instead of Chrome?

It's supposedly build off of Chromium, if that helps?

Sorry I don't know much so I'm not even sure if this is a valid question to ask.

Thanks!

Pick option in select

I can't figure out a way to pick an option item in a select.

Example HTML:
<select id="cars" name="cars"> <option value="volvo">Volvo</option> <option value="saab">Saab</option> <option value="fiat">Fiat</option> <option value="audi">Audi</option> </select>

Clicking on the select opens the drop-down list. Using tap { browser.keyboard.type(:Down) } did not work. Option cannot be clicked on, because of being unable to calculate quads. I could be missing something obvious, and any help would be appreciated.

NoMethodError (undefined method `compact' for "(cyclic structure)":String in Browser#css

Problem

Calling Browser#css with seemingly any parameter fails with the following error:

NoMethodError (undefined method `compact' for "(cyclic structure)":String)

Steps to reproduce

browser = Ferrum::Browser.new
browser.goto("https://www.google.com")
# this works:
browser.at_css('input') # => Ferrum::Node
# this doesn't:
browser.css('input') # => NoMethodError (undefined method `compact' for "(cyclic structure)":String)
# but this does:
browser.xpath('//input') # => [Ferrum::Node]

Expected behavior

I was expecting the method to return an Array of Ferrum::Node objects containing all the nodes matched by the selector, similar to how Browser#xpath behaves.

Chromium failing to start with "failed to dup supplied urandom fd: Bad file descriptor"

Hello,

I was seing this error randomly in my builds:

Browser did not produce websocket url within 5 seconds

The machine was not saturated, of course I tried increasing it (to 20 seconds) but the problem was still the same so it was clear it was not a timing issue.

I tried to enable debug logging but it was way too verbose so impossible to find the error in here. I ended up looking at the code adding just a puts to see the output where the ws URL is missing:

        unless ws_url
          @logger.puts(output) if @logger
          puts output
          raise ProcessTimeoutError.new(timeout)
        end

And so when the errors occurs I got this:

failed to dup supplied urandom fd: Bad file descriptor

This error comes from chromium code I guess, but I'm not sure why I have it here and not when I use chromium directly. It doesn't look like Ferrum is "supplying" a custom FD for this.

> chromium --version
Chromium 81.0.4044.113 snap

I tried starting chromium manually with the exact same parameters:

/snap/bin/chromium --headless --disable-gpu --hide-scrollbars --mute-audio --enable-automation --disable-web-security --disable-session-crashed-bubble --disable-breakpad --disable-sync --no-first-run --use-mock-keychain --keep-alive-for-test --disable-popup-blocking --disable-extensions --disable-hang-monitor --disable-features=site-per-process,TranslateUI --disable-translate --disable-background-networking --enable-features=NetworkService,NetworkServiceInProcess --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-ipc-flooding-protection --disable-prompt-on-repost --disable-renderer-backgrounding --force-color-profile=srgb --metrics-recording-only --safebrowsing-disable-auto-update --password-store=basic --window-size=1024,768 --remote-debugging-port=0 --remote-debugging-address=127.0.0.1 --user-data-dir=/tmp/d20200508-7638-17rc0fb

Many times but never reproduced this error message.

I run my tests in parallel using paraspec, I could reproduce the problem even with a very low concurrency of 2 (on a 6 cores CPU) so the problem is not starting time or slowdown it seems, but maybe concurrency issue somewhere?

I managed to write a small Ferrum script to reproduce the issue using fork:

#!/usr/bin/env ruby

require 'ferrum'

10.times do
  fork do
    puts "[#{$$}] Start Ferrum in fork"
    browser = Ferrum::Browser.new
    browser.goto("https://updown.io")
    browser.quit
    puts "[#{$$}] Done."
  end
end
Process.waitall

Launching this script reproduce this error every time on my machine (sometimes I also see /snap/chromium/1117/bin/desktop-launch: line 302: /dev/null: Operation not permitted)

Any idea about where could this come from and how to fix it?

Remove browser_options in DEFAULT_OPTIONS

Currently the DEFAULT_OPTIONS in lib/ferrum/browser/chrome.rb can't be removed by the options given to Ferrum::Browser.new. Is there any way to do that?

The problem I'm facing is that some website check the "origin" HTTP header on the server side, and with "--disable-web-security" Chrome doesn't send the origin header at all.

Workaround I'm using now is:

opt = Ferrum::Browser::Chrome.send(:remove_const, :DEFAULT_OPTIONS).dup
opt.delete('disable-web-security')
Ferrum::Browser::Chrome.const_set(:DEFAULT_OPTIONS, opt)

Is there a way to fetch the Javascript console?

I've tried to setup a logger: option when initializing the Ferrum::Browser but my console.log("xyz"); don't make it there.

Is there a way to fetch the Javascript console?

Thanks for the excellent gem.

Full screenshots don't show page content

Hi, I'm finding Ferrum to be a great lib, thank you! I have a bug to report when taking screenshots.

The full: true option when passed to #screenshot does not show the full page, instead it only renders the visible area of the page according to the viewport and then the rest is a solid background colour. I think the tests don't catch this because they only check the image dimensions.

Here's an example:

b = Ferrum::Browser.new
b.goto "http://www.csszengarden.com/"
b.resize width: 800, height: 200
b.screenshot(path: "zg200.png", full: true)

b.resize width: 800, height: 600
b.screenshot(path: "zg600.png", full: true)

b.resize width: 800, height: b.evaluate("document.documentElement.offsetHeight")
b.screenshot(path: "zgfull.png", full: true)

Expose API to enable mobile emulation mode

From what I see in the library there's only one call to setDeviceMetricsOverride that sets mobile: false.

It would be great if there was an exposed API to enable mobile emulation and manage width and height of the viewport dynamically.

Leaking chromium.launcher processes?

I've noticed on my CI server (using cuprite) a lot of orphan chomium.launcher process with sleep 60 as child:
image

It looks like this process is started when specs are running:
image
But then it stays orphan after the spec finishes, this may have nothing to do with ferrum but I didn't notice this with chrome-driver previously so I though I would report this.

I'm using Ubuntu 19.10 with Google Chrome 81.0.4044.113
These processes do not die after 60 seconds, it seems the launcher process is calling sleep 60 in loop. I can also reproduce the issue on my desktop (Ubuntu 19.10 too)

I use this cuprite config:

Capybara.javascript_driver = :cuprite
Capybara.register_driver(:cuprite) do |app|
  Capybara::Cuprite::Driver.new(app, headless: true, js_errors: true, timeout: 10, process_timeout: 10)
end

Any idea what could cause that?

More screenshot options

Looking at the source and docs, it seems like the only options for screeshot dimensions are either "full" or "viewport".

Is there a way to specify the width and height of the viewport?

NoMethodError: undefined method `compact' for "(cyclic structure)":String

When using together with Cuprite and executing Rspec command like:
page.evaluate_script("jQuery('body').addClass('not-reloaded');")
it's erroring with:

NoMethodError: undefined method `compact' for "(cyclic structure)":String
from (pry):5:in `rescue in handle_response'
Caused by NoMethodError: undefined method `compact' for "(cyclic structure)":String
from ~/.rvm/gems/ruby-2.5.3/bundler/gems/ferrum-5b6cb3f617b0/lib/ferrum/page/runtime.rb:127:in `handle_response'

Correspoding reduce_props(object_id, []) at https://github.com/route/ferrum/blob/master/lib/ferrum/page/runtime.rb#L122 is returning "(cyclic structure)" String, so it's clear why compact call is failing.

Not sure what's best approach to handle this case.

"_cuprite is undefined" error, `execution_id` of `main_frame` can be overwritten.

execution_id of main_frame can be overwritten during Runtime.executionContextCreated event for chrome-extension for example.
I temporary fixed this with
frame.execution_id = context_id unless frame.instance_variable_get(:@execution_id)
I faced this issue in Opera browser which creates execution context forVideo handler extension for every frame.

No Websocket url within 2 seconds

Fresh install on MacOS El Capitan. I tried the Google connection, and other sites, and this error pops up:

/Users/rich/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/ferrum-0.7/lib/ferrum/browser/process.rb:137:in parse_ws_url': Browser process did not produce websocket url within 2 seconds (RuntimeError)`

I'm not sure what to provide at this point. /usr/local/bin/chromedriver is installed.

browser.current_title doesn't work

README says browser should have a method called 'current_title'

Screen Shot 2020-04-02 at 10 54 52 AM

This says it doesn't work. I did sudo gem install ferrum to ensure updates. Got ferrum-0.7.

browser.screenshot throwing a Ferrum::DeadBrowserError on Raspberry pi

I encounter some issue with Ferrum on the raspberry pi 3 (raspbian).
Things are overall working fine it seems, but when I try to get a screenshot a Browser is dead (Ferrum::DeadBrowserError) is thrown.

My code:

browser = Ferrum::Browser.new(logger: STDERR, timeout: 20, process_timeout: 20)
browser.goto("https://github.com")
browser.screenshot(path:"github.png")
browser.quit

Chromedriver version: ChromeDriver 74.0.3729.157 (7b16107ab85c5364cdcd0b2dea2539a1f2dc327a-refs/branch-heads/3729@{#998})

Chromium version: Chromium 74.0.3729.157 Built on Raspbian , running on Raspbian 10

Logs:



▶ 0.8312325989973033 {"method":"Target.setDiscoverTargets","params":{"discover":true},"id":1}
    ◀ 0.8561899380001705 {"method":"Target.targetCreated","params":{"targetInfo":{"targetId":"3451b391-c1bc-4c79-954a-47d2b1dd5aa9","type":"browser","title":"","url":"","attached":true}}}
    ◀ 0.8572876209946116 {"method":"Target.targetCreated","params":{"targetInfo":{"targetId":"576D116D51492A2AE7E9F8B02C3C7AFA","type":"page","title":"","url":"about:blank","attached":false,"browserContextId":"83AD84A5DA67ABEA43ED2DCBA0CF24B1"}}}
    ◀ 0.8581510280055227 {"method":"Target.targetCreated","params":{"targetInfo":{"targetId":"e1ab0774-f216-4a41-99fe-79b449627d85","type":"browser","title":"","url":"","attached":false}}}


▶ 0.8603847810009029 {"method":"Target.createBrowserContext","params":{},"id":2}
    ◀ 0.8596250749978935 {"id":1,"result":{}}


▶ 0.8640326320019085 {"method":"Target.createTarget","params":{"browserContextId":"86496573612177A95997CE86C8B75E09","url":"about:blank"},"id":3}
    ◀ 0.8627023909939453 {"id":2,"result":{"browserContextId":"86496573612177A95997CE86C8B75E09"}}
    ◀ 0.8695459459995618 {"method":"Target.targetCreated","params":{"targetInfo":{"targetId":"9FE06F59BCD0841F26F0B53F1762670F","type":"page","title":"","url":"","attached":false,"browserContextId":"86496573612177A95997CE86C8B75E09"}}}
    ◀ 0.8787524249928538 {"id":3,"result":{"targetId":"9FE06F59BCD0841F26F0B53F1762670F"}}


▶ 0.8835369180014823 {"method":"Page.enable","params":{},"id":1001}
    ◀ 0.8894098250020761 {"method":"Target.targetInfoChanged","params":{"targetInfo":{"targetId":"9FE06F59BCD0841F26F0B53F1762670F","type":"page","title":"","url":"about:blank","attached":true,"browserContextId":"86496573612177A95997CE86C8B75E09"}}}
    ◀ 0.9641696489998139 {"method":"Target.targetInfoChanged","params":{"targetInfo":{"targetId":"576D116D51492A2AE7E9F8B02C3C7AFA","type":"page","title":"about:blank","url":"about:blank","attached":false,"browserContextId":"83AD84A5DA67ABEA43ED2DCBA0CF24B1"}}}
    ◀ 0.9858697190065868 {"method":"Target.targetInfoChanged","params":{"targetInfo":{"targetId":"9FE06F59BCD0841F26F0B53F1762670F","type":"page","title":"about:blank","url":"about:blank","attached":true,"browserContextId":"86496573612177A95997CE86C8B75E09"}}}
    ◀ 0.9902511819964275 {"id":1001,"result":{}}


▶ 0.9915030359989032 {"method":"DOM.enable","params":{},"id":1002}
    ◀ 0.9979021009930875 {"id":1002,"result":{}}


▶ 0.9987974870018661 {"method":"CSS.enable","params":{},"id":1003}
    ◀ 1.0031615540065104 {"id":1003,"result":{}}


▶ 1.0041059520008275 {"method":"Runtime.enable","params":{},"id":1004}
    ◀ 1.013563062006142 {"method":"Runtime.executionContextCreated","params":{"context":{"id":1,"origin":"://","name":"","auxData":{"isDefault":true,"type":"default","frameId":"9FE06F59BCD0841F26F0B53F1762670F"}}}}
    ◀ 1.0143244350038003 {"id":1004,"result":{}}


▶ 1.0159129639941966 {"method":"Log.enable","params":{},"id":1005}
    ◀ 1.0179426499962574 {"id":1005,"result":{}}


▶ 1.0187779309926555 {"method":"Network.enable","params":{},"id":1006}
    ◀ 1.0205057870043674 {"id":1006,"result":{}}


▶ 1.0214511230005883 {"method":"Browser.getWindowForTarget","params":{"targetId":"9FE06F59BCD0841F26F0B53F1762670F"},"id":4}
    ◀ 1.0228925650008023 {"id":4,"result":{"windowId":2,"bounds":{"left":0,"top":0,"width":1024,"height":768,"windowState":"normal"}}}


▶ 1.024038218005444 {"method":"Browser.setWindowBounds","params":{"windowId":2,"bounds":{"windowState":"normal"}},"id":5}
    ◀ 1.025311531004263 {"id":5,"result":{}}


▶ 1.026535311000771 {"method":"Browser.setWindowBounds","params":{"windowId":2,"bounds":{"width":1024,"height":768,"windowState":"normal"}},"id":6}
    ◀ 1.0276017440046417 {"id":6,"result":{}}


▶ 1.0288821919966722 {"method":"Emulation.setDeviceMetricsOverride","params":{"width":1024,"height":768,"deviceScaleFactor":1,"mobile":false},"id":1007}
    ◀ 1.0306274960021256 {"method":"CSS.mediaQueryResultChanged","params":{}}
    ◀ 1.031602520000888 {"id":1007,"result":{}}


▶ 1.0325803049927345 {"method":"Page.getNavigationHistory","params":{},"id":1008}
    ◀ 1.0333433969935868 {"id":1008,"result":{"currentIndex":0,"entries":[{"id":2,"url":"about:blank","userTypedURL":"about:blank","title":"","transitionType":"typed"}]}}


▶ 1.0348001520032994 {"method":"Page.navigate","params":{"url":"https://github.com"},"id":1009}
    ◀ 1.0379407510044985 {"method":"Network.requestWillBeSent","params":{"requestId":"D374D9C283AECDB0069C187BE57287DF","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.com/","method":"GET","headers":{"Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"VeryHigh","referrerPolicy":"no-referrer-when-downgrade"},"timestamp":87098.883114,"wallTime":1569897098.774687,"initiator":{"type":"other"},"type":"Document","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 1.9378308190061944 {"method":"Network.responseReceived","params":{"requestId":"D374D9C283AECDB0069C187BE57287DF","loaderId":"D374D9C283AECDB0069C187BE57287DF","timestamp":87099.781194,"type":"Document","response":{"url":"https://github.com/","status":200,"statusText":"OK","headers":{"Date":"Tue, 01 Oct 2019 02:31:39 GMT","Content-Type":"text/html; charset=utf-8","Transfer-Encoding":"chunked","Server":"GitHub.com","Status":"200 OK","Vary":"X-PJAX\nAccept-Encoding","ETag":"W/\"49b9a4c05e52dd898d5c71f5a115d091\"","Cache-Control":"max-age=0, private, must-revalidate","Set-Cookie":"has_recent_activity=1; path=/; expires=Tue, 01 Oct 2019 03:31:39 -0000\n_octo=GH1.1.20502231.1569897099; domain=.github.com; path=/; expires=Fri, 01 Oct 2021 02:31:39 -0000\nlogged_in=no; domain=.github.com; path=/; expires=Sat, 01 Oct 2039 02:31:39 -0000; secure; HttpOnly\n_gh_sess=dWhMODdXemVHMkU3bGhCU3VuR2dyRnBNdUd2V3hTaGErTkRhWnhjUHVTV0ZwRUw3Nkt3ZFB4SCt1MUY2WUwwZVB5b1hNWi8za29jM1VSam4rSWxsYzVlbVJLVWdidVRqMEt2N1YxU3Z2M3V3Zkdua0JoWG5hZEFOOVA5OGNIWmwxVFdwd1JhenQ2cFUvaG4ralc4RHp3PT0tLWd4WVM0ZGFhWmQ4Z1VXTzU2T2NNU2c9PQ%3D%3D--a70968cb6995f43fb6bca31a803eb2f48036403e; path=/; secure; HttpOnly","X-Request-Id":"018ae935-c848-410f-979c-30162c1f72b7","Strict-Transport-Security":"max-age=31536000; includeSubdomains; preload","X-Frame-Options":"deny","X-Content-Type-Options":"nosniff","X-XSS-Protection":"1; mode=block","Referrer-Policy":"origin-when-cross-origin, strict-origin-when-cross-origin","Expect-CT":"max-age=2592000, report-uri=\"https://api.github.com/_private/browser/errors\"","Content-Security-Policy":"default-src 'none'; base-uri 'self'; block-all-mixed-content; connect-src 'self' uploads.github.com www.githubstatus.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com; frame-ancestors 'none'; frame-src render.githubusercontent.com; img-src 'self' data: github.githubassets.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com customer-stories-feed.github.com; manifest-src 'self'; media-src 'none'; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com","Content-Encoding":"gzip","X-GitHub-Request-Id":"A41E:2D4C:5497E5:7DC656:5D92BA8A"},"headersText":"HTTP/1.1 200 OK\r\nDate: Tue, 01 Oct 2019 02:31:39 GMT\r\nContent-Type: text/html; charset=utf-8\r\nTransfer-Encoding: chunked\r\nServer: GitHub.com\r\nStatus: 200 OK\r\nVary: X-PJAX\r\nETag: W/\"49b9a4c05e52dd898d5c71f5a115d091\"\r\nCache-Control: max-age=0, private, must-revalidate\r\nSet-Cookie: has_recent_activity=1; path=/; expires=Tue, 01 Oct 2019 03:31:39 -0000\r\nSet-Cookie: _octo=GH1.1.20502231.1569897099; domain=.github.com; path=/; expires=Fri, 01 Oct 2021 02:31:39 -0000\r\nSet-Cookie: logged_in=no; domain=.github.com; path=/; expires=Sat, 01 Oct 2039 02:31:39 -0000; secure; HttpOnly\r\nSet-Cookie: _gh_sess=dWhMODdXemVHMkU3bGhCU3VuR2dyRnBNdUd2V3hTaGErTkRhWnhjUHVTV0ZwRUw3Nkt3ZFB4SCt1MUY2WUwwZVB5b1hNWi8za29jM1VSam4rSWxsYzVlbVJLVWdidVRqMEt2N1YxU3Z2M3V3Zkdua0JoWG5hZEFOOVA5OGNIWmwxVFdwd1JhenQ2cFUvaG4ralc4RHp3PT0tLWd4WVM0ZGFhWmQ4Z1VXTzU2T2NNU2c9PQ%3D%3D--a70968cb6995f43fb6bca31a803eb2f48036403e; path=/; secure; HttpOnly\r\nX-Request-Id: 018ae935-c848-410f-979c-30162c1f72b7\r\nStrict-Transport-Security: max-age=31536000; includeSubdomains; preload\r\nX-Frame-Options: deny\r\nX-Content-Type-Options: nosniff\r\nX-XSS-Protection: 1; mode=block\r\nReferrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin\r\nExpect-CT: max-age=2592000, report-uri=\"https://api.github.com/_private/browser/errors\"\r\nContent-Security-Policy: default-src 'none'; base-uri 'self'; block-all-mixed-content; connect-src 'self' uploads.github.com www.githubstatus.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com; frame-ancestors 'none'; frame-src render.githubusercontent.com; img-src 'self' data: github.githubassets.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com customer-stories-feed.github.com; manifest-src 'self'; media-src 'none'; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com\r\nContent-Encoding: gzip\r\nVary: Accept-Encoding\r\nX-GitHub-Request-Id: A41E:2D4C:5497E5:7DC656:5D92BA8A\r\n\r\n","mimeType":"text/html","requestHeaders":{"Host":"github.com","Connection":"keep-alive","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3","Accept-Encoding":"gzip, deflate, br"},"requestHeadersText":"GET / HTTP/1.1\r\nHost: github.com\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\nAccept-Encoding: gzip, deflate, br\r\n","connectionReused":false,"connectionId":13,"remoteIPAddress":"13.114.40.48","remotePort":443,"fromDiskCache":false,"fromServiceWorker":false,"encodedDataLength":2284,"timing":{"requestTime":87098.884314,"proxyStart":-1,"proxyEnd":-1,"dnsStart":1.383,"dnsEnd":87.815,"connectStart":87.815,"connectEnd":540.267,"sslStart":155.815,"sslEnd":540.041,"workerStart":-1,"workerReady":-1,"sendStart":540.565,"sendEnd":540.859,"pushStart":0,"pushEnd":0,"receiveHeadersEnd":891.523},"protocol":"http/1.1","securityState":"secure","securityDetails":{"protocol":"TLS 1.3","keyExchange":"","keyExchangeGroup":"X25519","cipher":"CHACHA20_POLY1305","certificateId":0,"subjectName":"github.com","sanList":["github.com","www.github.com"],"issuer":"DigiCert SHA2 Extended Validation Server CA","validFrom":1525737600,"validTo":1591185600,"signedCertificateTimestampList":[],"certificateTransparencyCompliance":"unknown"}},"frameId":"9FE06F59BCD0841F26F0B53F1762670F"}}
    ◀ 1.940412705997005 {"id":1009,"result":{"frameId":"9FE06F59BCD0841F26F0B53F1762670F","loaderId":"D374D9C283AECDB0069C187BE57287DF"}}
    ◀ 1.9548210850043688 {"method":"Page.frameStartedLoading","params":{"frameId":"9FE06F59BCD0841F26F0B53F1762670F"}}
    ◀ 1.9630006630031858 {"method":"Target.targetInfoChanged","params":{"targetInfo":{"targetId":"9FE06F59BCD0841F26F0B53F1762670F","type":"page","title":"https://github.com","url":"https://github.com/","attached":true,"browserContextId":"86496573612177A95997CE86C8B75E09"}}}
    ◀ 1.967038107002736 {"method":"Network.dataReceived","params":{"requestId":"D374D9C283AECDB0069C187BE57287DF","timestamp":87099.794201,"dataLength":36184,"encodedDataLength":0}}
    ◀ 1.9678763050033012 {"method":"Runtime.executionContextDestroyed","params":{"executionContextId":1}}
    ◀ 1.9690215940063354 {"method":"Runtime.executionContextsCleared","params":{}}
    ◀ 1.9706022580066929 {"method":"Page.frameNavigated","params":{"frame":{"id":"9FE06F59BCD0841F26F0B53F1762670F","loaderId":"D374D9C283AECDB0069C187BE57287DF","url":"https://github.com/","securityOrigin":"https://github.com","mimeType":"text/html"}}}
    ◀ 1.9718270799930906 {"method":"Runtime.executionContextCreated","params":{"context":{"id":2,"origin":"https://github.com","name":"","auxData":{"isDefault":true,"type":"default","frameId":"9FE06F59BCD0841F26F0B53F1762670F"}}}}
    ◀ 1.9730189330002759 {"method":"DOM.documentUpdated","params":{}}
    ◀ 2.0057064639986493 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.3","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/assets/frameworks-849637ecbd4bd65815cc113d80fee2d4.css","method":"GET","headers":{"User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36","Referer":"https://github.com/","Origin":"https://github.com"},"mixedContentType":"none","initialPriority":"VeryHigh","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.826108,"wallTime":1569897099.71768,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":20},"type":"Stylesheet","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.008440385994618 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.4","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/assets/site-d20aa35917cf810095fab7458ea2a8e4.css","method":"GET","headers":{"User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36","Referer":"https://github.com/","Origin":"https://github.com"},"mixedContentType":"none","initialPriority":"VeryHigh","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.826904,"wallTime":1569897099.71848,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":21},"type":"Stylesheet","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.010343453992391 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.5","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/assets/github-ae81e416c83f4ddf38bf4c8c149384b3.css","method":"GET","headers":{"User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36","Referer":"https://github.com/","Origin":"https://github.com"},"mixedContentType":"none","initialPriority":"VeryHigh","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.827925,"wallTime":1569897099.7195,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":22},"type":"Stylesheet","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.0118947430019034 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.7","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/search-key-slash.svg","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.829196,"wallTime":1569897099.72077,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":307},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.0139962020039093 {"method":"Network.dataReceived","params":{"requestId":"D374D9C283AECDB0069C187BE57287DF","timestamp":87099.857246,"dataLength":65536,"encodedDataLength":0}}
    ◀ 2.0397416329942644 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.13","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/airbnb-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.868609,"wallTime":1569897099.76018,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":849},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.041765486006625 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.14","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/sap-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.869468,"wallTime":1569897099.76104,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":850},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.0437285030056955 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.15","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/ibm-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.87061,"wallTime":1569897099.76218,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":851},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.0458571500057587 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.16","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/google-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.871762,"wallTime":1569897099.76333,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":852},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.048426067995024 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.17","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/paypal-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.873033,"wallTime":1569897099.76461,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":853},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.050860660005128 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.18","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/bloomberg-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.873971,"wallTime":1569897099.76554,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":854},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.0718247220065678 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.19","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/spotify-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.874782,"wallTime":1569897099.76635,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":855},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.073466689995257 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.20","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/swift-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.875848,"wallTime":1569897099.76742,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":856},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.0751272000052268 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.21","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/facebook-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.876732,"wallTime":1569897099.76831,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":857},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.076691458001733 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.22","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/node-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.87753,"wallTime":1569897099.7691,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":858},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.0783243110054173 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.23","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/nasa-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.878373,"wallTime":1569897099.76995,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":859},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.079959195005358 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.24","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/logos/walmart-logo.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.879174,"wallTime":1569897099.77075,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":860},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.081534754994209 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.25","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/home-illo-team.svg","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.879987,"wallTime":1569897099.77156,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":889},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.083197297004517 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.26","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/home-illo-team-code.svg","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.880858,"wallTime":1569897099.77243,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":894},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.0850211439974373 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.27","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/home-illo-team-chaos.svg","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.881627,"wallTime":1569897099.7732,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":906},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.086779834004119 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.28","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/home-illo-team-tools.svg","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.882413,"wallTime":1569897099.77399,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":918},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.088596180998138 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.29","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/home-illo-business.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.884041,"wallTime":1569897099.77561,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":1084},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.0902107519941637 {"method":"Network.dataReceived","params":{"requestId":"D374D9C283AECDB0069C187BE57287DF","timestamp":87099.897246,"dataLength":33037,"encodedDataLength":0}}
    ◀ 2.1026737700012745 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.47","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/integrators/slackhq.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.932177,"wallTime":1569897099.82375,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":1133},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.1052716999984113 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.48","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/integrators/zenhubio.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.934165,"wallTime":1569897099.82574,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":1134},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.1075669129932066 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.49","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/integrators/travis-ci.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.936193,"wallTime":1569897099.82777,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":1135},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.1092225790052908 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.50","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/integrators/atom.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.93797,"wallTime":1569897099.82954,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":1136},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.111207159992773 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.51","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/integrators/circleci.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.938894,"wallTime":1569897099.83047,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":1137},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.1131719480035827 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.52","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/integrators/google.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.939673,"wallTime":1569897099.83125,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":1138},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.1152705419954145 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.53","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/images/modules/site/integrators/codeclimate.png","method":"GET","headers":{"Referer":"https://github.com/","User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.940651,"wallTime":1569897099.83222,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":1139},"type":"Image","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.1171746519976296 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.54","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/assets/compat-bootstrap-94789d4c.js","method":"GET","headers":{"User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36","Referer":"https://github.com/","Origin":"https://github.com"},"mixedContentType":"none","initialPriority":"Medium","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.943472,"wallTime":1569897099.83504,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":1495},"type":"Script","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.1191648569947574 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.55","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/assets/frameworks-ace387cc.js","method":"GET","headers":{"User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36","Referer":"https://github.com/","Origin":"https://github.com"},"mixedContentType":"none","initialPriority":"Medium","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.944634,"wallTime":1569897099.83621,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":1496},"type":"Script","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.121061726997141 {"method":"Network.requestWillBeSent","params":{"requestId":"1000025199.56","loaderId":"D374D9C283AECDB0069C187BE57287DF","documentURL":"https://github.com/","request":{"url":"https://github.githubassets.com/assets/github-bootstrap-17708fdc.js","method":"GET","headers":{"User-Agent":"Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/74.0.3729.157 HeadlessChrome/74.0.3729.157 Safari/537.36","Referer":"https://github.com/","Origin":"https://github.com"},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":87099.945806,"wallTime":1569897099.83738,"initiator":{"type":"parser","url":"https://github.com/","lineNumber":1498},"type":"Script","frameId":"9FE06F59BCD0841F26F0B53F1762670F","hasUserGesture":false}}
    ◀ 2.122604942996986 {"method":"Network.loadingFinished","params":{"requestId":"D374D9C283AECDB0069C187BE57287DF","timestamp":87099.895208,"encodedDataLength":42529,"shouldReportCorbBlocking":false}}
    ◀ 2.3038363759987988 {"method":"Network.responseReceived","params":{"requestId":"1000025199.3","loaderId":"D374D9C283AECDB0069C187BE57287DF","timestamp":87100.147468,"type":"Stylesheet","response":{"url":"https://github.githubassets.com/assets/frameworks-849637ecbd4bd65815cc113d80fee2d4.css","status":200,"statusText":"","headers":{"x-fastly-request-id":"2469cbdd9f3e2f677b4b5e3ff8d601d99bbe0316","date":"Tue, 01 Oct 2019 02:31:39 GMT","content-encoding":"gzip","vary":"Origin, Access-Control-Request-Headers, Access-Control-Request-Method, Accept-Encoding","age":"3833","x-cache":"HIT, HIT","status":"200","content-length":"24647","x-served-by":"cache-iad2138-IAD, cache-itm18827-ITM","access-control-allow-origin":"*","last-modified":"Mon, 23 Sep 2019 17:52:31 GMT","server":"AmazonS3","x-timer":"S1569897100.975827,VS0,VE0","etag":"\"fdc991ec3a542f3627092917c3baa28d\"","access-control-max-age":"3600","access-control-allow-methods":"GET","content-type":"text/css","via":"1.1 varnish, 1.1 varnish","accept-ranges":"bytes","x-cache-hits":"4, 180"},"mimeType":"text/css","connectionReused":false,"connectionId":73,"remoteIPAddress":"185.199.108.154","remotePort":443,"fromDiskCache":false,"fromServiceWorker":false,"encodedDataLength":395,"timing":{"requestTime":87099.827162,"proxyStart":-1,"proxyEnd":-1,"dnsStart":3.322,"dnsEnd":79.7,"connectStart":79.7,"connectEnd":251.44,"sslStart":145.753,"sslEnd":251.419,"workerStart":-1,"workerReady":-1,"sendStart":260.941,"sendEnd":262.827,"pushStart":0,"pushEnd":0,"receiveHeadersEnd":318.359},"protocol":"h2","securityState":"secure","securityDetails":{"protocol":"TLS 1.2","keyExchange":"ECDHE_RSA","keyExchangeGroup":"X25519","cipher":"AES_128_GCM","certificateId":0,"subjectName":"*.githubassets.com","sanList":["*.githubassets.com","githubassets.com"],"issuer":"DigiCert SHA2 High Assurance Server CA","validFrom":1540771200,"validTo":1604318400,"signedCertificateTimestampList":[],"certificateTransparencyCompliance":"unknown"}},"frameId":"9FE06F59BCD0841F26F0B53F1762670F"}}
    ◀ 2.3079078839946305 {"method":"Network.responseReceived","params":{"requestId":"1000025199.4","loaderId":"D374D9C283AECDB0069C187BE57287DF","timestamp":87100.151769,"type":"Stylesheet","response":{"url":"https://github.githubassets.com/assets/site-d20aa35917cf810095fab7458ea2a8e4.css","status":200,"statusText":"","headers":{"x-fastly-request-id":"cd466b037f4bd7c028c988123ae94632fa891846","date":"Tue, 01 Oct 2019 02:31:39 GMT","content-encoding":"gzip","vary":"Origin, Access-Control-Request-Headers, Access-Control-Request-Method, Accept-Encoding","age":"3162","x-cache":"HIT, HIT","status":"200","content-length":"14030","x-served-by":"cache-iad2147-IAD, cache-itm18827-ITM","access-control-allow-origin":"*","last-modified":"Thu, 19 Sep 2019 08:34:46 GMT","server":"AmazonS3","x-timer":"S1569897100.975837,VS0,VE0","etag":"\"4d55638d0fc43883b9646f209770d33b\"","access-control-max-age":"3600","access-control-allow-methods":"GET","content-type":"text/css","via":"1.1 varnish, 1.1 varnish","accept-ranges":"bytes","x-cache-hits":"1, 174"},"mimeType":"text/css","connectionReused":true,"connectionId":73,"remoteIPAddress":"185.199.108.154","remotePort":443,"fromDiskCache":false,"fromServiceWorker":false,"encodedDataLength":181,"timing":{"requestTime":87099.82938,"proxyStart":-1,"proxyEnd":-1,"dnsStart":-1,"dnsEnd":-1,"connectStart":-1,"connectEnd":-1,"sslStart":-1,"sslEnd":-1,"workerStart":-1,"workerReady":-1,"sendStart":258.87,"sendEnd":260.616,"pushStart":0,"pushEnd":0,"receiveHeadersEnd":319.966},"protocol":"h2","securityState":"secure","securityDetails":{"protocol":"TLS 1.2","keyExchange":"ECDHE_RSA","keyExchangeGroup":"X25519","cipher":"AES_128_GCM","certificateId":0,"subjectName":"*.githubassets.com","sanList":["*.githubassets.com","githubassets.com"],"issuer":"DigiCert SHA2 High Assurance Server CA","validFrom":1540771200,"validTo":1604318400,"signedCertificateTimestampList":[],"certificateTransparencyCompliance":"unknown"}},"frameId":"9FE06F59BCD0841F26F0B53F1762670F"}}
    ◀ 2.31049372900452 {"method":"Network.dataReceived","params":{"requestId":"1000025199.3","timestamp":87100.155399,"dataLength":20215,"encodedDataLength":4942}}
    ◀ 2.342035659996327 {"method":"Network.dataReceived","params":{"requestId":"1000025199.3","timestamp":87100.187109,"dataLength":28584,"encodedDataLength":5518}}
    ◀ 2.349421937993611 {"method":"Network.dataReceived","params":{"requestId":"1000025199.3","timestamp":87100.194383,"dataLength":35839,"encodedDataLength":5348}}
    ◀ 2.3563673710013973 {"method":"Network.dataReceived","params":{"requestId":"1000025199.3","timestamp":87100.201162,"dataLength":56530,"encodedDataLength":8277}}
    ◀ 2.3586233649984933 {"method":"Network.dataReceived","params":{"requestId":"1000025199.3","timestamp":87100.202809,"dataLength":2926,"encodedDataLength":580}}
    ◀ 2.403287028995692 {"method":"Network.loadingFinished","params":{"requestId":"1000025199.3","timestamp":87100.203826,"encodedDataLength":25060,"shouldReportCorbBlocking":false}}
    ◀ 2.4061445999977877 {"method":"Network.dataReceived","params":{"requestId":"1000025199.4","timestamp":87100.250606,"dataLength":42516,"encodedDataLength":7527}}


▶ 41.97464164199482 {"method":"Page.captureScreenshot","params":{"format":"png"},"id":1010}
Traceback (most recent call last):
        4: from tamanager.rb:7:in `<main>'
        3: from /home/pi/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/forwardable.rb:230:in `screenshot'
        2: from /home/pi/.rvm/gems/ruby-2.6.3/gems/ferrum-0.5/lib/ferrum/page/screenshot.rb:9:in `screenshot'
        1: from /home/pi/.rvm/gems/ruby-2.6.3/gems/ferrum-0.5/lib/ferrum/page.rb:110:in `command'
/home/pi/.rvm/gems/ruby-2.6.3/gems/ferrum-0.5/lib/ferrum/browser/client.rb:41:in `command': Browser is dead (Ferrum::DeadBrowserError)

The Page.captureScreenshot seems to take a really long time to process. I tried to increase the timeouts to 100 but it's simply waiting longer and fail.
Any idea what could be the problem? Save to pdf feature leads to the same error.

Thanks

Ferrum::DeadBrowserError Errors raised on Heroku

I mentioned this in #96 , but after successfully having Ferrum running within my application on Heroku, I have recently seen all of my Ferrum workers start to error out and throw the error Ferrum::DeadBrowserError

I'm using the Heroku Chrome Buildpack with the Chrome version of 84.0.4147.105 and the Rails version of 5.1.7.

When I run this locally everything works as expected, and I don't believe there's been any changes to my code (since the error is generated before we even really hit my code)

Steps to reproduce:

Open up a Rails Console
heroku run rails console

Create a browser instance
client = Ferrum::Browser.new

Go to a website
client.goto("http://yahoo.com")

get the error Ferrum::DeadBrowserError

Any plans to allow passing in HTML instead of a URL?

Hi folks, this is amazing and we hope to be able to collapse our current Grover/Puppeteer/Rails stack to just Ferrum/Rails in the future for screenshot generation of some views.

However, we rely on being able to pass in our views as rendered HTML strings rather than as a URL to fetch. (I think Grover uses Puppeteer's setContent() for this.)

Are there plans for Ferrum to support this in the future?

Allow Ferrum to use extensions?

Hey, currently It doesn't work to add extensions(Use them I mean)

I've tried to run it without headless enabled and they do really load.

But they load only in the initial window, the ferrum provided tabs don't have access to them :/

Ferrum::Network::Exchange doesn't support #url

I have a test helper function that calls
page.driver.network_traffic.select { |request| request.url =~ /foo/ }

This code used to work but is broken with Cuprite 0.8 and the advent of Ferrum::Network::Exchange. Is this an intentional change of the API?

Thank you for your help!

Install Chromium binary as Puppeteer it does

https://github.com/puppeteer/puppeteer/blob/4ee4649/README.md#installation

Note: When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API. To skip the download, or to download a different browser, see Environment variables.

I think it makes things easier.

Also, I don't want to download trunk version and I didn't find stable one at the link from this project README, https://www.chromium.org/getting-involved/download-chromium

Ferrum needs to listen DOM.documentUpdated in order to use NodeId values properly

https://chromedevtools.github.io/devtools-protocol/tot/DOM/#event-documentUpdated

Problem

Since ferrum tracks node ids in frontend but does not listen to DOM.documentUpdated it's possible that the following sequence of events happens:

  1. Ferrum::Node has node_id in memory
  2. DOM.documentUpdated happens
  3. calling methods on the node returns information for a new node that has matching id
    1. this would happen because they seem to start again from zero so they are not unique during single session

Fix

Make all Node objects listen to DOM.documentUpdated after which the objects should become stale so that all new commands issued with the node raise an exception.

browser.css(...) #=> undefined method `compact' for "(cyclic structure)":String

Chrome:
Version 81.0.4044.122 (Official Build) (64-bit)

require 'ferrum'
b = Ferrum::Browser.new(headless: false)
b.goto 'https://www.npr.org/sections/news/'
b.css('article')

NoMethodError: undefined method `compact' for "(cyclic structure)":String
from /Users/ttilberg/.asdf/installs/ruby/2.6.5/lib/ruby/gems/2.6.0/gems/ferrum-0.8/lib/ferrum/frame/runtime.rb:189:in `handle_response'

I'm getting this error with several (and all) different sites and css strings passing in. Perhaps there is a change in recent versions of Chrome/CDP?

MacOS Mojave 10.14.6
Chrome 81.0.4044.122
Ruby 2.6.5
Ferrum 0.8

Set value for non-focusable input

Is there a way how to fill hidden input field? Eg. a TEXTAREA with style="display: none;".

When I do this:

page.at_css('#hidden-field').focus.type('foobar')

I get Ferrum::BrowserError: Element is not focusable

Currenly this is working for me, but some native way of setting hidden values would be nice.

page.execute("document.getElementById('hidden-field').value = 'foobar'")

Is there a better way?

Full screenshot as blank at bottom

First, thank you for writing this gem. I wrote some samples and got some good results.
But when I use the option full as true. It causes the bottom as blank below:

Run:

require "ferrum"

browser = Ferrum::Browser.new
browser.goto("https://google.com")
search_input = browser.at_css("input[name='q']")
search_input.focus.type("Gym", :Enter)

browser.screenshot(path: "google.jpg", full: true)

Result:
google

Use scrollHeight/Width instead of offset for full?

The full option for screenshots is currently using the offsetHeight and offsetWidth:

https://github.com/route/ferrum/blob/0e96c1cf87ac768df521a6f321ced22f13899b7e/lib/ferrum/page/screenshot.rb#L49-L54

However, on my device™ (in Chrome Version 80.0.3987.116) this returns the size of the viewport. Thus when I run browser.screenshot(full: true, "google.png") I get the same result as without the full: true option.

Using the scrollHeight/scrollWidth instead returns the actual height/width of the rendered site.

PS: thank you for this gem, it has been a joy to use :)

Warnings

There are a two warnings when running rake test for app build with ferrum:

/Library/Ruby/Gems/2.6.0/gems/ferrum-0.8/lib/ferrum/context.rb:45: warning: assigned but unused variable - target_id
/Library/Ruby/Gems/2.6.0/gems/ferrum-0.8/lib/ferrum/browser/process.rb:96: warning: instance variable @user_data_dir not initialized

Probably nothing dangerous but a bit unclean.

`Ferrum::DeadBrowserError` is raised after running with multiprocess

Hello.

My environments and sample code is here.

OS: macOS 0.13.6 (17G8030)
Ruby: ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin17]
Gems:
  ferrum 0.8
  parallel 1.19.2
bundle exec ruby sample.rb
# sample.rb

require 'ferrum'
require 'parallel'
require 'pry'

browser = Ferrum::Browser.new
browser.goto('https://google.com')

Parallel.each(['1','2']) do |i|
  p i
end

# binding.pry
#browser.restart

browser.goto('https://www.amazon.com/')

browser.goto('https://www.amazon.com/') is raised Ferrum::DeadBrowserError. I checked a browser process after multi processing by browser.process.pid and ps command at binding.pry, then the process is zombie status.

So browser.restart to set will work just fine. Parallel with in_threads as multi threads mode also will work fine.

I'm not sure if the cause is ferrum, or parallel, or something else. I would like to know if you have any helpful information.

Thanks.

undefined method `window_handles'

Hi,

Not sure if it's a Ferrum or a Cuprite problem but it appears when updating from Ferrum 0.4 to 0.5.

I have this error when calling windows.count in a cucumber step using Capybara.

Cuprite version : 0.7.1

Stacktrace :
undefined method `window_handles' for #<Capybara::Cuprite::Browser:0x00007f90ba8018d8>
Did you mean?  window_size (NoMethodError)
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cuprite-0.7.1/lib/capybara/cuprite/driver.rb:124:in `window_handles'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/capybara-3.29.0/lib/capybara/session.rb:448:in `windows'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/capybara-3.29.0/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>'
/Users/benoit/www/minifeed.rails/features/step_definitions/common_steps.rb:2:in `block in <top (required)>'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/glue/invoke_in_world.rb:39:in `instance_exec'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/glue/invoke_in_world.rb:39:in `block in cucumber_instance_exec_in'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/glue/invoke_in_world.rb:54:in `cucumber_run_with_backtrace_filtering'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/glue/invoke_in_world.rb:27:in `cucumber_instance_exec_in'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/glue/step_definition.rb:110:in `invoke'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/step_match.rb:31:in `invoke'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/step_match.rb:24:in `block in activate'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/action.rb:24:in `execute'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/step.rb:32:in `execute'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/runner.rb:104:in `execute'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/runner.rb:51:in `execute'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/runner.rb:27:in `test_step'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/step.rb:17:in `describe_to'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/case.rb:28:in `block (3 levels) in describe_to'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/case.rb:27:in `each'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/case.rb:27:in `block (2 levels) in describe_to'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/filters/prepare_world.rb:22:in `block in test_case'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/around_hook.rb:17:in `execute'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/runner.rb:104:in `execute'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/runner.rb:51:in `execute'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/runner.rb:34:in `around_hook'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/around_hook.rb:12:in `describe_to'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/case.rb:120:in `block (2 levels) in compose_around_hooks'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/case.rb:121:in `compose_around_hooks'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/case.rb:26:in `block in describe_to'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/runner.rb:19:in `test_case'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/case.rb:25:in `describe_to'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/filters/prepare_world.rb:11:in `test_case'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/case.rb:25:in `describe_to'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/filter.rb:57:in `test_case'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/filters/retry.rb:18:in `test_case'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/case.rb:25:in `describe_to'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/filters/quit.rb:12:in `test_case'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/case.rb:25:in `describe_to'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/filters/broadcast_test_run_started_event.rb:21:in `block in done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/filters/broadcast_test_run_started_event.rb:20:in `map'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/filters/broadcast_test_run_started_event.rb:20:in `done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/filter.rb:62:in `done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/filter.rb:62:in `done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/filter.rb:62:in `done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/filter.rb:62:in `done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/filter.rb:62:in `done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/filters/locations_filter.rb:20:in `done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/filter.rb:62:in `done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/test/filters/tag_filter.rb:18:in `done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/compiler.rb:24:in `done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core/gherkin/parser.rb:39:in `done'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core.rb:32:in `parse'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-core-3.2.1/lib/cucumber/core.rb:21:in `compile'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/runtime.rb:75:in `run!'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/lib/cucumber/cli/main.rb:34:in `execute!'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/cucumber-3.1.2/bin/cucumber:9:in `<main>'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:54:in `load'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:54:in `load'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:285:in `block in load'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:257:in `load_dependency'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:285:in `load'
/Users/benoit/www/minifeed.rails/bin/cucumber:8:in `<main>'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:54:in `load'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:54:in `load'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:285:in `block in load'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:257:in `load_dependency'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:285:in `load'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/Users/benoit/.rbenv/versions/2.6.5/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'

Dealing with JS alerts

Hello Ferrum Developers,

I'm in the midst of programming the macros for a website that includes JavaScript alerts. Thanks to your software it's been a joy so far engaging with this automation work. I do however face a problem with alerts as of now. It seems that there's no native way of dealing with alerts? I would like to either automatically approve them or have them disabled from the start of chromium. I haven't been able to find a proper solution yet, but I would like to hear whether this could be done with Ferrum.

Thank you!

infinate scroll pagination

p browser.xpath("//div[@class='foobar']/div").length
browser.execute(%(window.scrollTo(0, document.body.scrollHeight)))
sleep 3 # for ajax load
p browser.xpath("//div[@class='foobar']/div").length

this is the code I'm trying after a scroll down div count has to increase, but its same.
when I set headless: false I can see pagination is working and new divs are appearing.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.