class Bauxite::Parser
Parser class.
Parser represent different strategies for reading input files into lists of Bauxite actions.
Each custom parser is defined in a separate file in the 'parsers/'
directory. These files should avoid adding public methods other than the
parser method itself. Also, no attr_accessors
should be added.
Parser methods can use the ctx
attribute to refer to the current test Context. Parser methods receive a single action hash argument
including :file
and return an array of arrays or nil if the
parser can't handle the file.
Each element in the output array must contain the following fields:
[ action, # action name args, # args array text, # raw action text (before parsing), or nil line # line in the file that defined the action ]
For example:
# === parsers/my_parser.rb ======= # class Parser # :category: Parser Methods def my_parser(action) # open and read file [ [ 'echo', [ 'hello world' ], 'echo "hello world"', 0 ], [ 'write',[ 'id=username', 'jdoe' ], nil , 1 ], [ 'write',[ 'id=password', 'hello world!' ], nil , 2 ] ] end end # === end parsers/my_parser.rb === #
Parser Methods
↑ topPublic Instance Methods
csv(file)
click to toggle source
Load CSV files.
# File lib/bauxite/parsers/csv.rb, line 27 def csv(file) return nil unless file.downcase.end_with? '.csv' File.open(file) do |f| f.read.each_line.each_with_index.map do |text,line| text = text.sub(/\r?\n$/, '') next nil if text =~ /^\s*(#|$)/ begin data = CSV.parse_line(text) [ data[0], data[1..-1].map { |a| a.strip }, nil, line ] rescue StandardError => e raise "#{file} (line #{line+1}): #{e.message}" end end end.select { |item| item != nil } end
default(file, io = nil)
click to toggle source
Load default Bauxite files.
# File lib/bauxite/parsers/default.rb, line 27 def default(file, io = nil) return nil unless file == 'stdin' or file.match(/\.[tb]xt(\..*)?$/) return default(file, $stdin) if file == 'stdin' and not io return File.open(file) { |io| default(file, io) } unless io io.each_line.each_with_index.map do |text,line| text = text.sub(/\r?\n$/, '') next nil if text =~ /^\s*(#|$)/ data = Bauxite::Context::parse_action_default(text, file, line) [ data[:action], data[:args], text, line ] end .select { |item| item != nil } end
selenium_ide_html(file)
click to toggle source
Load Selenium IDE HTML files.
# File lib/bauxite/parsers/html.rb, line 27 def selenium_ide_html(file) return nil unless file.downcase.end_with? '.html' File.open(file) do |f| content = f.read data = content.gsub(/[\n\r]/, '') selenium_base = data.sub(/.*rel="selenium.base" href="([^"]*)".*/, '\1') base_ends_in_slash = (selenium_base[-1] == '/') data .gsub('<tr>', "\naction=") .gsub('</tr>', "\n") .each_line.grep(/^action=/) .map { |line| line.match(/^action=\s*<td>([^<]*)<\/td>\s*<td>([^<]*)<\/td>\s*<td>([^<]*)<\/td>.*$/) } .select { |match| match } .map { |match| match.captures } .map do |action| case action[0] when 'open' url = action[1] url = url[1..-1] if url[0] == '/' and base_ends_in_slash # remove leading '/' action[1] = selenium_base + url when 'type' action[0] = 'write' action[1] = _selenium_ide_html_parse_selector(action[1]) when 'verifyTextPresent' action[0] = 'source' when 'clickAndWait', 'click' action[0] = 'click' action[1] = _selenium_ide_html_parse_selector(action[1]) when 'waitForPageToLoad' action[0] = 'wait' action[1] = (action[1].to_i / 1000).to_s when 'assertValue' action[0] = 'assert' action[1] = _selenium_ide_html_parse_selector(action[1]) end action = action.select { |a| a != '' } [ action[0], action[1..-1], nil, 0 ] end end end