module Selenium::WebDriver::DriverExtensions::HasLogEvents
Constants
- KINDS
Public Instance Methods
on_log_event(kind, &block)
click to toggle source
Registers listener to be called whenever browser receives a new Console API message such as console.log() or an unhandled exception.
This currently relies on DevTools
so is only supported in Chromium browsers.
@example Collect console messages
logs = [] driver.on_log_event(:console) do |event| logs.push(event) end
@example Collect JavaScript exceptions
exceptions = [] driver.on_log_event(:exception) do |event| exceptions.push(event) end
@example Collect DOM mutations
mutations = [] driver.on_log_event(:mutation) do |event| mutations.push(event) end
@param [Symbol] kind :console, :exception or :mutation @param [#call] block which is called when event happens @yieldparam [DevTools::ConsoleEvent, DevTools::ExceptionEvent
, DevTools::MutationEvent]
# File lib/selenium/webdriver/common/driver_extensions/has_log_events.rb, line 59 def on_log_event(kind, &block) raise Error::WebDriverError, "Don't know how to handle #{kind} events" unless KINDS.include?(kind) enabled = log_listeners[kind].any? log_listeners[kind] << block return if enabled devtools.runtime.enable __send__("log_#{kind}_events") end
Private Instance Methods
log_console_events()
click to toggle source
# File lib/selenium/webdriver/common/driver_extensions/has_log_events.rb, line 76 def log_console_events devtools.runtime.on(:console_api_called) do |params| event = DevTools::ConsoleEvent.new( type: params['type'], timestamp: params['timestamp'], args: params['args'] ) log_listeners[:console].each do |listener| listener.call(event) end end end
log_exception_events()
click to toggle source
# File lib/selenium/webdriver/common/driver_extensions/has_log_events.rb, line 90 def log_exception_events devtools.runtime.on(:exception_thrown) do |params| description = if params.dig('exceptionDetails', 'exception') params.dig('exceptionDetails', 'exception', 'description') else params.dig('exceptionDetails', 'text') end event = DevTools::ExceptionEvent.new( description: description, timestamp: params['timestamp'], stacktrace: params.dig('exceptionDetails', 'stackTrace', 'callFrames') ) log_listeners[:exception].each do |listener| listener.call(event) end end end
log_listeners()
click to toggle source
# File lib/selenium/webdriver/common/driver_extensions/has_log_events.rb, line 72 def log_listeners @log_listeners ||= Hash.new { |listeners, kind| listeners[kind] = [] } end
log_mutation_event(params)
click to toggle source
# File lib/selenium/webdriver/common/driver_extensions/has_log_events.rb, line 120 def log_mutation_event(params) payload = JSON.parse(params['payload']) elements = find_elements(css: "*[data-__webdriver_id='#{payload['target']}']") return if elements.empty? event = DevTools::MutationEvent.new( element: elements.first, attribute_name: payload['name'], current_value: payload['value'], old_value: payload['oldValue'] ) log_listeners[:mutation].each do |log_listener| log_listener.call(event) end end
log_mutation_events()
click to toggle source
# File lib/selenium/webdriver/common/driver_extensions/has_log_events.rb, line 110 def log_mutation_events devtools.page.enable devtools.runtime.add_binding(name: '__webdriver_attribute') execute_script(mutation_listener) devtools.page.add_script_to_evaluate_on_new_document(source: mutation_listener) devtools.runtime.on(:binding_called) { |event| log_mutation_event(event) } end
mutation_listener()
click to toggle source
# File lib/selenium/webdriver/common/driver_extensions/has_log_events.rb, line 137 def mutation_listener @mutation_listener ||= read_atom(:mutationListener) end