Best Selenium code snippet using Selenium.WebDriver.PointerActions.pointer_input
pointer_actions_spec.rb
Source:pointer_actions_spec.rb
...25 let(:element) { Element.new(bridge, 'element') }26 let(:element2) { Element.new(bridge, 'element2') }27 let(:duration) { builder.default_move_duration }28 let(:dimension) { 100 }29 describe '#pointer_input' do30 it 'gets key input by name' do31 expect(builder.send(:pointer_input, mouse.name)).to eq mouse32 end33 it 'raises ArgumentError if no device exists with that name' do34 expect { builder.send(:pointer_input, 'none') }.to raise_error(ArgumentError)35 end36 it 'gets default pointer input' do37 expect(builder.send(:pointer_input)).to eq mouse38 end39 end40 describe '#pointer_down' do41 it 'gets pointer_input' do42 allow(builder).to receive(:pointer_input).and_call_original43 builder.pointer_down :left, device: mouse.name44 expect(builder).to have_received(:pointer_input).with(mouse.name)45 end46 it 'passes the pointer to the #tick method' do47 allow(builder).to receive(:tick)48 builder.pointer_down :left49 expect(builder).to have_received(:tick).with(mouse)50 end51 it 'returns itself' do52 expect(builder.pointer_down(:left)).to eq(builder)53 end54 end55 describe '#pointer_up' do56 it 'gets pointer_input' do57 allow(builder).to receive(:pointer_input).and_call_original58 builder.pointer_up :left, device: mouse.name59 expect(builder).to have_received(:pointer_input).with(mouse.name)60 end61 it 'calls #create_pointer_up' do62 allow(mouse).to receive(:create_pointer_up)63 builder.pointer_up :left64 expect(mouse).to have_received :create_pointer_up65 end66 it 'passes the pointer to the #tick method' do67 allow(builder).to receive(:tick)68 builder.pointer_up :left69 expect(builder).to have_received(:tick).with(mouse)70 end71 it 'returns itself' do72 expect(builder.pointer_up(:left)).to eq(builder)73 end74 end75 describe '#move_to' do76 it 'gets pointer_input' do77 allow(builder).to receive(:pointer_input).and_call_original78 builder.move_to element, 5, 5, device: mouse.name79 expect(builder).to have_received(:pointer_input).with(mouse.name)80 end81 it 'calls create_pointer_move with offsets' do82 allow(mouse).to receive(:create_pointer_move).and_call_original83 allow(element).to receive(:size).and_return(width: dimension, height: dimension)84 right_by = 585 down_by = 886 builder.move_to(element, right_by, down_by)87 expect(mouse).to have_received(:create_pointer_move).with(duration: duration,88 x: right_by - dimension / 2,89 y: down_by - dimension / 2,90 origin: element)91 end92 it 'passes the pointer to the #tick method' do93 allow(builder).to receive(:tick)94 builder.move_to(element)95 expect(builder).to have_received(:tick).with(mouse)96 end97 it 'returns itself' do98 expect(builder.move_to(element)).to eq(builder)99 end100 end101 describe '#move_by' do102 it 'gets pointer_input' do103 allow(builder).to receive(:pointer_input).and_call_original104 builder.move_by 5, 5, device: mouse.name105 expect(builder).to have_received(:pointer_input).with(mouse.name)106 end107 it 'calls create_pointer_move with offsets' do108 allow(mouse).to receive(:create_pointer_move).and_call_original109 builder.move_by(5, 5)110 expect(mouse).to have_received(:create_pointer_move).with(duration: duration, origin: :pointer, x: 5, y: 5)111 end112 it 'passes the pointer to the #tick method' do113 allow(builder).to receive(:tick)114 builder.move_by(5, 5)115 expect(builder).to have_received(:tick).with(mouse)116 end117 it 'returns itself' do118 expect(builder.move_by(5, 5)).to eq(builder)119 end120 end121 describe '#move_to_location' do122 it 'gets pointer_input' do123 allow(builder).to receive(:pointer_input).and_call_original124 builder.move_to_location 5, 5, device: mouse.name125 expect(builder).to have_received(:pointer_input).with(mouse.name)126 end127 it 'calls create_pointer_move with offsets' do128 allow(mouse).to receive(:create_pointer_move).and_call_original129 builder.move_to_location(5, 5)130 expect(mouse).to have_received(:create_pointer_move).with(duration: duration, origin: :viewport, x: 5, y: 5)131 end132 it 'passes the pointer to the #tick method' do133 allow(builder).to receive(:tick)134 builder.move_to_location(5, 5)135 expect(builder).to have_received(:tick).with(mouse)136 end137 it 'returns itself' do138 expect(builder.move_to_location(5, 5)).to eq(builder)139 end...
pointer_actions.rb
Source:pointer_actions.rb
...85 # @param [Symbol || String] device optional name of the PointerInput device to move.86 # @return [ActionBuilder] A self reference.87 #88 def move_to(element, right_by = nil, down_by = nil, device: nil, **opts)89 pointer = pointer_input(device)90 # New actions offset is from center of element91 if right_by || down_by92 size = element.size93 left_offset = (size[:width] / 2).to_i94 top_offset = (size[:height] / 2).to_i95 left = -left_offset + (right_by || 0)96 top = -top_offset + (down_by || 0)97 else98 left = 099 top = 0100 end101 pointer.create_pointer_move(duration: default_move_duration,102 x: left,103 y: top,104 origin: element,105 **opts)106 tick(pointer)107 self108 end109 #110 # Moves the mouse from its current position by the given offset.111 # If the coordinates provided are outside the viewport (the mouse will112 # end up outside the browser window) then the viewport is scrolled to113 # match.114 #115 # @example Move the mouse to a certain offset from its current position116 #117 # driver.action.move_by(100, 100).perform118 #119 # @param [Integer] right_by horizontal offset. A negative value means moving the mouse left.120 # @param [Integer] down_by vertical offset. A negative value means moving the mouse up.121 # @param [Symbol || String] device optional name of the PointerInput device to move122 # @return [ActionBuilder] A self reference.123 # @raise [MoveTargetOutOfBoundsError] if the provided offset is outside the document's boundaries.124 #125 def move_by(right_by, down_by, device: nil)126 pointer = pointer_input(device)127 pointer.create_pointer_move(duration: default_move_duration,128 x: Integer(right_by),129 y: Integer(down_by),130 origin: Interactions::PointerMove::POINTER)131 tick(pointer)132 self133 end134 #135 # Moves the mouse to a given location in the viewport.136 # If the coordinates provided are outside the viewport (the mouse will137 # end up outside the browser window) then the viewport is scrolled to138 # match.139 #140 # @example Move the mouse to a certain position in the viewport141 #142 # driver.action.move_to_location(100, 100).perform143 #144 # @param [Integer] x horizontal position. Equivalent to a css 'left' value.145 # @param [Integer] y vertical position. Equivalent to a css 'top' value.146 # @param [Symbol || String] device optional name of the PointerInput device to move147 # @return [ActionBuilder] A self reference.148 # @raise [MoveTargetOutOfBoundsError] if the provided x or y value is outside the document's boundaries.149 #150 def move_to_location(x, y, device: nil)151 pointer = pointer_input(device)152 pointer.create_pointer_move(duration: default_move_duration,153 x: Integer(x),154 y: Integer(y),155 origin: Interactions::PointerMove::VIEWPORT)156 tick(pointer)157 self158 end159 #160 # Clicks (without releasing) in the middle of the given element. This is161 # equivalent to:162 #163 # driver.action.move_to(element).click_and_hold164 #165 # @example Clicking and holding on some element166 #167 # el = driver.find_element(id: "some_id")168 # driver.action.click_and_hold(el).perform169 #170 # @param [Selenium::WebDriver::Element] element the element to move to and click.171 # @param [Symbol || String] device optional name of the PointerInput device to click with172 # @return [ActionBuilder] A self reference.173 #174 def click_and_hold(element = nil, device: nil)175 move_to(element, device: device) if element176 pointer_down(:left, device: device)177 self178 end179 #180 # Releases the depressed left mouse button at the current mouse location.181 #182 # @example Releasing an element after clicking and holding it183 #184 # el = driver.find_element(id: "some_id")185 # driver.action.click_and_hold(el).release.perform186 #187 # @param [Symbol || String] device optional name of the PointerInput device with the button188 # that will be released189 # @return [ActionBuilder] A self reference.190 #191 def release(device: nil)192 pointer_up(:left, device: device)193 self194 end195 #196 # Clicks in the middle of the given element. Equivalent to:197 #198 # driver.action.move_to(element).click199 #200 # When no element is passed, the current mouse position will be clicked.201 #202 # @example Clicking on an element203 #204 # el = driver.find_element(id: "some_id")205 # driver.action.click(el).perform206 #207 # @example Clicking at the current mouse position208 #209 # driver.action.click.perform210 #211 # @param [Selenium::WebDriver::Element] element An optional element to click.212 # @param [Symbol || String] device optional name of the PointerInput device with the button213 # that will be clicked214 # @return [ActionBuilder] A self reference.215 #216 def click(element = nil, device: nil)217 move_to(element, device: device) if element218 pointer_down(:left, device: device)219 pointer_up(:left, device: device)220 self221 end222 #223 # Performs a double-click at middle of the given element. Equivalent to:224 #225 # driver.action.move_to(element).double_click226 #227 # When no element is passed, the current mouse position will be double-clicked.228 #229 # @example Double-click an element230 #231 # el = driver.find_element(id: "some_id")232 # driver.action.double_click(el).perform233 #234 # @example Double-clicking at the current mouse position235 #236 # driver.action.double_click.perform237 #238 # @param [Selenium::WebDriver::Element] element An optional element to move to.239 # @param [Symbol || String] device optional name of the PointerInput device with the button240 # that will be double-clicked241 # @return [ActionBuilder] A self reference.242 #243 def double_click(element = nil, device: nil)244 move_to(element, device: device) if element245 click(device: device)246 click(device: device)247 self248 end249 #250 # Performs a context-click at middle of the given element. First performs251 # a move_to to the location of the element.252 #253 # When no element is passed, the current mouse position will be context-clicked.254 #255 # @example Context-click at middle of given element256 #257 # el = driver.find_element(id: "some_id")258 # driver.action.context_click(el).perform259 #260 # @example Context-clicking at the current mouse position261 #262 # driver.action.context_click.perform263 #264 # @param [Selenium::WebDriver::Element] element An element to context click.265 # @param [Symbol || String] device optional name of the PointerInput device with the button266 # that will be context-clicked267 # @return [ActionBuilder] A self reference.268 #269 def context_click(element = nil, device: nil)270 move_to(element, device: device) if element271 pointer_down(:right, device: device)272 pointer_up(:right, device: device)273 self274 end275 #276 # A convenience method that performs click-and-hold at the location of the277 # source element, moves to the location of the target element, then278 # releases the mouse.279 #280 # @example Drag and drop one element onto another281 #282 # el1 = driver.find_element(id: "some_id1")283 # el2 = driver.find_element(id: "some_id2")284 # driver.action.drag_and_drop(el1, el2).perform285 #286 # @param [Selenium::WebDriver::Element] source element to emulate button down at.287 # @param [Selenium::WebDriver::Element] target element to move to and release the288 # mouse at.289 # @param [Symbol || String] device optional name of the PointerInput device with the button290 # that will perform the drag and drop291 # @return [ActionBuilder] A self reference.292 #293 def drag_and_drop(source, target, device: nil)294 click_and_hold(source, device: device)295 move_to(target, device: device)296 release(device: device)297 self298 end299 #300 # A convenience method that performs click-and-hold at the location of301 # the source element, moves by a given offset, then releases the mouse.302 #303 # @example Drag and drop an element by offset304 #305 # el = driver.find_element(id: "some_id1")306 # driver.action.drag_and_drop_by(el, 100, 100).perform307 #308 # @param [Selenium::WebDriver::Element] source Element to emulate button down at.309 # @param [Integer] right_by horizontal move offset.310 # @param [Integer] down_by vertical move offset.311 # @param [Symbol || String] device optional name of the PointerInput device with the button312 # that will perform the drag and drop313 # @return [ActionBuilder] A self reference.314 #315 def drag_and_drop_by(source, right_by, down_by, device: nil)316 click_and_hold(source, device: device)317 move_by(right_by, down_by, device: device)318 release(device: device)319 self320 end321 private322 def button_action(button, action, device: nil, **opts)323 pointer = pointer_input(device)324 pointer.send(action, button, **opts)325 tick(pointer)326 self327 end328 def pointer_input(name = nil)329 device(name: name, type: Interactions::POINTER) || add_pointer_input(:mouse, 'mouse')330 end331 end # PointerActions332 end # WebDriver333end # Selenium...
action_builder.rb
Source:action_builder.rb
...64 #65 # @example Add a touch pointer input device66 #67 # builder = device.action68 # builder.add_pointer_input('touch', :touch)69 #70 # @param [String] name name for the device71 # @param [Symbol] kind kind of pointer device to create72 # @return [Interactions::PointerInput] The pointer input added73 #74 #75 def add_pointer_input(kind, name)76 add_input(Interactions.pointer(kind, name: name))77 end78 #79 # Adds a KeyInput device80 #81 # @example Add a key input device82 #83 # builder = device.action84 # builder.add_key_input('keyboard2')85 #86 # @param [String] name name for the device87 # @return [Interactions::KeyInput] The key input added88 #89 def add_key_input(name)90 add_input(Interactions.key(name))91 end92 #93 # Adds a WheelInput device94 #95 # @example Add a wheel input device96 #97 # builder = device.action98 # builder.add_wheel_input('wheel2')99 #100 # @param [String] name name for the device101 # @return [Interactions::WheelInput] The wheel input added102 #103 def add_wheel_input(name)104 add_input(Interactions.wheel(name))105 end106 #107 # Retrieves the input device for the given name108 #109 # @param [String] name name of the input device110 # @return [Selenium::WebDriver::Interactions::InputDevice] input device with given name111 #112 def get_device(name)113 WebDriver.logger.deprecate('#get_device with name parameter',114 '#device with :name or :type keyword',115 id: :get_device)116 device(name: name)117 end118 #119 # Retrieves the input device for the given name or type120 #121 # @param [String] name name of the input device122 # @param [String] type name of the input device123 # @return [Selenium::WebDriver::Interactions::InputDevice] input device with given name or type124 #125 def device(name: nil, type: nil)126 input = @devices.find { |device| (device.name == name.to_s || name.nil?) && (device.type == type || type.nil?) }127 raise(ArgumentError, "Can not find device: #{name}") if name && input.nil?128 input129 end130 #131 # Retrieves the current PointerInput devices132 #133 # @return [Array] array of current PointerInput devices134 #135 def pointer_inputs136 @devices.select { |device| device.type == Interactions::POINTER }137 end138 #139 # Retrieves the current KeyInput device140 #141 # @return [Selenium::WebDriver::Interactions::InputDevice] current KeyInput device142 #143 def key_inputs144 @devices.select { |device| device.type == Interactions::KEY }145 end146 #147 # Retrieves the current WheelInput device148 #149 # @return [Selenium::WebDriver::Interactions::InputDevice] current WheelInput devices150 #151 def wheel_inputs152 @devices.select { |device| device.type == Interactions::WHEEL }153 end154 #155 # Creates a pause for the given device of the given duration. If no duration is given, the pause will only wait156 # for all actions to complete in that tick.157 #158 # @example Send keys to an element159 #160 # action_builder = driver.action161 # keyboard = action_builder.key_input162 # el = driver.find_element(id: "some_id")163 # driver.action.click(el).pause(keyboard).pause(keyboard).pause(keyboard).send_keys('keys').perform164 #165 # @param [InputDevice] device Input device to pause166 # @param [Float] duration Duration to pause167 # @return [ActionBuilder] A self reference.168 #169 def pause(deprecated_device = nil, deprecated_duration = nil, device: nil, duration: 0)170 deprecate_method(deprecated_device, deprecated_duration)171 device ||= deprecated_device || pointer_input172 device.create_pause(duration || deprecated_duration)173 self174 end175 #176 # Creates multiple pauses for the given device of the given duration.177 #178 # @example Send keys to an element179 #180 # action_builder = driver.action181 # keyboard = action_builder.key_input182 # el = driver.find_element(id: "some_id")183 # driver.action.click(el).pauses(keyboard, 3).send_keys('keys').perform184 #185 # @param [InputDevice] device Input device to pause186 # @param [Integer] number of pauses to add for the device187 # @param [Float] duration Duration to pause188 # @return [ActionBuilder] A self reference.189 #190 def pauses(deprecated_device = nil, deprecated_number = nil, deprecated_duration = nil,191 device: nil, number: nil, duration: 0)192 deprecate_method(deprecated_device, deprecated_duration, deprecated_number, method: :pauses)193 number ||= deprecated_number || 2194 device ||= deprecated_device || pointer_input195 duration ||= deprecated_duration || 0196 number.times { device.create_pause(duration) }197 self198 end199 #200 # Executes the actions added to the builder.201 #202 def perform203 @bridge.send_actions @devices.map(&:encode).compact204 clear_all_actions205 nil206 end207 #208 # Clears all actions from the builder....
pointer_input
Using AI Code Generation
1caps['goog:loggingPrefs'] = { browser: 'ALL' }2driver.manage.logs.get(:browser).each do |log|3caps['goog:loggingPrefs'] = { browser: 'ALL' }4actions.pointer_input(:mouse).click5driver.manage.logs.get(:browser).each do |log|
pointer_input
Using AI Code Generation
1actions = Selenium::WebDriver::PointerActions.new(driver)2actions = Selenium::WebDriver::PointerActions.new(driver)3actions = Selenium::WebDriver::PointerActions.new(driver)4actions = Selenium::WebDriver::PointerActions.new(driver)
pointer_input
Using AI Code Generation
1search_field = driver.find_element(:xpath, "//input[@name='q']")2search_field.send_keys("Selenium WebDriver")3driver.action.click_and_hold(search_field).move_by(1,1).release.perform
pointer_input
Using AI Code Generation
1pointer = driver.action.pointer_input(:mouse)2pointer.move_to(driver.find_element(:name, 'q')).click.perform3pointer = driver.action.pointer_input(:touch)4pointer.move_to(driver.find_element(:name, 'q')).click.perform5pointer = driver.action.pointer_input(:pen)6pointer.move_to(driver.find_element(:name, 'q')).click.perform7pointer = driver.action.pointer_input(:touch, :primary)8pointer2 = driver.action.pointer_input(:touch, :secondary)9pointer.move_to(driver.find_element(:name, 'q')).click.perform10pointer2.move_to(driver.find_element(:name, 'q')).click.perform11pointer = driver.action.pointer_input(:touch, :primary)12pointer2 = driver.action.pointer_input(:touch, :secondary)13pointer.move_to(driver.find_element(:name, 'q')).click.perform14pointer2.move_to(driver.find_element(:name, 'q')).click.perform15pointer.move_to(driver.find_element(:name, 'q')).click.perform16pointer2.move_to(driver.find_element(:name, 'q')).click.perform17key = driver.action.key_input(:
pointer_input
Using AI Code Generation
1search_box = driver.find_element(:name, 'q')2pointer = driver.pointer_input(:mouse)3pointer_action.move_to(pointer, search_box)4search_box = driver.find_element(:name, 'q')5pointer = driver.pointer_input(:mouse)6pointer_action.move_to(pointer, search_box)7search_button = driver.find_element(:name, 'btnK')8pointer_action.move_to(pointer, search_button)
pointer_input
Using AI Code Generation
1pointer_input = Selenium::WebDriver::PointerInput.new(:mouse)2action_builder = Selenium::WebDriver::ActionBuilder.new(driver)3action = action_builder.pointer_move(source: pointer_input, x: 500, y: 500).click.perform4pointer_input = Selenium::WebDriver::PointerInput.new(:mouse)5action_builder = Selenium::WebDriver::ActionBuilder.new(driver)6action = action_builder.pointer_move(source: pointer_input, x: 300, y: 300).click_and_hold.perform7action = action_builder.pointer_move(source: pointer_input, x: 500, y: 500).perform8action = action_builder.pointer_up(source: pointer_input).perform
pointer_input
Using AI Code Generation
1driver.action.pointer_input(:mouse).move_to(element: driver.find_element(:name, 'q')).perform2driver.action.pointer_input(:mouse).click.perform3driver.action.pointer_input(:mouse).send_keys('Selenium WebDriver').perform4driver.action.pointer_input(:mouse).move_to(element: driver.find_element(:name, 'btnK')).click.perform
pointer_input
Using AI Code Generation
1search_box = driver.find_element(:name, 'q')2search_button = driver.find_element(:name, 'btnK')3pointer_actions = Selenium::WebDriver::PointerActions.new(driver)4action_builder = Selenium::WebDriver::ActionBuilder.new(driver)5action_sequence = action_builder.pointer_action(:mouse, pointer_actions)6action_sequence.pointer_input(:pointerMove, search_box.location_once_scrolled_into_view)7 .pointer_input(:pointerDown, search_box.location_once_scrolled_into_view)8 .pointer_input(:pointerUp, search_box.location_once_scrolled_into_view)9 .pointer_input(:pointerMove, search_button.location_once_scrolled_into_view)10 .pointer_input(:pointerDown, search_button.location_once_scrolled_into_view)11 .pointer_input(:pointerUp, search_button.location_once_scrolled_into_view)
pointer_input
Using AI Code Generation
1actions = Selenium::WebDriver::PointerActions.new(driver)2pointer = Selenium::WebDriver::PointerInput.new(:mouse)3pointer_action = pointer.create_pointer_move(duration: 0, x: 0, y: 0, origin: nil)4pointer_action = pointer_action.create_pointer_down(:left)5pointer_action = pointer_action.create_pointer_up(:left)6actions.pointer_input(pointer_action).perform7actions = Selenium::WebDriver::PointerActions.new(driver)8pointer = Selenium::WebDriver::PointerInput.new(:mouse)9pointer_action = pointer.create_pointer_move(duration: 0, x: 0, y: 0, origin: nil)10pointer_action = pointer_action.create_pointer_down(:left)11pointer_action = pointer_action.create_pointer_up(:left)12actions.pointer_input(pointer_action).perform13actions = Selenium::WebDriver::PointerActions.new(driver)14pointer = driver.action.pointer_input(:touch, :primary)15pointer2 = driver.action.pointer_input(:touch, :secondary)16pointer.move_to(driver.find_element(:name, 'q')).click.perform17pointer2.move_to(driver.find_element(:name, 'q')).click.perform18pointer.move_to(driver.find_element(:name, 'q')).click.perform19pointer2.move_to(driver.find_element(:name, 'q')).click.perform20key = driver.action.key_input(:
pointer_input
Using AI Code Generation
1driver.action.pointer_input(:mouse).move_to(element: driver.find_element(:name, 'q')).perform2driver.action.pointer_input(:mouse).click.perform3driver.action.pointer_input(:mouse).send_keys('Selenium WebDriver').perform4driver.action.pointer_input(:mouse).move_to(element: driver.find_element(:name, 'btnK')).click.perform
pointer_input
Using AI Code Generation
1search_box = driver.find_element(:name, 'q')2search_button = driver.find_element(:name, 'btnK')3pointer_actions = Selenium::WebDriver::PointerActions.new(driver)4action_builder = Selenium::WebDriver::ActionBuilder.new(driver)5action_sequence = action_builder.pointer_action(:mouse, pointer_actions)6action_sequence.pointer_input(:pointerMove, search_box.location_once_scrolled_into_view)7 .pointer_input(:pointerDown, search_box.location_once_scrolled_into_view)8 .pointer_input(:pointerUp, search_box.location_once_scrolled_into_view)9 .pointer_input(:pointerMove, search_button.location_once_scrolled_into_view)10 .pointer_input(:pointerDown, search_button.location_once_scrolled_into_view)11 .pointer_input(:pointerUp, search_button.location_once_scrolled_into_view)
pointer_input
Using AI Code Generation
1caps['goog:loggingPrefs'] = { browser: 'ALL' }2driver.manage.logs.get(:browser).each do |log|3caps['goog:loggingPrefs'] = { browser: 'ALL' }4actions.pointer_input(:mouse).click5driver.manage.logs.get(:browser).each do |log|
pointer_input
Using AI Code Generation
1driver.action.pointer_input(:mouse).move_to(element: driver.find_element(:name, 'q')).perform2driver.action.pointer_input(:mouse).click.perform3driver.action.pointer_input(:mouse).send_keys('Selenium WebDriver').perform4driver.action.pointer_input(:mouse).move_to(element: driver.find_element(:name, 'btnK')).click.perform
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!