Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
SeleniumHQ
GitHub Repository: SeleniumHQ/Selenium
Path: blob/trunk/rb/lib/selenium/webdriver/remote/bridge/locator_converter.rb
1990 views
1
# frozen_string_literal: true
2
3
# Licensed to the Software Freedom Conservancy (SFC) under one
4
# or more contributor license agreements. See the NOTICE file
5
# distributed with this work for additional information
6
# regarding copyright ownership. The SFC licenses this file
7
# to you under the Apache License, Version 2.0 (the
8
# "License"); you may not use this file except in compliance
9
# with the License. You may obtain a copy of the License at
10
#
11
# http://www.apache.org/licenses/LICENSE-2.0
12
#
13
# Unless required by applicable law or agreed to in writing,
14
# software distributed under the License is distributed on an
15
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
# KIND, either express or implied. See the License for the
17
# specific language governing permissions and limitations
18
# under the License.
19
20
module Selenium
21
module WebDriver
22
module Remote
23
class Bridge
24
class LocatorConverter
25
ESCAPE_CSS_REGEXP = /(['"\\#.:;,!?+<>=~*^$|%&@`{}\-\[\]()])/
26
UNICODE_CODE_POINT = 30
27
28
#
29
# Converts a locator to a specification compatible one.
30
# @param [String, Symbol] how
31
# @param [String] what
32
#
33
34
def convert(how, what)
35
how = SearchContext.finders[how.to_sym] || how
36
37
case how
38
when 'class name'
39
how = 'css selector'
40
what = ".#{escape_css(what.to_s)}"
41
when 'id'
42
how = 'css selector'
43
what = "##{escape_css(what.to_s)}"
44
when 'name'
45
how = 'css selector'
46
what = "*[name='#{escape_css(what.to_s)}']"
47
end
48
49
if what.is_a?(Hash)
50
what = what.each_with_object({}) do |(h, w), hash|
51
h, w = convert(h.to_s, w)
52
hash[h] = w
53
end
54
end
55
56
[how, what]
57
end
58
59
private
60
61
#
62
# Escapes invalid characters in CSS selector.
63
# @see https://mathiasbynens.be/notes/css-escapes
64
#
65
66
def escape_css(string)
67
string = string.gsub(ESCAPE_CSS_REGEXP) { |match| "\\#{match}" }
68
string = "\\#{UNICODE_CODE_POINT + Integer(string[0])} #{string[1..]}" if string[0]&.match?(/[[:digit:]]/)
69
70
string
71
end
72
end # LocatorConverter
73
end # Bridge
74
end # Remote
75
end # WebDriver
76
end # Selenium
77
78