@@ -22,6 +22,8 @@ module WebDriver
22
22
module Remote
23
23
class Bridge
24
24
autoload :COMMANDS , 'selenium/webdriver/remote/bridge/commands'
25
+ autoload :LocatorConverter , 'selenium/webdriver/remote/bridge/locator_converter'
26
+
25
27
include Atoms
26
28
27
29
PORT = 4444
@@ -31,12 +33,17 @@ class Bridge
31
33
32
34
class << self
33
35
attr_reader :extra_commands
36
+ attr_writer :locator_converter
34
37
35
38
def add_command ( name , verb , url , &block )
36
39
@extra_commands ||= { }
37
40
@extra_commands [ name ] = [ verb , url ]
38
41
define_method ( name , &block )
39
42
end
43
+
44
+ def locator_converter
45
+ @locator_converter ||= LocatorConverter . new
46
+ end
40
47
end
41
48
42
49
#
@@ -53,6 +60,8 @@ def initialize(url:, http_client: nil)
53
60
@http = http_client || Http ::Default . new
54
61
@http . server_url = uri
55
62
@file_detector = nil
63
+
64
+ @locator_converter = self . class . locator_converter
56
65
end
57
66
58
67
#
@@ -516,7 +525,7 @@ def active_element
516
525
alias switch_to_active_element active_element
517
526
518
527
def find_element_by ( how , what , parent_ref = [ ] )
519
- how , what = convert_locator ( how , what )
528
+ how , what = @locator_converter . convert ( how , what )
520
529
521
530
return execute_atom ( :findElements , Support ::RelativeLocator . new ( what ) . as_json ) . first if how == 'relative'
522
531
@@ -534,7 +543,7 @@ def find_element_by(how, what, parent_ref = [])
534
543
end
535
544
536
545
def find_elements_by ( how , what , parent_ref = [ ] )
537
- how , what = convert_locator ( how , what )
546
+ how , what = @locator_converter . convert ( how , what )
538
547
539
548
return execute_atom :findElements , Support ::RelativeLocator . new ( what ) . as_json if how == 'relative'
540
549
@@ -655,42 +664,6 @@ def prepare_capabilities_payload(capabilities)
655
664
{ capabilities : capabilities }
656
665
end
657
666
658
- def convert_locator ( how , what )
659
- how = SearchContext ::FINDERS [ how . to_sym ] || how
660
-
661
- case how
662
- when 'class name'
663
- how = 'css selector'
664
- what = ".#{ escape_css ( what . to_s ) } "
665
- when 'id'
666
- how = 'css selector'
667
- what = "##{ escape_css ( what . to_s ) } "
668
- when 'name'
669
- how = 'css selector'
670
- what = "*[name='#{ escape_css ( what . to_s ) } ']"
671
- end
672
-
673
- if what . is_a? ( Hash )
674
- what = what . each_with_object ( { } ) do |( h , w ) , hash |
675
- h , w = convert_locator ( h . to_s , w )
676
- hash [ h ] = w
677
- end
678
- end
679
-
680
- [ how , what ]
681
- end
682
-
683
- ESCAPE_CSS_REGEXP = /(['"\\ #.:;,!?+<>=~*^$|%&@`{}\- \[ \] ()])/
684
- UNICODE_CODE_POINT = 30
685
-
686
- # Escapes invalid characters in CSS selector.
687
- # @see https://mathiasbynens.be/notes/css-escapes
688
- def escape_css ( string )
689
- string = string . gsub ( ESCAPE_CSS_REGEXP ) { |match | "\\ #{ match } " }
690
- string = "\\ #{ UNICODE_CODE_POINT + Integer ( string [ 0 ] ) } #{ string [ 1 ..] } " if string [ 0 ] &.match? ( /[[:digit:]]/ )
691
-
692
- string
693
- end
694
667
end # Bridge
695
668
end # Remote
696
669
end # WebDriver
0 commit comments