selenium-webdriver 2.45.0 → 3.142.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +795 -3
  3. data/Gemfile +2 -0
  4. data/{COPYING → LICENSE} +1 -3
  5. data/README.md +13 -9
  6. data/lib/selenium/server.rb +93 -71
  7. data/lib/selenium/webdriver/atoms/getAttribute.js +7 -0
  8. data/lib/selenium/webdriver/atoms/isDisplayed.js +102 -0
  9. data/lib/selenium/webdriver/atoms.rb +37 -0
  10. data/lib/selenium/webdriver/chrome/bridge.rb +47 -99
  11. data/lib/selenium/webdriver/chrome/driver.rb +127 -0
  12. data/lib/selenium/webdriver/chrome/options.rb +190 -0
  13. data/lib/selenium/webdriver/chrome/profile.rb +40 -20
  14. data/lib/selenium/webdriver/chrome/service.rb +46 -62
  15. data/lib/selenium/webdriver/chrome.rb +34 -6
  16. data/lib/selenium/webdriver/common/action_builder.rb +69 -56
  17. data/lib/selenium/webdriver/common/alert.rb +25 -8
  18. data/lib/selenium/webdriver/common/bridge_helper.rb +35 -20
  19. data/lib/selenium/webdriver/common/driver.rb +90 -63
  20. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +45 -0
  21. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +50 -0
  22. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +42 -0
  23. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +26 -11
  24. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +51 -0
  25. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +58 -0
  26. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +51 -0
  27. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +23 -6
  28. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +19 -2
  29. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +24 -7
  30. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +19 -3
  31. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +23 -7
  32. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +26 -5
  33. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +20 -6
  34. data/lib/selenium/webdriver/common/element.rb +79 -37
  35. data/lib/selenium/webdriver/common/error.rb +282 -106
  36. data/lib/selenium/webdriver/common/file_reaper.rb +23 -12
  37. data/lib/selenium/webdriver/common/html5/local_storage.rb +29 -12
  38. data/lib/selenium/webdriver/common/html5/session_storage.rb +29 -12
  39. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +29 -18
  40. data/lib/selenium/webdriver/common/interactions/input_device.rb +54 -0
  41. data/lib/selenium/webdriver/common/interactions/interaction.rb +53 -0
  42. data/lib/selenium/webdriver/common/interactions/interactions.rb +43 -0
  43. data/lib/selenium/webdriver/common/interactions/key_actions.rb +145 -0
  44. data/lib/selenium/webdriver/common/interactions/key_input.rb +66 -0
  45. data/lib/selenium/webdriver/common/interactions/none_input.rb +36 -0
  46. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +363 -0
  47. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +139 -0
  48. data/lib/selenium/webdriver/common/keyboard.rb +27 -12
  49. data/lib/selenium/webdriver/common/keys.rb +118 -81
  50. data/lib/selenium/webdriver/common/log_entry.rb +27 -8
  51. data/lib/selenium/webdriver/common/logger.rb +115 -0
  52. data/lib/selenium/webdriver/common/logs.rb +24 -7
  53. data/lib/selenium/webdriver/common/manager.rb +177 -0
  54. data/lib/selenium/webdriver/common/mouse.rb +29 -12
  55. data/lib/selenium/webdriver/common/navigation.rb +21 -4
  56. data/lib/selenium/webdriver/common/options.rb +43 -126
  57. data/lib/selenium/webdriver/common/platform.rb +101 -97
  58. data/lib/selenium/webdriver/common/port_prober.rb +24 -17
  59. data/lib/selenium/webdriver/common/profile_helper.rb +27 -11
  60. data/lib/selenium/webdriver/common/proxy.rb +86 -73
  61. data/lib/selenium/webdriver/common/search_context.rb +49 -33
  62. data/lib/selenium/webdriver/common/service.rb +219 -0
  63. data/lib/selenium/webdriver/common/socket_lock.rb +82 -0
  64. data/lib/selenium/webdriver/common/socket_poller.rb +47 -26
  65. data/lib/selenium/webdriver/common/target_locator.rb +35 -14
  66. data/lib/selenium/webdriver/common/timeouts.rb +23 -6
  67. data/lib/selenium/webdriver/common/touch_action_builder.rb +25 -11
  68. data/lib/selenium/webdriver/common/touch_screen.rb +42 -24
  69. data/lib/selenium/webdriver/common/w3c_action_builder.rb +212 -0
  70. data/lib/selenium/webdriver/common/w3c_manager.rb +45 -0
  71. data/lib/selenium/webdriver/common/wait.rb +34 -14
  72. data/lib/selenium/webdriver/common/window.rb +75 -16
  73. data/lib/selenium/webdriver/common/zipper.rb +26 -11
  74. data/lib/selenium/webdriver/common.rb +40 -7
  75. data/lib/selenium/webdriver/edge/bridge.rb +76 -0
  76. data/lib/selenium/webdriver/edge/driver.rb +66 -0
  77. data/lib/selenium/webdriver/edge/options.rb +80 -0
  78. data/lib/selenium/webdriver/edge/service.rb +52 -0
  79. data/lib/selenium/webdriver/edge.rb +44 -0
  80. data/lib/selenium/webdriver/firefox/binary.rb +70 -48
  81. data/lib/selenium/webdriver/firefox/driver.rb +50 -0
  82. data/lib/selenium/webdriver/firefox/extension/prefs.json +14 -13
  83. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  84. data/lib/selenium/webdriver/firefox/extension.rb +50 -19
  85. data/lib/selenium/webdriver/firefox/launcher.rb +33 -28
  86. data/lib/selenium/webdriver/firefox/legacy/driver.rb +83 -0
  87. data/lib/selenium/webdriver/firefox/marionette/bridge.rb +49 -0
  88. data/lib/selenium/webdriver/firefox/marionette/driver.rb +90 -0
  89. data/lib/selenium/webdriver/firefox/options.rb +162 -0
  90. data/lib/selenium/webdriver/firefox/profile.rb +66 -48
  91. data/lib/selenium/webdriver/firefox/profiles_ini.rb +28 -16
  92. data/lib/selenium/webdriver/firefox/service.rb +52 -0
  93. data/lib/selenium/webdriver/firefox/util.rb +19 -2
  94. data/lib/selenium/webdriver/firefox.rb +46 -10
  95. data/lib/selenium/webdriver/ie/driver.rb +85 -0
  96. data/lib/selenium/webdriver/ie/options.rb +138 -0
  97. data/lib/selenium/webdriver/ie/service.rb +54 -0
  98. data/lib/selenium/webdriver/ie.rb +32 -10
  99. data/lib/selenium/webdriver/remote/bridge.rb +117 -572
  100. data/lib/selenium/webdriver/remote/capabilities.rb +116 -99
  101. data/lib/selenium/webdriver/remote/driver.rb +51 -0
  102. data/lib/selenium/webdriver/remote/http/common.rb +54 -23
  103. data/lib/selenium/webdriver/remote/http/curb.rb +30 -12
  104. data/lib/selenium/webdriver/remote/http/default.rb +85 -42
  105. data/lib/selenium/webdriver/remote/http/persistent.rb +29 -7
  106. data/lib/selenium/webdriver/remote/oss/bridge.rb +594 -0
  107. data/lib/selenium/webdriver/remote/oss/commands.rb +223 -0
  108. data/lib/selenium/webdriver/remote/response.rb +68 -30
  109. data/lib/selenium/webdriver/remote/server_error.rb +22 -5
  110. data/lib/selenium/webdriver/remote/w3c/bridge.rb +605 -0
  111. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +310 -0
  112. data/lib/selenium/webdriver/remote/w3c/commands.rb +157 -0
  113. data/lib/selenium/webdriver/remote.rb +27 -13
  114. data/lib/selenium/webdriver/safari/bridge.rb +38 -107
  115. data/lib/selenium/webdriver/safari/driver.rb +68 -0
  116. data/lib/selenium/webdriver/safari/options.rb +56 -75
  117. data/lib/selenium/webdriver/safari/service.rb +38 -0
  118. data/lib/selenium/webdriver/safari.rb +49 -31
  119. data/lib/selenium/webdriver/support/abstract_event_listener.rb +40 -6
  120. data/lib/selenium/webdriver/support/block_event_listener.rb +24 -7
  121. data/lib/selenium/webdriver/support/color.rb +82 -46
  122. data/lib/selenium/webdriver/support/escaper.rb +43 -0
  123. data/lib/selenium/webdriver/support/event_firing_bridge.rb +56 -39
  124. data/lib/selenium/webdriver/support/select.rb +66 -89
  125. data/lib/selenium/webdriver/support.rb +20 -0
  126. data/lib/selenium/webdriver/version.rb +24 -0
  127. data/lib/selenium/webdriver.rb +55 -25
  128. data/lib/selenium-webdriver.rb +19 -0
  129. data/selenium-webdriver.gemspec +42 -29
  130. metadata +331 -260
  131. data/Gemfile.lock +0 -48
  132. data/lib/selenium/client/base.rb +0 -132
  133. data/lib/selenium/client/driver.rb +0 -10
  134. data/lib/selenium/client/errors.rb +0 -9
  135. data/lib/selenium/client/extensions.rb +0 -118
  136. data/lib/selenium/client/idiomatic.rb +0 -488
  137. data/lib/selenium/client/javascript_expression_builder.rb +0 -116
  138. data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -13
  139. data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -13
  140. data/lib/selenium/client/legacy_driver.rb +0 -1720
  141. data/lib/selenium/client/protocol.rb +0 -104
  142. data/lib/selenium/client/selenium_helper.rb +0 -34
  143. data/lib/selenium/client.rb +0 -38
  144. data/lib/selenium/rake/server_task.rb +0 -157
  145. data/lib/selenium/webdriver/android/bridge.rb +0 -49
  146. data/lib/selenium/webdriver/android.rb +0 -9
  147. data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -9
  148. data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -42
  149. data/lib/selenium/webdriver/common/core_ext/string.rb +0 -5
  150. data/lib/selenium/webdriver/common/driver_extensions/has_browser_connection.rb +0 -17
  151. data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +0 -39
  152. data/lib/selenium/webdriver/common/html5/location.rb +0 -0
  153. data/lib/selenium/webdriver/common/json_helper.rb +0 -34
  154. data/lib/selenium/webdriver/firefox/bridge.rb +0 -70
  155. data/lib/selenium/webdriver/firefox/socket_lock.rb +0 -61
  156. data/lib/selenium/webdriver/ie/bridge.rb +0 -69
  157. data/lib/selenium/webdriver/ie/server.rb +0 -90
  158. data/lib/selenium/webdriver/iphone/bridge.rb +0 -45
  159. data/lib/selenium/webdriver/iphone.rb +0 -9
  160. data/lib/selenium/webdriver/opera/bridge.rb +0 -112
  161. data/lib/selenium/webdriver/opera/service.rb +0 -49
  162. data/lib/selenium/webdriver/opera.rb +0 -24
  163. data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -59
  164. data/lib/selenium/webdriver/phantomjs/service.rb +0 -90
  165. data/lib/selenium/webdriver/phantomjs.rb +0 -22
  166. data/lib/selenium/webdriver/remote/commands.rb +0 -192
  167. data/lib/selenium/webdriver/safari/browser.rb +0 -20
  168. data/lib/selenium/webdriver/safari/extensions.rb +0 -170
  169. data/lib/selenium/webdriver/safari/resources/SafariDriver.safariextz +0 -0
  170. data/lib/selenium/webdriver/safari/resources/client.js +0 -6903
  171. data/lib/selenium/webdriver/safari/server.rb +0 -145
  172. data/lib/selenium-client.rb +0 -2
