ronin-rb/ronin-web-browser

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# ronin-web-browser

[![CI](https://github.com/ronin-rb/ronin-web-browser/actions/workflows/ruby.yml/badge.svg)](https://github.com/ronin-rb/ronin-web-browser/actions/workflows/ruby.yml)
[![Code Climate](https://codeclimate.com/github/ronin-rb/ronin-web-browser.svg)](https://codeclimate.com/github/ronin-rb/ronin-web-browser)

* [Website](https://ronin-rb.dev/)
* [Source](https://github.com/ronin-rb/ronin-web-browser)
* [Issues](https://github.com/ronin-rb/ronin-web-browser/issues)
* [Documentation](https://ronin-rb.dev/docs/ronin-web-browser/frames)
* [Discord](https://discord.gg/6WAb3PsVX9) |
  [Mastodon](https://infosec.exchange/@ronin_rb)

## Description

ronin-web-browser is a Ruby library for automating the Chrome web browser.
ronin-web-browser builds on the [ferrum] gem, and adds additional API methods
that are useful to security researchers.

## Features

* Automates the Chrome web browser.
* Supports running in visible or headless mode.
* Supports using a HTTP proxy.
* Supports event hooks for requests and responses.
* Supports parsing, setting, loading, and saving cookies.
* Supports saving screenshots into a directory or git repository.
* Small memory footprint (~50Kb Ruby + ~600Kb headless Chrome).
* Has 81% documentation coverage.
* Has 82% test coverage.

## Examples

Initialize a headless browser:

```ruby
browser = Ronin::Web::Browser.new
# ...
browser.quit
```

Initialize a visible browser:

```ruby
browser = Ronin::Web::Browser.new(visible: true)
# ...
browser.quit
```

Opening a temporary browser and automatically quitting:

```ruby
Ronin::Web::Browser.open do |browser|
  # ...
end
```

Initializing the browser with a proxy:

```ruby
browser = Ronin::Web::Browser.new(proxy: "http://proxy.example.com:8080")
# ...
```

Go to and screenshot a webpage:

```ruby
Ronin::Web::Browser.open do |browser|
  browser.go_to("https://google.com")
  browser.screenshot(path: "google.png")
end
```

Intercept all requests:

```ruby
browser = Ronin::Web::Browser.new
browser.every_request do |request|
  puts "> #{request.method} #{request.url}"
end

browser.go_to("https://twitter.com/login")
```

Intercept all responses for all requests:

```ruby
browser = Ronin::Web::Browser.new
browser.every_response do |response,request|
  puts "> #{request.method} #{request.url}"

  puts "< HTTP #{response.status}"

  response.headers.each do |name,value|
    puts "< #{name}: #{value}"
  end

  puts response.body
end

browser.go_to("https://twitter.com/login")
```

Evaluate JavaScript within the current page:

```ruby
browser = Ronin::Web::Browser.new
browser.goto('https://github.com')
browser.eval_js('document.cookie')
# => "..."
```

Load a JavaScript file into the current page as a `<script>` tag:

```ruby
browser.load_js(url: 'https://.../file.js')
```

Load JavaScript code into the current page as a `<script>` tag:

```ruby
browser.load_js(content: '...')
```

Inject JavaScript code into *every* page:

```ruby
browser.inject_js('...')
```

See [ferrum] for additional documentation.

## Requirements

* [Ruby] >= 3.0.0
* [ronin-support] ~> 1.0
* [ferrum] ~> 0.13

## Install

```shell
$ gem install ronin-web-browser
```

### Gemfile

```ruby
gem 'ronin-web-browser', '~> 0.1'
```

### gemspec

```ruby
gem.add_dependency 'ronin-web-browser', '~> 0.1'
```

## Development

1. [Fork It!](https://github.com/ronin-rb/ronin-web-browser/fork)
2. Clone It!
3. `cd ronin-web-browser/`
4. `bundle install`
5. `git checkout -b my_feature`
6. Code It!
7. `bundle exec rake spec`
8. `git push origin my_feature`

## License

Copyright (c) 2022-2024 Hal Brodigan (postmodern.mod3@gmail.com)

ronin-web-browser is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

ronin-web-browser is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with ronin-web-browser.  If not, see <https://www.gnu.org/licenses/>.

[Ruby]: https://www.ruby-lang.org
[ronin-support]: https://github.com/ronin-rb/ronin-support#readme
[ferrum]: https://github.com/rubycdp/ferrum#readme