documentation/docs/article/guides/semi_automation


sidebar_position: 20

Semi-automation

Playwright Browser context is isolated and not persisted by default. But we can also use persistent browser context using BrowserType#launch_persistent_context.
This allow us to intermediate into automation, for example

  • Authenticate with OAuth2 manually before automation
  • Testing a page after some chrome extensions are installed manually

Keep in mind repeatedly that persistent browser context is NOT RECOMMENDED for most cases because it would bring many side effects. Consider reusing cookie and local storage when you just want to keep authenticated across browser contexts.

Pause automation for manual operation

We can simply use binding.pry (with pry-byebug installed).

“`ruby {4}
playwright.chromium.launch_persistent_context(‘./data/’, headless: false) do |context|
page = context.new_page
page.goto(‘https://example.com/’)
binding.pry
end

When script is executed, it is paused as below.

3:
4: playwright.chromium.launch_persistent_context(‘./data/’, headless: false) do |context|
5: page = context.new_page
6: page.goto(‘https://example.com/’)
=> 7: binding.pry
8: end

[1] pry(main)>

We can inspect using `page`, `context` and also we can operate something manually during the pause.

See https://github.com/deivid-rodriguez/pry-byebug for more detailed debugging options.

## Working with Chrome extensions

**Playwright disables the Chrome extension feature by default.**
We have to enable it for installing Chrome extension, by passing these 3 parameters on launch.

* `acceptDownloads: true`
* `headless: false`
* `ignoreDefaultArgs: ['--disable-extensions']`

```ruby
require 'playwright'
require 'pry'

Playwright.create(playwright_cli_executable_path: './node_modules/.bin/playwright') do |playwright|
  launch_params = {
    acceptDownloads: true,
    channel: 'chrome',
    headless: false,
    ignoreDefaultArgs: ['--disable-extensions'],
  }

  playwright.chromium.launch_persistent_context('./data/', **launch_params) do |context|
    page = context.new_page
    page.goto('https://example.com/')
    binding.pry
  end
end