@@ -136,22 +136,7 @@ module WebDriver
136136 driver . action . release_actions
137137 expect ( event_input . attribute ( :value ) ) . to eq ( 'Clicked' )
138138 end
139- end
140-
141- describe '#release' do
142- it 'releases pressed buttons' , except : [ { browser : %i[ safari safari_preview ] } ,
143- { driver : :remote , browser : :ie } ] do
144- driver . navigate . to url_for ( 'javascriptPage.html' )
145-
146- event_input = driver . find_element ( id : 'clickField' )
147-
148- driver . action . click_and_hold ( event_input ) . perform
149- expect ( event_input . attribute ( :value ) ) . to eq ( 'Hello' )
150-
151- driver . action . release . perform
152- expect ( event_input . attribute ( :value ) ) . to eq ( 'Clicked' )
153- end
154- end
139+ end
155140
156141 describe '#click' do
157142 it 'clicks provided element' do
@@ -160,13 +145,11 @@ module WebDriver
160145 driver . action . click ( element ) . perform
161146 expect ( element . attribute ( :value ) ) . to eq ( 'Clicked' )
162147 end
163- end
164148
165- describe 'pointer presses' do
166- it 'holds pointer down and releases' do
149+ it 'executes with equivalent pointer methods' do
167150 driver . navigate . to url_for ( 'javascriptPage.html' )
168151 element = driver . find_element ( id : 'clickField' )
169- driver . action . move_to ( element ) . pointer_down ( :left ) . click . pointer_up ( :left ) . perform
152+ driver . action . move_to ( element ) . pointer_down ( :left ) . pointer_up ( :left ) . perform
170153 expect ( element . attribute ( :value ) ) . to eq ( 'Clicked' )
171154 end
172155 end
@@ -176,10 +159,20 @@ module WebDriver
176159 driver . navigate . to url_for ( 'javascriptPage.html' )
177160 element = driver . find_element ( id : 'doubleClickField' )
178161
179- sleep 0.5
180162 driver . action . double_click ( element ) . perform
181163 expect ( element . attribute ( :value ) ) . to eq ( 'DoubleClicked' )
182164 end
165+
166+ it 'executes with equivalent pointer methods' do
167+ driver . navigate . to url_for ( 'javascriptPage.html' )
168+ element = driver . find_element ( id : 'doubleClickField' )
169+
170+ driver . action . move_to ( element )
171+ . pointer_down ( :left ) . pointer_up ( :left )
172+ . pointer_down ( :left ) . pointer_up ( :left )
173+ . perform
174+ expect ( element . attribute ( :value ) ) . to eq ( 'DoubleClicked' )
175+ end
183176 end
184177
185178 describe '#context_click' do
@@ -190,6 +183,14 @@ module WebDriver
190183 driver . action . context_click ( element ) . perform
191184 expect ( element . attribute ( :value ) ) . to eq ( 'ContextClicked' )
192185 end
186+
187+ it 'executes with equivalent pointer methods' do
188+ driver . navigate . to url_for ( 'javascriptPage.html' )
189+ element = driver . find_element ( id : 'doubleClickField' )
190+
191+ driver . action . move_to ( element ) . pointer_down ( :right ) . pointer_up ( :right ) . perform
192+ expect ( element . attribute ( :value ) ) . to eq ( 'ContextClicked' )
193+ end
193194 end
194195
195196 describe '#move_to' do
@@ -259,15 +260,47 @@ module WebDriver
259260 end
260261 end
261262
262- def in_viewport? ( element )
263- in_viewport = <<~IN_VIEWPORT
264- for(var e=arguments[0],f=e.offsetTop,t=e.offsetLeft,o=e.offsetWidth,n=e.offsetHeight;
265- e.offsetParent;)f+=(e=e.offsetParent).offsetTop,t+=e.offsetLeft;
266- return f<window.pageYOffset+window.innerHeight&&t<window.pageXOffset+window.innerWidth&&f+n>
267- window.pageYOffset&&t+o>window.pageXOffset
268- IN_VIEWPORT
269-
270- driver . execute_script ( in_viewport , element )
263+ describe 'pen stylus' do
264+ it 'sets pointer event properties' do
265+ driver . get 'https://titusfortner.com/examples/pointerActionsPage.html'
266+ pointer_area = driver . find_element ( id : 'pointerArea' )
267+ rect = pointer_area . rect
268+ x_val = rect . x
269+ y_val = rect . y
270+
271+ pointer_options = { pressure : 0.8 , tilt_x : -40 , tilt_y : -10 , twist : 177 }
272+ actions = driver . action ( devices : :pen )
273+ . move_by ( x_val + 5 , y_val + 5 )
274+ . pointer_down ( **pointer_options )
275+ . move_by ( 2 , 2 , duration : 0.8 )
276+ . pointer_up
277+
278+ start = Time . now
279+ actions . perform
280+ expect ( Time . now - start ) . to be > 0.8
281+
282+ moves = driver . find_elements ( class : 'pointermove' )
283+ move_to = properties ( moves [ 0 ] )
284+ down = properties ( driver . find_element ( class : 'pointerdown' ) )
285+ move_by = properties ( moves [ 1 ] )
286+ up = properties ( driver . find_element ( class : 'pointerup' ) )
287+
288+ expect ( move_to ) . to include ( "button" => "-1" ,
289+ "pageX" => ( x_val + 5 ) . to_s ,
290+ "pageY" => ( y_val + 5 ) . floor . to_s )
291+ expect ( down ) . to include ( "button" => "0" ,
292+ "pageX" => ( x_val + 5 ) . to_s ,
293+ "pageY" => ( y_val + 5 ) . floor . to_s ,
294+ "tiltX" => "-40" ,
295+ "tiltY" => "-10" ,
296+ "twist" => "177" )
297+ expect ( move_by ) . to include ( "button" => "-1" ,
298+ "pageX" => ( x_val + 5 + 2 ) . to_s ,
299+ "pageY" => ( y_val + 5 + 2 ) . floor . to_s )
300+ expect ( up ) . to include ( "button" => "0" ,
301+ "pageX" => ( x_val + 5 + 2 ) . to_s ,
302+ "pageY" => ( y_val + 5 + 2 ) . floor . to_s )
303+ end
271304 end
272305
273306 describe '#scroll_to' , only : { browser : %i[ chrome edge ] } do
@@ -352,6 +385,21 @@ def in_viewport?(element)
352385 } . to raise_error ( Error ::MoveTargetOutOfBoundsError )
353386 end
354387 end
388+
389+ def properties ( element )
390+ element . text . sub ( /.*?\s / , '' ) . split ( ',' ) . map { |item | item . lstrip . split /\s *:\s */ } . to_h
391+ end
392+
393+ def in_viewport? ( element )
394+ in_viewport = <<~IN_VIEWPORT
395+ for(var e=arguments[0],f=e.offsetTop,t=e.offsetLeft,o=e.offsetWidth,n=e.offsetHeight;
396+ e.offsetParent;)f+=(e=e.offsetParent).offsetTop,t+=e.offsetLeft;
397+ return f<window.pageYOffset+window.innerHeight&&t<window.pageXOffset+window.innerWidth&&f+n>
398+ window.pageYOffset&&t+o>window.pageXOffset
399+ IN_VIEWPORT
400+
401+ driver . execute_script ( in_viewport , element )
402+ end
355403 end # ActionBuilder
356404 end # WebDriver
357405end # Selenium
0 commit comments