@@ -106,10 +106,18 @@ def xpaths xpath_str
106
106
# Prints xml of the current page
107
107
# @return [void]
108
108
def source
109
- doc = Nokogiri ::XML ( @driver . page_source ) do |config |
110
- config . options = Nokogiri ::XML ::ParseOptions ::NOBLANKS | Nokogiri ::XML ::ParseOptions ::NONET
109
+ source = @driver . page_source
110
+ if source . start_with? '<html'
111
+ doc = Nokogiri ::HTML ( source ) do |config |
112
+ config . options = Nokogiri ::XML ::ParseOptions ::NOBLANKS | Nokogiri ::XML ::ParseOptions ::NONET
113
+ end
114
+ puts doc . to_xhtml indent : 2
115
+ else
116
+ doc = Nokogiri ::XML ( source ) do |config |
117
+ config . options = Nokogiri ::XML ::ParseOptions ::NOBLANKS | Nokogiri ::XML ::ParseOptions ::NONET
118
+ end
119
+ puts doc . to_xml indent : 2
111
120
end
112
- puts doc . to_xml indent : 2
113
121
end
114
122
115
123
# Returns XML string for the current page
@@ -208,5 +216,66 @@ def resolve_id id
208
216
lazy_load_strings
209
217
@strings_xml [ id ]
210
218
end
219
+
220
+ class HTMLElements < Nokogiri ::XML ::SAX ::Document
221
+ def filter
222
+ @filter
223
+ end
224
+
225
+ # convert to string to support symbols
226
+ def filter = value
227
+ # nil and false disable the filter
228
+ return @filter = false unless value
229
+ @filter = value . to_s . downcase
230
+ end
231
+
232
+ def initialize
233
+ reset
234
+ @filter = false
235
+ end
236
+
237
+ def reset
238
+ @element_stack = [ ]
239
+ @elements_in_order = [ ]
240
+ @skip_element = false
241
+ end
242
+
243
+ def result
244
+ @elements_in_order . reduce ( '' ) do |r , e |
245
+ name = e . delete :name
246
+ attr_string = e . reduce ( '' ) do |string , attr |
247
+ string += " #{ attr [ 0 ] } : #{ attr [ 1 ] } \n "
248
+ end
249
+
250
+ unless attr_string . nil? || attr_string . empty?
251
+ r += "\n #{ name } \n #{ attr_string } "
252
+ end
253
+ r
254
+ end
255
+ end
256
+
257
+ def start_element name , attrs = [ ]
258
+ @skip_element = filter && !filter . include? ( name . downcase )
259
+ unless @skip_element
260
+ element = { name : name }
261
+ attrs . each { |a | element [ a [ 0 ] ] = a [ 1 ] }
262
+ @element_stack . push element
263
+ @elements_in_order . push element
264
+ end
265
+ end
266
+
267
+ def end_element name
268
+ return if filter && !filter . include? ( name . downcase )
269
+ element_index = @element_stack . rindex { |e | e [ :name ] == name }
270
+ @element_stack . delete_at element_index
271
+ end
272
+
273
+ def characters ( chars )
274
+ unless @skip_element
275
+ element = @element_stack . last
276
+ element [ :text ] = chars
277
+ end
278
+ end
279
+ end
211
280
end # module Common
212
281
end # module Appium
0 commit comments