Selenium中ActionChains方法详细讲解

发表于:2023-11-02 09:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:檬柠wan    来源:CSDN

  前言
  本文将介绍Selenium中的ActionChains类及其使用方法,帮助您模拟用户在网页上的鼠标和键盘操作。了解ActionChains的常用方法和示例代码,可轻松实现移动鼠标、点击元素、拖拽元素等操作。通过本文的学习,您能更好地应用ActionChains解决自动化测试或网页爬取中的问题。
  演示html文件
  <!DOCTYPE html>
  <html>
  <head>
    <title>操作HTML示例</title>
    <script>
      function clickButton() {
        var button = document.getElementById("clickButton");
        button.click();
      }
      function doubleClickButton() {
        var button = document.getElementById("doubleClickButton");
        var event = new MouseEvent('dblclick', { bubbles: true, cancelable: true });
        button.dispatchEvent(event);
      }
      function initSlider() {
        var slider_1 = document.getElementById("slider_1");
        var isDragging = false;
        var offset = { x: 0, y: 0 };
        slider_1.addEventListener("mousedown", startDrag);
        slider_1.addEventListener("mouseup", stopDrag);
        slider_1.addEventListener("mousemove", drag);
        slider_1.addEventListener("mouseleave", stopDrag);
        function startDrag(e) {
          isDragging = true;
          offset.x = e.clientX - slider_1.offsetLeft;
          offset.y = e.clientY - slider_1.offsetTop;
        }
        function stopDrag() {
          isDragging = false;
        }
        function drag(e) {
          if (isDragging) {
            var newX = e.clientX - offset.x;
            var newY = e.clientY - offset.y;
            slider_1.style.left = newX + "px";
            slider_1.style.top = newY + "px";
          }
        }
      }
  function handleKeyUp(event) {
        if (event.keyCode === 119) {
          // F8键的keycode为119
          alert("释放了F8键");
      }
    }
    </script>
  </head>
  <body>
    <h1>操作HTML示例</h1>
    <button id="clickButton" onclick="alert('单击按钮')">单击按钮</button>
    <button id="doubleClickButton" ondblclick="alert('双击按钮')">双击按钮</button>
    <div>
      <input id="slider" type="range" min="0" max="100" step="1" value="50" style="width: 200px;">
      <input id="slider_2" type="range" min="0" max="100" step="1" value="50"
        style="height: 200px; transform: rotate(270deg);">
    </div>
    <div id="box" style="width: 230px; height: 200px; background-color: lightblue; position: relative;">
      <div id="slider_1"
        style="width: 30px; height: 30px; background-color: red; position: absolute; top: 80px; left: 100px; cursor: move;">
      </div>
    </div>
    <script>
     window.addEventListener("load", initSlider);
     window.addEventListener("keyup", handleKeyUp);
    </script>
  </body>
  </html>
  一、使用方法
  1、方法说明
  2、左键单击当前鼠标位置
  from selenium import webdriver
  from selenium.webdriver.common.action_chains import ActionChains
  # 创建Chrome浏览器的WebDriver实例
  driver = webdriver.Chrome()
  # 最大化窗口
  driver.maximize_window()
  # 打开网页
  driver.get("file:///C:/Users/admin/Desktop/Demo.html")
  # 创建 actions 的 ActionChains 对象
  actions = ActionChains(driver)
  # 定位到需要点击的按钮
  click = driver.find_element_by_css_selector('[id="clickButton"]')
  # 将鼠标移动到按钮上
  actions.move_to_element(click)
  # 鼠标左键
  actions.click()
  # 执行操作(必须要有该方法,否则操作不会执行)
  actions.perform()
  # 简化代码
  click = driver.find_element_by_css_selector('[id="clickButton"]')
  ActionChains(driver).move_to_element(click).click().perform()
  3、双击当前鼠标位置
  from selenium import webdriver
  from selenium.webdriver.common.action_chains import ActionChains
  # 创建Chrome浏览器的WebDriver实例
  driver = webdriver.Chrome()
  # 最大化窗口
  driver.maximize_window()
  # 打开网页
  driver.get("file:///C:/Users/admin/Desktop/Demo.html")
  # 创建 actions 的 ActionChains 对象
  actions = ActionChains(driver)
  # 定位到需要点击的按钮
  click = driver.find_element_by_css_selector('[id="doubleClickButton"]')
  # 将鼠标移动到按钮上
  actions.move_to_element(click)
  # 鼠标双击
  actions.double_click()
  # 执行操作(必须要有该方法,否则操作不会执行)
  actions.perform()
  4、鼠标拖拽元素移动
  场景一
  from selenium import webdriver
  from selenium.webdriver.common.action_chains import ActionChains
  # 创建Chrome浏览器的WebDriver实例
  driver = webdriver.Chrome()
  # 最大化窗口
  driver.maximize_window()
  # 打开网页
  driver.get("file:///C:/Users/admin/Desktop/Demo.html")
  # 创建 actions 的 ActionChains 对象
  actions = ActionChains(driver)
  # 定位到需要拖拽的滑块元素
  slider = driver.find_element_by_css_selector('[id="slider_1"]')
  # 将鼠标移动到滑块上
  actions.move_to_element(slider)
  # 执行鼠标左键点击并按住不放
  actions.click_and_hold()
  # 设置每次移动的偏移量
  offset = 7
  # 模拟滑块的连续移动
  for i in range(10):
      # 向右移动 offset 像素
      actions.move_by_offset(offset, 0)
      actions.pause(0.1)  # 添加暂停时间以控制移动速度
  # 向左移动 offset 像素
  for i in range(10):
      actions.move_by_offset(-offset, 0)
      actions.pause(0.1)
  # 向下移动 offset 像素
  for i in range(10):
      actions.move_by_offset(0, offset)
      actions.pause(0.1)
  # 向上移动 offset 像素
  for i in range(10):
      actions.move_by_offset(0, -offset)
      actions.pause(0.1)
  # 释放鼠标左键
  actions.release()
  # 执行操作
  actions.perform()
  场景二
  from selenium import webdriver
  from selenium.webdriver.common.action_chains import ActionChains
  # 创建Chrome浏览器的WebDriver实例
  driver = webdriver.Chrome()
  # 最大化窗口
  driver.maximize_window()
  # 打开网页
  driver.get("file:///C:/Users/admin/Desktop/Demo.html")
  # 创建 actions 的 ActionChains 对象
  actions = ActionChains(driver)
  # 定位到需要拖拽的滑块元素
  slider = driver.find_element_by_css_selector('[id="slider"]')
  # 滑动到指定位置
  actions.drag_and_drop_by_offset(slider, 80, 0)
  # 定位到需要拖拽的滑块元素
  slider_2 = driver.find_element_by_css_selector('[id="slider_2"]')
  # 将鼠标移动到滑块上
  actions.move_to_element(slider_2)
  # 执行鼠标左键点击并按住不放
  actions.click_and_hold()
  # 滑动到指定位置
  actions.move_by_offset(0, 50)
  # 释放鼠标左键
  actions.release()
  # 执行操作
  actions.perform()
  5、模拟键盘按键
  from selenium import webdriver
  from selenium.webdriver.common.action_chains import ActionChains
  from selenium.webdriver.common.keys import Keys
  # 创建Chrome浏览器的WebDriver实例
  driver = webdriver.Chrome()
  # 最大化窗口
  driver.maximize_window()
  # 打开网页
  driver.get("file:///C:/Users/admin/Desktop/Demo.html")
  # 创建 actions 的 ActionChains 对象
  actions = ActionChains(driver)
  # 定位到需要拖拽的滑块元素
  slider = driver.find_element_by_css_selector('[id="slider"]')
  # 模拟按下右键,滑块移动. 键盘键码自行百度
  actions.key_down(Keys.ARROW_RIGHT, slider)
  # 模拟按下F8键
  actions.key_down(Keys.F8)
  # 模拟释放F8键
  actions.key_up(Keys.F8)
  # 执行操作
  actions.perform()
  6、下拉列表滚动
  示例HTML文件:
  <!DOCTYPE html>
  <html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>选择框</title>
      <style>
          /* 样式可根据需要自行修改 */
          .select-box {
              position: relative;
              display: inline-block;
              width: 150px;
              height: 30px;
              border: 1px solid #aaa;
          }
          .select-box:hover {
              cursor: pointer;
          }
          .select-box > .selected-item {
              display: block;
              width: 100%;
              height: 100%;
              line-height: 30px;
              padding: 0 10px;
          }
          .select-box > .options {
              position: absolute;
              top: 100%;
              left: 0;
              z-index: 99;
              display: none;
              width: 100%;
              max-height: 200px;
              overflow-y: auto;
              border: 1px solid #aaa;
              background-color: #fff;
          }
          .select-box > .options > div {
              width: 100%;
              height: 30px;
              line-height: 30px;
              padding: 0 10px;
          }
          .select-box > .options > div:hover {
              background-color: #ccc;
              cursor: pointer;
          }
      </style>
  </head>
  <body>
      <div class="select-box">
          <div class="selected-item">请选择</div>
          <div class="options">
              <div>选项1</div>
              <div>选项2</div>
              <div>选项3</div>
              <div>选项4</div>
              <div>选项5</div>
              <div>选项6</div>
              <div>选项7</div>
  <div>选项8</div>
  <div>选项9</div>
  <div>选项10</div>
  <div>选项11</div>
  <div>选项12</div>
  <div>选项13</div>
  <div>选项14</div>
  <div>选项15</div>
  <div>选项16</div>
  <div>选项17</div>
  <div id="test">选项18</div>
              <!-- 这里添加更多的选项 -->
          </div>
      </div>
      <script>
  var selectBox = document.querySelector('.select-box');
  var selectedItem = selectBox.querySelector('.selected-item');
  var options = selectBox.querySelector('.options');
  // 点击选择框时,切换选项列表的显示/隐藏状态
  selectBox.addEventListener('click', function() {
  if (options.style.display === 'none' || options.style.display === '') {
  options.style.display = 'block';
  } else {
  options.style.display = 'none';
  }
  });
  // 点击选项时,将选项值赋值到选择框上方的文本框中,并隐藏选项列表
  options.addEventListener('click', function(e) {
  if (e.target.tagName.toLowerCase() === 'div') {
  selectedItem.innerHTML = e.target.innerHTML;
  // options.style.display = 'none';
  }
  });
      </script>
  </body>
  </html>
  滚动方法:
  from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.common.action_chains import ActionChains
  from selenium.webdriver.common.keys import Keys
  from time import sleep
  # 创建Chrome浏览器的WebDriver实例
  driver = webdriver.Chrome()
  # 最大化窗口
  driver.maximize_window()
  # 打开网页
  driver.get("file:///C:/Users/admin/Desktop/Demo.html")
  # 点击展开下拉列表
  driver.find_element(By.CSS_SELECTOR, '.selected-item').click()
  # 定位到需要进行滚动的元素
  element = driver.find_element(By.CSS_SELECTOR, '.options')
  # 使用鼠标拖拽方式向下滚动10个像素,执行下面的滚动方式时,必须包含这个。
  ActionChains(driver).move_to_element(element).click_and_hold().move_by_offset(0, 10).perform()
  # 如以上方法使用有问题,就使用该方法
  # ActionChains(driver).move_to_element(element).click_and_hold().move_by_offset(0, 10).release().perform()
  sleep(3)
  # 使用键盘按键方式滚动到页面底部
  ActionChains(driver).move_to_element(element).send_keys(Keys.END).perform()
  sleep(3)
  # 使用键盘按键方式滚动到页面顶部
  ActionChains(driver).move_to_element(element).send_keys(Keys.HOME).perform()
  sleep(3)
  # 使用键盘按键方式向下翻一页
  ActionChains(driver).move_to_element(element).send_keys(Keys.PAGE_DOWN).perform()
  sleep(3)
  # 使用键盘按键方式向上翻一页
  ActionChains(driver).move_to_element(element).send_keys(Keys.PAGE_UP).perform()
  sleep(3)
  # 关闭浏览器
  driver.quit()
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号