Module: Capybara::ShadowDOM
- Defined in:
- lib/capybara/shadowdom.rb,
lib/capybara/shadow_dom/version.rb
Constant Summary collapse
- ROOT_KEY =
"shadow-6066-11e4-a52e-4f735466cecf"
- VERSION =
"0.3.0"
Instance Method Summary collapse
-
#shadow_root ⇒ Object
Adds a way to retrieve the shadow root object of an element.
Instance Method Details
#shadow_root ⇒ Object
Adds a way to retrieve the shadow root object of an element. For example, given the HTML below:
<awesome-element>
<!-- #shadow-root start -->
<span>Hello shadow world!</span>
<input type="text" id="user_name">
<!-- #shadow-root end -->
</awesome-element>
Then You will be able to do:
within custom_element.shadow_root do
# Displays "Hello shadow world!":
puts page.text
# Asserts the text within the element:
assert_text "Hello shadow world!"
# Input elements within the shadow DOM will also be accessible:
fill_in "#user_name", with: "[email protected]"
end
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/capybara/shadowdom.rb', line 33 def shadow_root root_node = synchronize { evaluate_script("this.shadowRoot") } return if root_node.nil? node = if defined?(::Selenium::WebDriver::ShadowRoot) && root_node.is_a?(::Selenium::WebDriver::ShadowRoot) # Selenium >= 4.1.x driver.send(:build_node, root_node) elsif root_node.is_a?(Hash) bridge = session.driver.browser.send(:bridge) shadow_key = if defined?(::Selenium::WebDriver::ShadowRoot) # Selenium ~> 4.0.x ::Selenium::WebDriver::ShadowRoot::ROOT_KEY else # Selenium ~> 3.x ROOT_KEY end element = ::Selenium::WebDriver::Element.new(bridge, root_node[shadow_key]) session.driver.send(:build_node, element) elsif root_node.is_a?(::Capybara::Node::Element) root_node.base end ::Capybara::Node::ShadowRoot.new(session, node, node, nil) end |