Além das interações de alto nível , a API de Ações oferece controle detalhado sobre o que dispositivos de entrada designados podem fazer. O Selenium fornece uma interface para 3 tipos de fontes de entrada: entrada de teclado para dispositivos de teclado, entrada de ponteiro para mouse, caneta ou dispositivos de toque, e entrada de roda para dispositivos de roda de rolagem (introduzida no Selenium 4.2). O Selenium permite que você construa comandos de ação individuais atribuídos a entradas específicas, encadeie-os e chame o método de execução associado para executá-los todos de uma vez.
Construtor de Ações Na transição do antigo Protocolo JSON Wire para o novo Protocolo W3C WebDriver, os componentes de construção de ações de baixo nível se tornaram especialmente detalhados. Isso é extremamente poderoso, mas cada dispositivo de entrada possui várias maneiras de ser utilizado e, se você precisa gerenciar mais de um dispositivo, é responsável por garantir a sincronização adequada entre eles.
Felizmente, provavelmente você não precisa aprender a usar os comandos de baixo nível diretamente, uma vez que quase tudo o que você pode querer fazer foi fornecido com um método de conveniência que combina os comandos de nível inferior para você. Todos esses métodos estão documentados nas páginas de teclado , mouse , caneta e roda .
Pausa Movimentos de ponteiro e rolagem da roda permitem que o usuário defina uma duração para a ação, mas às vezes você só precisa esperar um momento entre as ações para que as coisas funcionem corretamente.
Java
Python
CSharp
Ruby
JavaScript
Kotlin WebElement clickable = driver . findElement ( By . id ( "clickable" ));
new Actions ( driver )
. moveToElement ( clickable )
. pause ( Duration . ofSeconds ( 1 ))
. clickAndHold ()
. pause ( Duration . ofSeconds ( 1 ))
. sendKeys ( "abc" )
. perform (); /examples/java/src/test/java/dev/selenium/actions_api/ActionsTest.java
Copy
Close
package dev.selenium.actions_api ;
import dev.selenium.BaseChromeTest ;
import org.junit.jupiter.api.Assertions ;
import org.junit.jupiter.api.Test ;
import org.openqa.selenium.By ;
import org.openqa.selenium.Keys ;
import org.openqa.selenium.WebElement ;
import org.openqa.selenium.interactions.Actions ;
import org.openqa.selenium.remote.RemoteWebDriver ;
import java.time.Duration ;
public class ActionsTest extends BaseChromeTest {
@Test
public void pause () {
driver . get ( "https://www.selenium.dev/selenium/web/mouse_interaction.html" );
long start = System . currentTimeMillis ();
WebElement clickable = driver . findElement ( By . id ( "clickable" ));
new Actions ( driver )
. moveToElement ( clickable )
. pause ( Duration . ofSeconds ( 1 ))
. clickAndHold ()
. pause ( Duration . ofSeconds ( 1 ))
. sendKeys ( "abc" )
. perform ();
long duration = System . currentTimeMillis () - start ;
Assertions . assertTrue ( duration > 2000 );
Assertions . assertTrue ( duration < 3000 );
}
@Test
public void releasesAll () {
driver . get ( "https://www.selenium.dev/selenium/web/mouse_interaction.html" );
WebElement clickable = driver . findElement ( By . id ( "clickable" ));
Actions actions = new Actions ( driver );
actions . clickAndHold ( clickable )
. keyDown ( Keys . SHIFT )
. sendKeys ( "a" )
. perform ();
(( RemoteWebDriver ) driver ). resetInputState ();
actions . sendKeys ( "a" ). perform ();
Assertions . assertEquals ( "A" , String . valueOf ( clickable . getAttribute ( "value" ). charAt ( 0 )));
Assertions . assertEquals ( "a" , String . valueOf ( clickable . getAttribute ( "value" ). charAt ( 1 )));
}
}
clickable = driver . find_element ( By . ID , "clickable" )
ActionChains ( driver ) \
. move_to_element ( clickable ) \
. pause ( 1 ) \
. click_and_hold () \
. pause ( 1 ) \
. send_keys ( "abc" ) \
. perform () /examples/python/tests/actions_api/test_actions.py
Copy
Close
from time import time
from selenium.webdriver import Keys , ActionChains
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.by import By
def test_pauses ( driver ):
driver . get ( 'https://selenium.dev/selenium/web/mouse_interaction.html' )
start = time ()
clickable = driver . find_element ( By . ID , "clickable" )
ActionChains ( driver ) \
. move_to_element ( clickable ) \
. pause ( 1 ) \
. click_and_hold () \
. pause ( 1 ) \
. send_keys ( "abc" ) \
. perform ()
duration = time () - start
assert duration > 2
assert duration < 3
def test_releases_all ( driver ):
driver . get ( 'https://selenium.dev/selenium/web/mouse_interaction.html' )
clickable = driver . find_element ( By . ID , "clickable" )
ActionChains ( driver ) \
. click_and_hold ( clickable ) \
. key_down ( Keys . SHIFT ) \
. key_down ( "a" ) \
. perform ()
ActionBuilder ( driver ) . clear_actions ()
ActionChains ( driver ) . key_down ( 'a' ) . perform ()
assert clickable . get_attribute ( 'value' )[ 0 ] == "A"
assert clickable . get_attribute ( 'value' )[ 1 ] == "a"
Selenium v4.2
IWebElement clickable = driver . FindElement ( By . Id ( "clickable" ));
new Actions ( driver )
. MoveToElement ( clickable )
. Pause ( TimeSpan . FromSeconds ( 1 ))
. ClickAndHold ()
. Pause ( TimeSpan . FromSeconds ( 1 ))
. SendKeys ( "abc" )
. Perform (); /examples/dotnet/SeleniumDocs/ActionsAPI/ActionsTest.cs
Copy
Close
using System ;
using Microsoft.VisualStudio.TestTools.UnitTesting ;
using OpenQA.Selenium ;
using OpenQA.Selenium.Interactions ;
namespace SeleniumDocs.ActionsAPI
{
[TestClass]
public class ActionsTest : BaseChromeTest
{
[TestMethod]
public void Pause ()
{
driver . Url = "https://selenium.dev/selenium/web/mouse_interaction.html" ;
DateTime start = DateTime . Now ;
IWebElement clickable = driver . FindElement ( By . Id ( "clickable" ));
new Actions ( driver )
. MoveToElement ( clickable )
. Pause ( TimeSpan . FromSeconds ( 1 ))
. ClickAndHold ()
. Pause ( TimeSpan . FromSeconds ( 1 ))
. SendKeys ( "abc" )
. Perform ();
TimeSpan duration = DateTime . Now - start ;
Assert . IsTrue ( duration > TimeSpan . FromSeconds ( 2 ));
Assert . IsTrue ( duration < TimeSpan . FromSeconds ( 3 ));
}
[TestMethod]
public void ReleaseAll ()
{
driver . Url = "https://selenium.dev/selenium/web/mouse_interaction.html" ;
IWebElement clickable = driver . FindElement ( By . Id ( "clickable" ));
var actions = new Actions ( driver );
actions . ClickAndHold ( clickable )
. KeyDown ( Keys . Shift )
. SendKeys ( "a" )
. Perform ();
(( WebDriver ) driver ). ResetInputState ();
actions . SendKeys ( "a" ). Perform ();
var value = clickable . GetAttribute ( "value" );
Assert . AreEqual ( "A" , value [.. 1 ]);
Assert . AreEqual ( "a" , value . Substring ( 1 , 1 ));
}
}
} Selenium v4.2
clickable = driver . find_element ( id : 'clickable' )
driver . action
. move_to ( clickable )
. pause ( duration : 1 )
. click_and_hold
. pause ( duration : 1 )
. send_keys ( 'abc' )
. perform /examples/ruby/spec/actions_api/actions_spec.rb
Copy
Close
# frozen_string_literal: true
require 'spec_helper'
RSpec . describe 'Actions' do
let ( :driver ) { start_session }
it 'pauses' do
driver . get 'https://www.selenium.dev/selenium/web/mouse_interaction.html'
start = Time . now
clickable = driver . find_element ( id : 'clickable' )
driver . action
. move_to ( clickable )
. pause ( duration : 1 )
. click_and_hold
. pause ( duration : 1 )
. send_keys ( 'abc' )
. perform
duration = Time . now - start
expect ( duration ) . to be > 2
expect ( duration ) . to be < 3
end
it 'releases all' do
driver . get 'https://www.selenium.dev/selenium/web/mouse_interaction.html'
clickable = driver . find_element ( id : 'clickable' )
action = driver . action
. click_and_hold ( clickable )
. key_down ( :shift )
. key_down ( 'a' )
action . perform
driver . action . release_actions
action . key_down ( 'a' ) . perform
expect ( clickable . attribute ( 'value' ) [ 0 ] ) . to eq 'A'
expect ( clickable . attribute ( 'value' ) [- 1 ] ) . to eq 'a'
end
end
const clickable = await driver . findElement ( By . id ( 'clickable' ))
await driver . actions ()
. move ({ origin : clickable })
. pause ( 1000 )
. press ()
. pause ( 1000 )
. sendKeys ( 'abc' )
. perform ()
/examples/javascript/test/actionsApi/actionsTest.spec.js
Copy
Close
const { By , Key , Browser , Builder } = require ( 'selenium-webdriver' )
const assert = require ( 'assert' )
describe ( 'Actions API - Pause and Release All Actions' , function () {
let driver
before ( async function () {
driver = await new Builder (). forBrowser ( 'chrome' ). build ();
})
after ( async () => await driver . quit ())
it ( 'Pause' , async function () {
await driver . get ( 'https://selenium.dev/selenium/web/mouse_interaction.html' )
const start = Date . now ()
const clickable = await driver . findElement ( By . id ( 'clickable' ))
await driver . actions ()
. move ({ origin : clickable })
. pause ( 1000 )
. press ()
. pause ( 1000 )
. sendKeys ( 'abc' )
. perform ()
const end = Date . now () - start
assert . ok ( end > 2000 )
assert . ok ( end < 4000 )
})
it ( 'Clear' , async function () {
await driver . get ( 'https://selenium.dev/selenium/web/mouse_interaction.html' )
const clickable = driver . findElement ( By . id ( 'clickable' ))
await driver . actions ()
. click ( clickable )
. keyDown ( Key . SHIFT )
. sendKeys ( 'a' )
. perform ()
await driver . actions (). clear ()
await driver . actions (). sendKeys ( 'a' ). perform ()
const value = await clickable . getAttribute ( 'value' )
assert . deepStrictEqual ( 'A' , value . substring ( 0 , 1 ))
assert . deepStrictEqual ( 'a' , value . substring ( 1 , 2 ))
})
})
Actions ( driver )
. moveToElement ( clickable )
. pause ( Duration . ofSeconds ( 1 ))
. clickAndHold ()
. pause ( Duration . ofSeconds ( 1 ))
. sendKeys ( "abc" )
. perform ()
/examples/kotlin/src/test/kotlin/dev/selenium/actions_api/ActionsTest.kt
Copy
Close
package dev.selenium.actions_api
import dev.selenium.BaseTest
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.openqa.selenium.By
import org.openqa.selenium.Keys
import org.openqa.selenium.interactions.Actions
import org.openqa.selenium.remote.RemoteWebDriver
import java.time.Duration
class ActionsTest : BaseTest () {
@Test
fun pause () {
driver . get ( "https://www.selenium.dev/selenium/web/mouse_interaction.html" )
val start = System . currentTimeMillis ()
val clickable = driver . findElement ( By . id ( "clickable" ))
Actions ( driver )
. moveToElement ( clickable )
. pause ( Duration . ofSeconds ( 1 ))
. clickAndHold ()
. pause ( Duration . ofSeconds ( 1 ))
. sendKeys ( "abc" )
. perform ()
val duration = System . currentTimeMillis () - start
Assertions . assertTrue ( duration > 2000 )
Assertions . assertTrue ( duration < 4000 )
}
@Test
fun releasesAll () {
driver . get ( "https://www.selenium.dev/selenium/web/mouse_interaction.html" )
val clickable = driver . findElement ( By . id ( "clickable" ))
val actions = Actions ( driver )
actions . clickAndHold ( clickable )
. keyDown ( Keys . SHIFT )
. sendKeys ( "a" )
. perform ()
( driver as RemoteWebDriver ). resetInputState ()
actions . sendKeys ( "a" ). perform ()
Assertions . assertEquals ( "A" , clickable . getAttribute ( "value" ) !! . get ( 0 ). toString ())
Assertions . assertEquals ( "a" , clickable . getAttribute ( "value" ) !! . get ( 1 ). toString ())
}
}
Liberar Todas as Ações Um ponto importante a ser observado é que o driver lembra o estado de todos os itens de entrada ao longo de uma sessão. Mesmo se você criar uma nova instância de uma classe de ações, as teclas pressionadas e a posição do ponteiro permanecerão no estado em que uma ação previamente executada os deixou.
Existe um método especial para liberar todas as teclas pressionadas e botões do ponteiro atualmente pressionados. Esse método é implementado de maneira diferente em cada uma das linguagens porque não é executado com o método de execução (perform).
Java
Python
CSharp
Ruby
JavaScript
Kotlin (( RemoteWebDriver ) driver ). resetInputState (); /examples/java/src/test/java/dev/selenium/actions_api/ActionsTest.java
Copy
Close
package dev.selenium.actions_api ;
import dev.selenium.BaseChromeTest ;
import org.junit.jupiter.api.Assertions ;
import org.junit.jupiter.api.Test ;
import org.openqa.selenium.By ;
import org.openqa.selenium.Keys ;
import org.openqa.selenium.WebElement ;
import org.openqa.selenium.interactions.Actions ;
import org.openqa.selenium.remote.RemoteWebDriver ;
import java.time.Duration ;
public class ActionsTest extends BaseChromeTest {
@Test
public void pause () {
driver . get ( "https://www.selenium.dev/selenium/web/mouse_interaction.html" );
long start = System . currentTimeMillis ();
WebElement clickable = driver . findElement ( By . id ( "clickable" ));
new Actions ( driver )
. moveToElement ( clickable )
. pause ( Duration . ofSeconds ( 1 ))
. clickAndHold ()
. pause ( Duration . ofSeconds ( 1 ))
. sendKeys ( "abc" )
. perform ();
long duration = System . currentTimeMillis () - start ;
Assertions . assertTrue ( duration > 2000 );
Assertions . assertTrue ( duration < 3000 );
}
@Test
public void releasesAll () {
driver . get ( "https://www.selenium.dev/selenium/web/mouse_interaction.html" );
WebElement clickable = driver . findElement ( By . id ( "clickable" ));
Actions actions = new Actions ( driver );
actions . clickAndHold ( clickable )
. keyDown ( Keys . SHIFT )
. sendKeys ( "a" )
. perform ();
(( RemoteWebDriver ) driver ). resetInputState ();
actions . sendKeys ( "a" ). perform ();
Assertions . assertEquals ( "A" , String . valueOf ( clickable . getAttribute ( "value" ). charAt ( 0 )));
Assertions . assertEquals ( "a" , String . valueOf ( clickable . getAttribute ( "value" ). charAt ( 1 )));
}
}
ActionBuilder ( driver ) . clear_actions () /examples/python/tests/actions_api/test_actions.py
Copy
Close
from time import time
from selenium.webdriver import Keys , ActionChains
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.by import By
def test_pauses ( driver ):
driver . get ( 'https://selenium.dev/selenium/web/mouse_interaction.html' )
start = time ()
clickable = driver . find_element ( By . ID , "clickable" )
ActionChains ( driver ) \
. move_to_element ( clickable ) \
. pause ( 1 ) \
. click_and_hold () \
. pause ( 1 ) \
. send_keys ( "abc" ) \
. perform ()
duration = time () - start
assert duration > 2
assert duration < 3
def test_releases_all ( driver ):
driver . get ( 'https://selenium.dev/selenium/web/mouse_interaction.html' )
clickable = driver . find_element ( By . ID , "clickable" )
ActionChains ( driver ) \
. click_and_hold ( clickable ) \
. key_down ( Keys . SHIFT ) \
. key_down ( "a" ) \
. perform ()
ActionBuilder ( driver ) . clear_actions ()
ActionChains ( driver ) . key_down ( 'a' ) . perform ()
assert clickable . get_attribute ( 'value' )[ 0 ] == "A"
assert clickable . get_attribute ( 'value' )[ 1 ] == "a"
(( WebDriver ) driver ). ResetInputState (); /examples/dotnet/SeleniumDocs/ActionsAPI/ActionsTest.cs
Copy
Close
using System ;
using Microsoft.VisualStudio.TestTools.UnitTesting ;
using OpenQA.Selenium ;
using OpenQA.Selenium.Interactions ;
namespace SeleniumDocs.ActionsAPI
{
[TestClass]
public class ActionsTest : BaseChromeTest
{
[TestMethod]
public void Pause ()
{
driver . Url = "https://selenium.dev/selenium/web/mouse_interaction.html" ;
DateTime start = DateTime . Now ;
IWebElement clickable = driver . FindElement ( By . Id ( "clickable" ));
new Actions ( driver )
. MoveToElement ( clickable )
. Pause ( TimeSpan . FromSeconds ( 1 ))
. ClickAndHold ()
. Pause ( TimeSpan . FromSeconds ( 1 ))
. SendKeys ( "abc" )
. Perform ();
TimeSpan duration = DateTime . Now - start ;
Assert . IsTrue ( duration > TimeSpan . FromSeconds ( 2 ));
Assert . IsTrue ( duration < TimeSpan . FromSeconds ( 3 ));
}
[TestMethod]
public void ReleaseAll ()
{
driver . Url = "https://selenium.dev/selenium/web/mouse_interaction.html" ;
IWebElement clickable = driver . FindElement ( By . Id ( "clickable" ));
var actions = new Actions ( driver );
actions . ClickAndHold ( clickable )
. KeyDown ( Keys . Shift )
. SendKeys ( "a" )
. Perform ();
(( WebDriver ) driver ). ResetInputState ();
actions . SendKeys ( "a" ). Perform ();
var value = clickable . GetAttribute ( "value" );
Assert . AreEqual ( "A" , value [.. 1 ]);
Assert . AreEqual ( "a" , value . Substring ( 1 , 1 ));
}
}
} driver . action . release_actions /examples/ruby/spec/actions_api/actions_spec.rb
Copy
Close
# frozen_string_literal: true
require 'spec_helper'
RSpec . describe 'Actions' do
let ( :driver ) { start_session }
it 'pauses' do
driver . get 'https://www.selenium.dev/selenium/web/mouse_interaction.html'
start = Time . now
clickable = driver . find_element ( id : 'clickable' )
driver . action
. move_to ( clickable )
. pause ( duration : 1 )
. click_and_hold
. pause ( duration : 1 )
. send_keys ( 'abc' )
. perform
duration = Time . now - start
expect ( duration ) . to be > 2
expect ( duration ) . to be < 3
end
it 'releases all' do
driver . get 'https://www.selenium.dev/selenium/web/mouse_interaction.html'
clickable = driver . find_element ( id : 'clickable' )
action = driver . action
. click_and_hold ( clickable )
. key_down ( :shift )
. key_down ( 'a' )
action . perform
driver . action . release_actions
action . key_down ( 'a' ) . perform
expect ( clickable . attribute ( 'value' ) [ 0 ] ) . to eq 'A'
expect ( clickable . attribute ( 'value' ) [- 1 ] ) . to eq 'a'
end
end
await driver . actions (). clear ()
/examples/javascript/test/actionsApi/actionsTest.spec.js
Copy
Close
const { By , Key , Browser , Builder } = require ( 'selenium-webdriver' )
const assert = require ( 'assert' )
describe ( 'Actions API - Pause and Release All Actions' , function () {
let driver
before ( async function () {
driver = await new Builder (). forBrowser ( 'chrome' ). build ();
})
after ( async () => await driver . quit ())
it ( 'Pause' , async function () {
await driver . get ( 'https://selenium.dev/selenium/web/mouse_interaction.html' )
const start = Date . now ()
const clickable = await driver . findElement ( By . id ( 'clickable' ))
await driver . actions ()
. move ({ origin : clickable })
. pause ( 1000 )
. press ()
. pause ( 1000 )
. sendKeys ( 'abc' )
. perform ()
const end = Date . now () - start
assert . ok ( end > 2000 )
assert . ok ( end < 4000 )
})
it ( 'Clear' , async function () {
await driver . get ( 'https://selenium.dev/selenium/web/mouse_interaction.html' )
const clickable = driver . findElement ( By . id ( 'clickable' ))
await driver . actions ()
. click ( clickable )
. keyDown ( Key . SHIFT )
. sendKeys ( 'a' )
. perform ()
await driver . actions (). clear ()
await driver . actions (). sendKeys ( 'a' ). perform ()
const value = await clickable . getAttribute ( 'value' )
assert . deepStrictEqual ( 'A' , value . substring ( 0 , 1 ))
assert . deepStrictEqual ( 'a' , value . substring ( 1 , 2 ))
})
})
/examples/kotlin/src/test/kotlin/dev/selenium/actions_api/ActionsTest.kt
Copy
Close
package dev.selenium.actions_api
import dev.selenium.BaseTest
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.openqa.selenium.By
import org.openqa.selenium.Keys
import org.openqa.selenium.interactions.Actions
import org.openqa.selenium.remote.RemoteWebDriver
import java.time.Duration
class ActionsTest : BaseTest () {
@Test
fun pause () {
driver . get ( "https://www.selenium.dev/selenium/web/mouse_interaction.html" )
val start = System . currentTimeMillis ()
val clickable = driver . findElement ( By . id ( "clickable" ))
Actions ( driver )
. moveToElement ( clickable )
. pause ( Duration . ofSeconds ( 1 ))
. clickAndHold ()
. pause ( Duration . ofSeconds ( 1 ))
. sendKeys ( "abc" )
. perform ()
val duration = System . currentTimeMillis () - start
Assertions . assertTrue ( duration > 2000 )
Assertions . assertTrue ( duration < 4000 )
}
@Test
fun releasesAll () {
driver . get ( "https://www.selenium.dev/selenium/web/mouse_interaction.html" )
val clickable = driver . findElement ( By . id ( "clickable" ))
val actions = Actions ( driver )
actions . clickAndHold ( clickable )
. keyDown ( Keys . SHIFT )
. sendKeys ( "a" )
. perform ()
( driver as RemoteWebDriver ). resetInputState ()
actions . sendKeys ( "a" ). perform ()
Assertions . assertEquals ( "A" , clickable . getAttribute ( "value" ) !! . get ( 0 ). toString ())
Assertions . assertEquals ( "a" , clickable . getAttribute ( "value" ) !! . get ( 1 ). toString ())
}
}