@@ -1,87 +1,119 @@
1
- # encoding: utf-8
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.
2
19
 
3
20
  module Selenium
4
21
  module WebDriver
5
22
  module Keys
6
-
7
23
  #
8
24
  # @see Element#send_keys
9
- # @see http://www.google.com.au/search?&q=unicode+pua&btnG=Search
25
+ # @see http://www.google.com.au/search?&q=unicode+pua&btnK=Search
10
26
  #
11
27
 
12
28
  KEYS = {
13
- # \x works on both 1.8.6/1.9
14
- :null => "\xEE\x80\x80",
15
- :cancel => "\xEE\x80\x81",
16
- :help => "\xEE\x80\x82",
17
- :backspace => "\xEE\x80\x83",
18
- :tab => "\xEE\x80\x84",
19
- :clear => "\xEE\x80\x85",
20
- :return => "\xEE\x80\x86",
21
- :enter => "\xEE\x80\x87",
22
- :shift => "\xEE\x80\x88",
23
- :left_shift => "\xEE\x80\x88",
24
- :control => "\xEE\x80\x89",
25
- :left_control => "\xEE\x80\x89",
26
- :alt => "\xEE\x80\x8A",
27
- :left_alt => "\xEE\x80\x8A",
28
- :pause => "\xEE\x80\x8B",
29
- :escape => "\xEE\x80\x8C",
30
- :space => "\xEE\x80\x8D",
31
- :page_up => "\xEE\x80\x8E",
32
- :page_down => "\xEE\x80\x8F",
33
- :end => "\xEE\x80\x90",
34
- :home => "\xEE\x80\x91",
35
- :left => "\xEE\x80\x92",
36
- :arrow_left => "\xEE\x80\x92",
37
- :up => "\xEE\x80\x93",
38
- :arrow_up => "\xEE\x80\x93",
39
- :right => "\xEE\x80\x94",
40
- :arrow_right => "\xEE\x80\x94",
41
- :down => "\xEE\x80\x95",
42
- :arrow_down => "\xEE\x80\x95",
43
- :insert => "\xEE\x80\x96",
44
- :delete => "\xEE\x80\x97",
45
- :semicolon => "\xEE\x80\x98",
46
- :equals => "\xEE\x80\x99",
47
- :numpad0 => "\xEE\x80\x9A",
48
- :numpad1 => "\xEE\x80\x9B",
49
- :numpad2 => "\xEE\x80\x9C",
50
- :numpad3 => "\xEE\x80\x9D",
51
- :numpad4 => "\xEE\x80\x9E",
52
- :numpad5 => "\xEE\x80\x9F",
53
- :numpad6 => "\xEE\x80\xA0",
54
- :numpad7 => "\xEE\x80\xA1",
55
- :numpad8 => "\xEE\x80\xA2",
56
- :numpad9 => "\xEE\x80\xA3",
57
- :multiply => "\xEE\x80\xA4",
58
- :add => "\xEE\x80\xA5",
59
- :separator => "\xEE\x80\xA6",
60
- :subtract => "\xEE\x80\xA7",
61
- :decimal => "\xEE\x80\xA8",
62
- :divide => "\xEE\x80\xA9",
63
- :f1 => "\xEE\x80\xB1",
64
- :f2 => "\xEE\x80\xB2",
65
- :f3 => "\xEE\x80\xB3",
66
- :f4 => "\xEE\x80\xB4",
67
- :f5 => "\xEE\x80\xB5",
68
- :f6 => "\xEE\x80\xB6",
69
- :f7 => "\xEE\x80\xB7",
70
- :f8 => "\xEE\x80\xB8",
71
- :f9 => "\xEE\x80\xB9",
72
- :f10 => "\xEE\x80\xBA",
73
- :f11 => "\xEE\x80\xBB",
74
- :f12 => "\xEE\x80\xBC",
75
- :meta => "\xEE\x80\xBD",
76
- :command => "\xEE\x80\xBD" # alias
77
- }
29
+ null: "\ue000",
30
+ cancel: "\ue001",
31
+ help: "\ue002",
32
+ backspace: "\ue003",
33
+ tab: "\ue004",
34
+ clear: "\ue005",
35
+ return: "\ue006",
36
+ enter: "\ue007",
37
+ shift: "\ue008",
38
+ left_shift: "\ue008",
39
+ control: "\ue009",
40
+ left_control: "\ue009",
41
+ alt: "\ue00A",
42
+ left_alt: "\ue00A",
43
+ pause: "\ue00B",
44
+ escape: "\ue00C",
45
+ space: "\ue00D",
46
+ page_up: "\ue00E",
47
+ page_down: "\ue00F",
48
+ end: "\ue010",
49
+ home: "\ue011",
50
+ left: "\ue012",
51
+ arrow_left: "\ue012",
52
+ up: "\ue013",
53
+ arrow_up: "\ue013",
54
+ right: "\ue014",
55
+ arrow_right: "\ue014",
56
+ down: "\ue015",
57
+ arrow_down: "\ue015",
58
+ insert: "\ue016",
59
+ delete: "\ue017",
60
+ semicolon: "\ue018",
61
+ equals: "\ue019",
62
+ numpad0: "\ue01A",
63
+ numpad1: "\ue01B",
64
+ numpad2: "\ue01C",
65
+ numpad3: "\ue01D",
66
+ numpad4: "\ue01E",
67
+ numpad5: "\ue01F",
68
+ numpad6: "\ue020",
69
+ numpad7: "\ue021",
70
+ numpad8: "\ue022",
71
+ numpad9: "\ue023",
72
+ multiply: "\ue024",
73
+ add: "\ue025",
74
+ separator: "\ue026",
75
+ subtract: "\ue027",
76
+ decimal: "\ue028",
77
+ divide: "\ue029",
78
+ f1: "\ue031",
79
+ f2: "\ue032",
80
+ f3: "\ue033",
81
+ f4: "\ue034",
82
+ f5: "\ue035",
83
+ f6: "\ue036",
84
+ f7: "\ue037",
85
+ f8: "\ue038",
86
+ f9: "\ue039",
87
+ f10: "\ue03A",
88
+ f11: "\ue03B",
89
+ f12: "\ue03C",
90
+ meta: "\ue03D",
91
+ command: "\ue03D", # alias
92
+ left_meta: "\ue03D", # alias
93
+ right_shift: "\ue050",
94
+ right_control: "\ue051",
95
+ right_alt: "\ue052",
96
+ right_meta: "\ue053",
97
+ numpad_page_up: "\ue054",
98
+ numpad_page_down: "\ue055",
99
+ numpad_end: "\ue056",
100
+ numpad_home: "\ue057",
101
+ numpad_left: "\ue058",
102
+ numpad_up: "\ue059",
103
+ numpad_right: "\ue05A",
104
+ numpad_down: "\ue05B",
105
+ numpad_insert: "\ue05C",
106
+ numpad_delete: "\ue05D"
107
+ }.freeze
78
108
 
