Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion development/CLI_VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.9.0-next-1612400196000
1.9.0-next-1613683796000
10,154 changes: 7,363 additions & 2,791 deletions development/api.json

Large diffs are not rendered by default.

64 changes: 53 additions & 11 deletions docs/api_coverage.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,13 +191,13 @@
* text
* type

## ~~Dialog~~
## Dialog

* ~~accept~~
* ~~default_value~~
* ~~dismiss~~
* ~~message~~
* ~~type~~
* accept
* default_value
* dismiss
* message
* type

## Download

Expand Down Expand Up @@ -276,20 +276,20 @@
* url
* ~~video~~
* viewport_size
* expect_console_message
* expect_download
* expect_event
* expect_file_chooser
* wait_for_function
* wait_for_load_state
* expect_navigation
* expect_popup
* expect_request
* expect_response
* wait_for_selector
* ~~wait_for_timeout~~
* ~~workers~~
* expect_download
* expect_popup
* ~~expect_worker~~
* expect_console_message
* expect_file_chooser
* ~~workers~~
* ~~wait_for_event~~
* accessibility
* keyboard
Expand Down Expand Up @@ -357,3 +357,45 @@
* firefox
* ~~selectors~~
* webkit

## Android

* devices
* ~~set_default_timeout~~

## AndroidDevice

* close
* ~~drag~~
* ~~fill~~
* ~~fling~~
* info
* ~~install_apk~~
* launch_browser
* ~~long_tap~~
* model
* ~~open~~
* ~~pinch_close~~
* ~~pinch_open~~
* ~~press~~
* ~~push~~
* screenshot
* ~~scroll~~
* serial
* ~~set_default_timeout~~
* shell
* ~~swipe~~
* ~~tap_point~~
* ~~wait~~
* ~~wait_for_event~~
* ~~web_view~~
* ~~web_views~~
* input

## AndroidInput

* drag
* press
* ~~swipe~~
* tap_point
* type
20 changes: 10 additions & 10 deletions lib/playwright/channel.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,20 @@ def initialize(connection, guid, object:)
# @param method [String]
# @param params [Hash]
def send_message_to_server(method, params = {})
result = @connection.send_message_to_server(@guid, method, params)
if result.is_a?(Hash)
_type, channel_owner = result.first
channel_owner
else
nil
end
async_send_message_to_server(method, params).value!
end

# @param method [String]
# @param params [Hash]
def send_no_reply(method, params)
@connection.async_send_message_to_server(@guid, method, params)
nil
def async_send_message_to_server(method, params = {})
@connection.async_send_message_to_server(@guid, method, params).then do |result|
if result.is_a?(Hash)
_type, channel_owner = result.first
channel_owner
else
nil
end
end
end
end
end
28 changes: 28 additions & 0 deletions lib/playwright/channel_owners/dialog.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
module Playwright
define_channel_owner :Dialog do
def type
@initializer['type']
end

def message
@initializer['message']
end

def default_value
@initializer['defaultValue']
end

def accept(promptText: nil)
accept_async(prompt_text: promptText).value!
end

def accept_async(promptText: nil)
params = { promptText: promptText }.compact
@channel.async_send_message_to_server('accept', params)
end

def dismiss
@channel.async_send_message_to_server('dismiss')
end
end
end
8 changes: 4 additions & 4 deletions lib/playwright/channel_owners/page.rb
Original file line number Diff line number Diff line change
Expand Up @@ -130,22 +130,22 @@ module Playwright
private def on_dialog(params)
dialog = ChannelOwners::Dialog.from(params['dialog'])
unless emit(Events::Page::Dialog, dialog)
dialog.dismiss # FIXME: this should be asynchronous
dialog.dismiss
end
end

# @override
def on(event, callback)
if event == Events::Page::FileChooser && listener_count(event) == 0
@channel.send_no_reply('setFileChooserInterceptedNoReply', intercepted: true)
@channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: true)
end
super
end

