Selenium 简明教程

Selenium WebDriver - Action Class

Selenium Webdriver 可用于执行键盘和鼠标操作。这包括拖放、单击、双击、右键单击、配合控制键使用、其他按键操作等操作。所有这些操作都是使用指定的用户交换 API(在 Selenium Webdriver 中称为 Actions 类)执行的。

Action Class Methods

Actions 类中提供的一些方法列在下面 −

  1. click() − 此方法用于在鼠标的当前位置执行单击操作。

  2. build() − 此方法用于创建动作组合,其中包含要执行的所有动作。

  3. perform() − 此方法用于在不首先调用 build() 的情况下执行动作。

  4. release() − 此方法用于在鼠标的当前位置释放鼠标操作。

  5. release(WebElement e) − 此方法用于在作为参数传递的 webElement e 的中间位置释放鼠标操作。

  6. doubleClick(WebElement e) − 此方法用于在作为参数传递的 webElement e 的中间位置执行双击操作。

  7. click(WebElement e) − 此方法用于在作为参数传递的 webElement e 的中间位置执行单击操作。

  8. doubleClick() − 此方法用于在鼠标的当前位置执行双击操作。

  9. contextClick() − 此方法用于在鼠标的当前位置执行右键单击操作。

  10. contextClick(WebElement e) − 此方法用于在作为参数传递的 webElement e 的中间位置执行右键单击操作。

  11. moveToElement(WebElement e) − 此方法用于将鼠标移动到作为参数传递的 webElement e 的中间。

  12. moveToElement(WebElement e, int x-offset, int y-offset) − 此方法用于将鼠标移动到视点中元素的偏移量。webElement e、x 和 y 偏移值作为参数传递。

  13. clickAndHold() − 此方法用于在鼠标的当前位置执行单击(不释放)。

  14. clickAndHold(WebElement e) − 此方法用于在作为参数传递的 webElement e 的中间执行单击(不释放)。

  15. keyDown(CharSequence key) − 此方法用于执行修饰符键按下,作为参数传递。

  16. keyDown(WebElement e, CharSequence key) − 此方法用于在聚焦元素后执行修饰符键按下。webElement e 和要按下的键作为参数传递。

  17. keyUp(CharSequence key) − 此方法用于执行修饰符键释放,作为参数传递。

  18. keyUp(WebElement e, CharSequence key) − 此方法用于在聚焦元素后执行修饰符键释放。webElement e 和要释放的键作为参数传递。

  19. sendKeys(CharSequence key) − 此方法用于向焦点元素发送键。要发送的键作为参数传递。

  20. 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 MeDouble Click Me 按钮,来执行单击、右键单击和双击。

selenium action class 1

分别执行 Click Me, Right Click MeDouble Click Me 按钮后,我们将在页面上分别收到消息 You have a dynamic clickYou have double clicked

selenium action class 2

代码实现

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 clickText after double click: You have Double clicked

最后,收到了消息 Process finished with exit code 0 ,表示代码成功执行。

Example 2 - Mouse Hover

让我们来看另一个示例,最初菜单 Navbar 是黑色的。

selenium action class 3

但是,悬停并按住它后,菜单 Navbar 会从黑色变为绿色,如下图所示。

selenium action class 4

代码实现

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();
   }
}

Output

rgba code for color element: rgba(51, 51, 51, 1)
rgba code for color for element after click and hold: rgba(64, 169, 68, 1)

Process finished with exit code 0

Example 3 - Drag and Drop

让我们看上面这个页面的示例,我们将把包含文本的源框 - Drag me to my target 拖到包含文本的目的地框 - Drop here

selenium action class 5

一旦整个操作完成,我们将在网页上看到文本 - Dropped! ,如下面的图像所示。

selenium action class 6

代码实现

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();
   }
}

Output

Text is after dragging: Dropped!

Process finished with exit code 0

在上一个示例中,我们首次从源位置执行拖放操作到目标定位器,并且还在控制台中接收到了如下消息—— Text is : Dropped! (在完成此应用程序中的拖放操作后接收)

最后,收到了消息 Process finished with exit code 0 ,表示代码成功执行。

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();
   }
}

Output

Text entered: SELENIUM

Process finished with exit code 0

在上一个示例中,我们在输入框中输入文本 selenium 的同时按下了 SHIFT 键,从而获得在大写字母格式的输入文本并在控制台中显示如下消息—— Text entered: SELENIUM

最后,收到了消息 Process finished with exit code 0 ,表示代码成功执行。

Conclusion

这总结了我们对 Selenium Webdriver 操作类的教程的全面讲解。我们从描述操作类开始,讲解了操作类的各种方法以及演示如何执行单击、右键单击、双击、鼠标悬停、拖放和按键操作的示例以及 Selenium。这让你具备对操作类的深入了解。明智的做法是不断练习你学到的知识,并探索其他与 Selenium 相关的知识,以加深你的理解并拓展你的视野。