Module: Dommy::Rack

Defined in:
lib/dommy/rack.rb,
lib/dommy/rack/errors.rb,
lib/dommy/rack/history.rb,
lib/dommy/rack/locator.rb,
lib/dommy/rack/session.rb,
lib/dommy/rack/version.rb,
lib/dommy/rack/response.rb,
lib/dommy/rack/cookie_jar.rb,
lib/dommy/rack/navigation.rb,
lib/dommy/rack/visibility.rb,
lib/dommy/rack/file_upload.rb,
lib/dommy/rack/header_store.rb,
lib/dommy/rack/form_submission.rb,
lib/dommy/rack/request_builder.rb,
lib/dommy/rack/field_interactor.rb

Defined Under Namespace

Modules: FileUpload Classes: AmbiguousElementError, CookieJar, CrossOriginError, ElementNotClickableError, ElementNotFoundError, Error, FieldInteractor, FileNotFoundError, FormSubmission, HeaderStore, History, InvalidFormError, Locator, Navigation, RequestBuilder, Response, Session, TooManyRedirectsError, UnsupportedContentTypeError, UnsupportedURLError

Constant Summary collapse

VERSION =
"0.8.0"

Class Method Summary collapse

Class Method Details

.hidden_by_closed_details?(element) ⇒ Boolean

Inside a closed <details>, everything except the <summary> is hidden.

Returns:

  • (Boolean)


27
28
29
30
31
32
33
34
35
36
# File 'lib/dommy/rack/visibility.rb', line 27

def hidden_by_closed_details?(element)
  return false unless element.respond_to?(:closest)
  return false if element.tag_name == "DETAILS"

  details = element.closest("details")
  return false if details.nil? || details.has_attribute?("open")

  summary = element.closest("summary")
  !(summary && summary.closest("details")&.equal?(details))
end

.hidden_node?(element) ⇒ Boolean

Returns:

  • (Boolean)


38
39
40
41
42
43
44
45
# File 'lib/dommy/rack/visibility.rb', line 38

def hidden_node?(element)
  return true if element.has_attribute?("hidden")
  return true if element.tag_name == "TEMPLATE"
  return true if element.tag_name == "INPUT" && element.respond_to?(:type) && element.type == "hidden"

  style = element.get_attribute("style").to_s.downcase
  style.match?(/display\s*:\s*none/) || style.match?(/visibility\s*:\s*hidden/)
end

.visible?(element) ⇒ Boolean

Simplified visibility check for capybara-style interaction. An element is hidden if it (or an ancestor) is hidden via the ‘hidden` attribute, an inline `display: none` / `visibility: hidden` style, or is an `<input type=“hidden”>`. No CSS cascade / computed style / layout.

Returns:

  • (Boolean)


11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/dommy/rack/visibility.rb', line 11

def visible?(element)
  return false if element.nil?

  node = element
  while node.respond_to?(:get_attribute)
    return false if hidden_node?(node)

    node = node.respond_to?(:parent_element) ? node.parent_element : nil
    break if node.nil?
  end
  return false if hidden_by_closed_details?(element)

  true
end