79
109
  #
80
110
  # @api private
81
111
  #
82
112
 
83
113
  def self.[](key)
84
- KEYS[key] or raise Error::UnsupportedOperationError, "no such key #{key.inspect}"
114
+ return KEYS[key] if KEYS[key]
115
+
116
+ raise Error::UnsupportedOperationError, "no such key #{key.inspect}"
85
117
  end
86
118
 
87
119
  #
@@ -89,21 +121,26 @@ module Selenium
89
121
  #
90
122
 
91
123
  def self.encode(keys)
92
- keys.map do |arg|
93
- case arg
94
- when Symbol
95
- Keys[arg]
96
- when Array
97
- arg = arg.map { |e| e.kind_of?(Symbol) ? Keys[e] : e }.join
98
- arg << Keys[:null]
124
+ keys.map { |key| encode_key(key) }
125
+ end
126
+
127
+ #
128
+ # @api private
129
+ #
99
130
 
100
- arg
101
- else
102
- arg.to_s
103
- end
131
+ def self.encode_key(key)
132
+ case key
133
+ when Symbol
134
+ Keys[key]
135
+ when Array
136
+ key = key.map { |e| e.is_a?(Symbol) ? Keys[e] : e }.join
137
+ key << Keys[:null]
138
+
139
+ key
140
+ else
141
+ key.to_s
104
142
  end