# @override
def once(event, callback)
if event == Events::Page::FileChooser && listener_count(event) == 0
@channel.send_no_reply('setFileChooserInterceptedNoReply', intercepted: true)
@channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: true)
end
super
end
Expand All @@ -154,7 +154,7 @@ def once(event, callback)
def off(event, callback)
super
if event == Events::Page::FileChooser && listener_count(event) == 0
@channel.send_no_reply('setFileChooserInterceptedNoReply', intercepted: false)
@channel.async_send_message_to_server('setFileChooserInterceptedNoReply', intercepted: false)
end
end

Expand Down
1 change: 1 addition & 0 deletions lib/playwright/utils.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module Utils
module PrepareBrowserContextOptions
# @see https://github.com/microsoft/playwright/blob/5a2cfdbd47ed3c3deff77bb73e5fac34241f649d/src/client/browserContext.ts#L265
private def prepare_browser_context_options(params)
params[:sdkLanguage] = 'ruby'
if params[:noViewport] == 0
params.delete(:noViewport)
params[:noDefaultViewport] = true
Expand Down
117 changes: 117 additions & 0 deletions spec/integration/page/dialog_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
require 'spec_helper'

RSpec.describe 'dialog' do
it 'should fire' do
with_page do |page|
dialog_promise = Concurrent::Promises.resolvable_future
page.once('dialog', ->(dialog) {
dialog_promise.fulfill({
type: dialog.type,
default_value: dialog.default_value,
message: dialog.message,
})
dialog.accept_async
})
page.evaluate('() => alert("yo")')

expect(dialog_promise.value!).to eq({
type: 'alert',
default_value: '',
message: 'yo',
})
end
end

it 'should allow accepting prompts' do
with_page do |page|
dialog_promise = Concurrent::Promises.resolvable_future
page.once('dialog', ->(dialog) {
dialog_promise.fulfill({
type: dialog.type,
default_value: dialog.default_value,
message: dialog.message,
})
dialog.accept_async(promptText: 'answer!')
})
result = page.evaluate("() => prompt('question?', 'yes.')")

expect(dialog_promise.value!).to eq({
type: 'prompt',
default_value: 'yes.',
message: 'question?',
})
expect(result).to eq('answer!')
end
end

it 'should dismiss the prompt' do
with_page do |page|
page.once('dialog', ->(dialog) { dialog.dismiss })
result = page.evaluate("() => prompt('question?')")
expect(result).to be_nil
end
end

it 'should accept the confirm prompt' do
with_page do |page|
page.once('dialog', ->(dialog) { dialog.accept_async })
result = page.evaluate("() => confirm('boolean?')")
expect(result).to eq(true)
end
end

it 'should dismiss the confirm prompt' do
with_page do |page|
page.once('dialog', ->(dialog) { dialog.dismiss })
result = page.evaluate("() => confirm('boolean?')")
expect(result).to eq(false)
end
end

it 'should handle multiple alerts' do
with_page do |page|
page.on('dialog', ->(dialog) { dialog.accept_async })
page.content = <<~HTML
<p>Hello World</p>
<script>
alert('Please dismiss this dialog');
alert('Please dismiss this dialog');
alert('Please dismiss this dialog');
</script>
HTML

expect(page.text_content('p')).to eq('Hello World')
end
end

it 'should handle multiple confirms' do
with_page do |page|
page.on('dialog', ->(dialog) { dialog.accept_async })
page.content = <<~HTML
<p>Hello World</p>
<script>
confirm('Please confirm me?');
confirm('Please confirm me?');
confirm('Please confirm me?');
</script>
HTML

expect(page.text_content('p')).to eq('Hello World')
end
end

it 'should auto-dismiss the prompt without listeners' do
with_page do |page|
result = page.evaluate("() => prompt('question?')")
expect(result).to be_nil
end
end

it 'should auto-dismiss the alert without listeners' do
with_page do |page|
page.content = '<div onclick="window.alert(123); window._clicked=true">Click me</div>'
page.click('div')
expect(page.evaluate('window._clicked')).to eq(true)
end
end
end