class Watir::Locators::Element::SelectorBuilder::CSS

Public Instance Methods

build(selectors) click to toggle source
# File lib/watir-webdriver/locators/element/selector_builder/css.rb, line 6
def build(selectors)
  return unless use_css?(selectors)

  if selectors.empty?
    css = '*'
  else
    css = ''
    css << (selectors.delete(:tag_name) || '')

    klass = selectors.delete(:class)
    if klass
      if klass.include? ' '
        css << %([class="#{css_escape klass}"])
      else
        css << ".#{klass}"
      end
    end

    href = selectors.delete(:href)
    if href
      css << %([href~="#{css_escape href}"])
    end

    selectors.each do |key, value|
      key = key.to_s.tr("_", "-")
      css << %([#{key}="#{css_escape value}"]) # TODO: proper escaping
    end
  end

  [:css, css]
end

Private Instance Methods

css_escape(str) click to toggle source
# File lib/watir-webdriver/locators/element/selector_builder/css.rb, line 58
def css_escape(str)
  str.gsub('"', '\\"')
end
use_css?(selectors) click to toggle source
# File lib/watir-webdriver/locators/element/selector_builder/css.rb, line 40
def use_css?(selectors)
  return false unless Watir.prefer_css?

  if selectors.key?(:text) || selectors.key?(:label) || selectors.key?(:index)
    return false
  end

  if selectors[:tag_name] == 'input' && selectors.key?(:type)
    return false
  end

  if selectors.key?(:class) && selectors[:class] !~ /^[\w-]+$/ui
    return false
  end

  true
end