105
143
  end
106
-
107
144
  end # Keys
108
145
  end # WebDriver
109
146
  end # Selenium
@@ -1,19 +1,38 @@
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
+
1
20
  module Selenium
2
21
  module WebDriver
3
22
  class LogEntry
4
23
  attr_reader :level, :timestamp, :message
5
24
 
6
25
  def initialize(level, timestamp, message)
7
- @level = level
26
+ @level = level
8
27
  @timestamp = timestamp
9
- @message = message
28
+ @message = message
10
29
  end
11
30
 
12
- def as_json(opts = nil)
31
+ def as_json(*)
13
32
  {
14
- 'level' => level,
33
+ 'level' => level,
15
34
  'timestamp' => timestamp,
16
- 'message' => message
35
+ 'message' => message
17
36
  }
18
37
  end
19
38
 
@@ -24,6 +43,6 @@ module Selenium
24
43
  def time
25
44
  Time.at timestamp / 1000
26
45
  end
27
- end
28
- end
29
- end
46
+ end # LogEntry
47
+ end # WebDriver
48
+ end # Selenium
@@ -0,0 +1,115 @@
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
+ require 'forwardable'
21
+ require 'logger'
22
+
23
+ module Selenium
24
+ module WebDriver
25
+ #
26
+ # @example Enable full logging
27
+ # Selenium::WebDriver.logger.level = :debug
28
+ #
29
+ # @example Log to file
30
+ # Selenium::WebDriver.logger.output = 'selenium.log'
31
+ #
32
+ # @example Use logger manually
33
+ # Selenium::WebDriver.logger.info('This is info message')
34
+ # Selenium::WebDriver.logger.warn('This is warning message')
35
+ #
36
+ class Logger
37
+ extend Forwardable
38
+
39
+ def_delegators :@logger,
40
+ :close,
41
+ :debug, :debug?,
42
+ :info, :info?,
43
+ :warn, :warn?,
44
+ :error, :error?,
45
+ :fatal, :fatal?,
46
+ :level, :level=
47
+
48
+ def initialize
49
+ @logger = create_logger($stdout)
50
+ end
51
+
52
+ #
53
+ # Changes logger output to a new IO.
54
+ #
55
+ # @param [String] io
56
+ #
57
+ def output=(io)
58
+ @logger.reopen(io)
59
+ end
60
+
61
+ #
62
+ # Returns IO object used by logger internally.
63
+ #
64
+ # Normally, we would have never needed it, but we want to
65
+ # use it as IO object for all child processes to ensure their
66
+ # output is redirected there.
67
+ #
68
+ # It is only used in debug level, in other cases output is suppressed.
69
+ #
70
+ # @api private
71
+ #
72
+ def io
73
+ @logger.instance_variable_get(:@logdev).dev
74
+ end
75
+
76
+ #
77
+ # Marks code as deprecated with/without replacement.
78
+ #
79
+ # @param [String] old
80
+ # @param [String, nil] new
81
+ #
82
+ def deprecate(old, new = nil)
83
+ message = +"[DEPRECATION] #{old} is deprecated"
84
+ message << if new
85
+ ". Use #{new} instead."
86
+ else
87
+ ' and will be removed in the next releases.'
88
+ end
89
+
90
+ warn message
91
+ end
92
+
93
+ private
94
+
95
+ def create_logger(output)
96
+ logger = ::Logger.new(output)
97
+ logger.progname = 'Selenium'
98
+ logger.level = default_level
99
+ logger.formatter = proc do |severity, time, progname, msg|
100
+ "#{time.strftime('%F %T')} #{severity} #{progname} #{msg}\n"
101
+ end
102
+
103
+ logger
104
+ end
105
+
106
+ def default_level
107
+ if $DEBUG || ENV.key?('DEBUG')
108
+ :debug
109
+ else
110
+ :warn
111
+ end
112
+ end
113
+ end # Logger
114
+ end # WebDriver
115
+ end # Selenium
@@ -1,7 +1,25 @@
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
+
1
20
  module Selenium
