Selenium 简明教程
Selenium WebDriver - Action Class
Selenium Webdriver 可用于执行键盘和鼠标操作。这包括拖放、单击、双击、右键单击、配合控制键使用、其他按键操作等操作。所有这些操作都是使用指定的用户交换 API(在 Selenium Webdriver 中称为 Actions 类)执行的。
Action Class Methods
Actions 类中提供的一些方法列在下面 −
-
click() − 此方法用于在鼠标的当前位置执行单击操作。
-
build() − 此方法用于创建动作组合,其中包含要执行的所有动作。
-
perform() − 此方法用于在不首先调用 build() 的情况下执行动作。
-
release() − 此方法用于在鼠标的当前位置释放鼠标操作。
-
release(WebElement e) − 此方法用于在作为参数传递的 webElement e 的中间位置释放鼠标操作。
-
doubleClick(WebElement e) − 此方法用于在作为参数传递的 webElement e 的中间位置执行双击操作。
-
click(WebElement e) − 此方法用于在作为参数传递的 webElement e 的中间位置执行单击操作。
-
doubleClick() − 此方法用于在鼠标的当前位置执行双击操作。
-
contextClick() − 此方法用于在鼠标的当前位置执行右键单击操作。
-
contextClick(WebElement e) − 此方法用于在作为参数传递的 webElement e 的中间位置执行右键单击操作。
-
moveToElement(WebElement e) − 此方法用于将鼠标移动到作为参数传递的 webElement e 的中间。
-
moveToElement(WebElement e, int x-offset, int y-offset) − 此方法用于将鼠标移动到视点中元素的偏移量。webElement e、x 和 y 偏移值作为参数传递。
-
clickAndHold() − 此方法用于在鼠标的当前位置执行单击(不释放)。
-
clickAndHold(WebElement e) − 此方法用于在作为参数传递的 webElement e 的中间执行单击(不释放)。
-
keyDown(CharSequence key) − 此方法用于执行修饰符键按下,作为参数传递。
-
keyDown(WebElement e, CharSequence key) − 此方法用于在聚焦元素后执行修饰符键按下。webElement e 和要按下的键作为参数传递。
-
keyUp(CharSequence key) − 此方法用于执行修饰符键释放,作为参数传递。
-
keyUp(WebElement e, CharSequence key) − 此方法用于在聚焦元素后执行修饰符键释放。webElement e 和要释放的键作为参数传递。
-
sendKeys(CharSequence key) − 此方法用于向焦点元素发送键。要发送的键作为参数传递。
-
sendKeys(WebElement e, CharSequence key) − 此方法用于向作为参数传递的 webElement 发送键。
请注意,在使用 Actions 类的这些方法时,我们需要添加导入语句——
import org.openqa.selenium.interactions.Actions in our tests.
Example 1 - Click, Right & Double Clicks
让我们看下面这个页面的示例,我们通过分别单击网页上的 Click Me, Right Click Me 和 Double Click Me 按钮,来执行单击、右键单击和双击。
分别执行 Click Me, Right Click Me 和 Double Click Me 按钮后,我们将在页面上分别收到消息 You have a dynamic click 和 You have double clicked 。
代码实现
package org.example;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import java.util.concurrent.TimeUnit;
public class ActionsMouse {
public static void main(String[] args) throws InterruptedException {
// Initiate the Webdriver
WebDriver driver = new ChromeDriver();
// adding implicit wait of 15 secs
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
// Opening the webpage
driver.get("https://www.tutorialspoint.com/selenium/practice/buttons.php");
// identify element with xpath for click
WebElement m = driver.findElement
(By.xpath("/html/body/main/div/div/div[2]/button[1]"));
// object of Actions class to move then click
Actions a = new Actions(driver);
a.moveToElement(m).click().build().perform();
// get text after click
WebElement t = driver.findElement(By.xpath("//*[@id='welcomeDiv']"));
System.out.println("Text after click: " + t.getText());
// identify element with xpath for double click
WebElement n = driver.findElement
(By.xpath("/html/body/main/div/div/div[2]/button[3]"));
// double click
a.moveToElement(n).doubleClick().build().perform();
// get text after double click
WebElement x = driver.findElement(By.xpath("//*[@id='doublec']"));
System.out.println("Text after double click: " + x.getText());
// identify element with xpath for right click
WebElement y = driver.findElement
(By.xpath("/html/body/main/div/div/div[2]/button[2]"));
// right click
a.moveToElement(y).contextClick().build().perform();
// Closing browser
driver.quit();
}
}
Output
Text after click: You have done a dynamic click
Text after double click: You have Double clicked
Process finished with exit code 0
在上面的示例中,我们执行了单击、双击和右键单击,然后在控制台中收到了消息 - Text after click: You have done a dynamic click 和 Text after double click: You have Double clicked 。
最后,收到了消息 Process finished with exit code 0 ,表示代码成功执行。
Example 2 - Mouse Hover
让我们来看另一个示例,最初菜单 Navbar 是黑色的。
但是,悬停并按住它后,菜单 Navbar 会从黑色变为绿色,如下图所示。
代码实现
package org.example;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import java.util.concurrent.TimeUnit;
public class ActionsClickandHold {
public static void main(String[] args) throws InterruptedException {
// Initiate the Webdriver
WebDriver driver = new ChromeDriver();
// adding implicit wait of 15 secs
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
// Opening the webpage
driver.get("https://www.tutorialspoint.com/selenium/practice/menu.php#");
// identify element with xpath for click and hold
WebElement m = driver.findElement
(By.xpath("/html/body/main/div/div/div[2]/nav/div/a"));
// get element color in rgba format
String s = m.getCssValue("color");
System.out.println("rgba code for color element: " + s );
// object of Actions class to click and hold
Actions a = new Actions(driver);
a.clickAndHold(m).build().perform();
// get element color in rgba format
String c = m.getCssValue("color");
System.out.println("rgba code for color for element after click and hold: " + c);
// Closing browser
driver.quit();
}
}
Example 3 - Drag and Drop
让我们看上面这个页面的示例,我们将把包含文本的源框 - Drag me to my target 拖到包含文本的目的地框 - Drop here 。
一旦整个操作完成,我们将在网页上看到文本 - Dropped! ,如下面的图像所示。
代码实现
package org.example;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import java.util.concurrent.TimeUnit;
public class DragAndDrp {
public static void main(String[] args) throws InterruptedException {
// Initiate the Webdriver
WebDriver driver = new ChromeDriver();
// adding implicit wait of 15 secs
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
// URL launch for accessing drag and drop elements
driver.get("https://www.tutorialspoint.com/selenium/practice/droppable.php");
// identify source and target elements for drag and drop
WebElement sourceElement= driver.findElement(By.id("draggable"));
WebElement targetElement= driver.findElement(By.id("droppable"));
// drag and drop operations without build and perform methods
Actions a = new Actions(driver);
a.dragAndDrop(sourceElement, targetElement).build().perform();
// identify text after element is dropped
WebElement text = driver.findElement(By.xpath("//*[@id='droppable']/p"));
System.out.println("Text is : " + text.getText());
// quitting browser after drag and drop operations completed
driver.quit();
}
}
Example 4 - Key Operation
让我们看另一个示例,我们在输入框中使用操作类中的按键抬起/按键按下方法来输入大写字母 SELENIUM 。请注意,在将值发送到 sendKeys() 方法时,我们会在按下 SHIFT 键的同时传递 selenium 。因此,我们在输入框中输入的输出为 SELENIUM 。
package org.example;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import java.util.concurrent.TimeUnit;
public class KeyAction {
public static void main(String[] args) throws InterruptedException {
// Initiate the Webdriver
WebDriver driver = new ChromeDriver();
// adding implicit wait of 15 secs
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
// Opening the webpage where we will identify an element
driver.get("https://www.tutorialspoint.com/selenium/practice/text-box.php");
// Identify the first input box with xpath locator
WebElement e = driver.findElement(By.xpath("//*[@id='fullname']"));
// Actions class
Actions a = new Actions(driver);
// moving to an input box and clicking on it
a.moveToElement(e).click();
// key UP and DOWN action for SHIFT
a.keyDown(Keys.SHIFT);
a.sendKeys("Selenium").keyUp(Keys.SHIFT).build().perform();
// get value entered
System.out.println("Text entered: " + e.getAttribute("value"));
// Closing browser
driver.quit();
}
}