2
21
  module WebDriver
3
22
  class Logs
4
-
5
23
  #
6
24
  # @api private
7
25
  #
@@ -11,13 +29,12 @@ module Selenium
11
29
  end
12
30
 
13
31
  def get(type)
14
- @bridge.getLog type
32
+ @bridge.log type
15
33
  end
16
34
 
17
35
  def available_types
18
- @bridge.getAvailableLogTypes
36
+ @bridge.available_log_types
19
37
  end
20
-
21
- end
22
- end
23
- end
38
+ end # Logs
39
+ end # WebDriver
40
+ end # Selenium
@@ -0,0 +1,177 @@
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
+ class Manager
23
+ #
24
+ # @api private
25
+ #
26
+
27
+ def initialize(bridge)
28
+ @bridge = bridge
29
+ end
30
+
31
+ #
32
+ # Add a cookie to the browser
33
+ #
34
+ # @param [Hash] opts the options to create a cookie with.
35
+ # @option opts [String] :name A name
36
+ # @option opts [String] :value A value
37
+ # @option opts [String] :path ('/') A path
38
+ # @option opts [String] :secure (false) A boolean
39
+ # @option opts [Time,DateTime,Numeric,nil] :expires (nil) Expiry date, either as a Time, DateTime, or seconds since epoch.
40
+ #
41
+ # @raise [ArgumentError] if :name or :value is not specified
42
+ #
43
+
44
+ def add_cookie(opts = {})
45
+ raise ArgumentError, 'name is required' unless opts[:name]
46
+ raise ArgumentError, 'value is required' unless opts[:value]
47
+
48
+ opts[:path] ||= '/'
49
+ opts[:secure] ||= false
50
+
51
+ obj = opts.delete(:expires)
52
+ opts[:expiry] = seconds_from(obj).to_i if obj
53
+
54
+ @bridge.add_cookie opts
55
+ end
56
+
57
+ #
58
+ # Get the cookie with the given name
59
+ #
60
+ # @param [String] name the name of the cookie
61
+ # @return [Hash, nil] the cookie, or nil if it wasn't found.
62
+ #
63
+
64
+ def cookie_named(name)
65
+ all_cookies.find { |c| c[:name] == name }
66
+ end
67
+
68
+ #
69
+ # Delete the cookie with the given name
70
+ #
71
+ # @param [String] name the name of the cookie to delete
72
+ #
73
+
74
+ def delete_cookie(name)
75
+ @bridge.delete_cookie name
76
+ end
77
+
78
+ #
79
+ # Delete all cookies
80
+ #
81
+
82
+ def delete_all_cookies
83
+ @bridge.delete_all_cookies
84
+ end
85
+
86
+ #
87
+ # Get all cookies
88
+ #
89
+ # @return [Array<Hash>] list of cookies
90
+ #
91
+
92
+ def all_cookies
93
+ @bridge.cookies.map { |cookie| convert_cookie(cookie) }
94
+ end
95
+
96
+ def timeouts
97
+ @timeouts ||= Timeouts.new(@bridge)
98
+ end
99
+
100
+ #
101
+ # @api beta This API may be changed or removed in a future release.
102
+ #
103
+
104
+ def logs
105
+ @logs ||= Logs.new(@bridge)
106
+ end
107
+
108
+ #
109
+ # Create a new top-level browsing context
110
+ # https://w3c.github.io/webdriver/#new-window
111
+ # @param type [Symbol] Supports two values: :tab and :window.
112
+ # Use :tab if you'd like the new window to share an OS-level window
113
+ # with the current browsing context.
114
+ # Use :window otherwise
115
+ # @return [String] The value of the window handle
116
+ #
117
+ def new_window(type = :tab)
118
+ case type
119
+ when :tab, :window
120
+ result = @bridge.new_window(type)
121
+ unless result.key?('handle')
122
+ raise UnknownError, "the driver did not return a handle. " \
123
+ "The returned result: #{result.inspect}"
124
+ end
125
+ result['handle']
126
+ else
127
+ raise ArgumentError, "invalid argument for type. Got: '#{type.inspect}'. " \
128
+ "Try :tab or :window"
129
+ end
130
+ end
131
+
132
+ #
133
+ # @api beta This API may be changed or removed in a future release.
134
+ #
135
+
136
+ def window
137
+ @window ||= Window.new(@bridge)
138
+ end
139
+
140
+ private
141
+
142
+ SECONDS_PER_DAY = 86_400.0
143
+
144
+ def datetime_at(int)
145
+ DateTime.civil(1970) + (int / SECONDS_PER_DAY)
146
+ end
147
+
148
+ def seconds_from(obj)
149
+ case obj
150
+ when Time
151
+ obj.to_f
152
+ when DateTime
153
+ (obj - DateTime.civil(1970)) * SECONDS_PER_DAY
154
+ when Numeric
155
+ obj
156
+ else
157
+ raise ArgumentError, "invalid value for expiration date: #{obj.inspect}"
158
+ end
159
+ end
160
+
161
+ def strip_port(str)
162
+ str.split(':', 2).first
163
+ end
164
+
165
+ def convert_cookie(cookie)
166
+ {
167
+ name: cookie['name'],
168
+ value: cookie['value'],
169
+ path: cookie['path'],
170
+ domain: cookie['domain'] && strip_port(cookie['domain']),
171
+ expires: cookie['expiry'] && datetime_at(cookie['expiry']),
172
+ secure: cookie['secure']
173
+ }
174
+ end
175
+ end # Options
176
+ end # WebDriver
177
+ end # Selenium