Actionchains在selenium中的使用方法

今天分享一下selenium最常用的ActionChains的使用,以及碰到的一些问题的解决。

1.selenium解决鼠标悬停的问题

今天抓取某个平台的数据时发现有的数据需要鼠标悬停在上面才能加载出来,于是就想到了使用ActionChains解决悬停的问题,下面是思路和举例:

首先需要定位到需要悬停的元素位置,然后使用ActionChains悬停,我这里使用的是xpath定位,有些网站可能会出现xpath定位不准的的情况,这个时候就需要切换使用css定位,定位到了以后就使用ActionChains中的move_to_element方法实现鼠标的移动,最后加上perform执行所有的操作,下面是使用方法:

 menu = self.wait.until(EC.presence_of_element_located((By.XPATH, ''xpath语法)) # 定位鼠标要悬停的元素
  mouse = ActionChains(self.driver)
  mouse.move_to_element(menu).perform()

2.selenium解决滑块拖动的问题
 

之前的文章中也提到过,使用selenium拖动滑块,这里需要注意的是滑块的拖动如果太快可能就会失败,所以咋拖动之前最好模拟生成一下滑块的轨迹,然后再去拖动,这里举个实例:

def get_list_x(self):
      """
      的到滑块轨迹
      :param distance:
      :param t:
      :return:
      """
      times = [1, 1.1, 1.3, 1.4, 1.7, 1.5, 1.8, 0.9, 1.6]
      t = random.choice(times)
      track = []
      current = 0
      mid = 258 * t / (t + 1)
      v = 0
      while current < 258:
          if current < mid:
              a = 3
          else:
              a = -1
          v0 = v
          v = v0 + a * t
          move = v0 * t + 1 / 2 * a * t * t
          current += move
          track.append(round(move))
      return track
  def check_block(self, data, listx):
      """
      检测滑块
      :return:
      """
      try:
          while '亲,请拖动下方滑块完成验证' in data:
              action = ActionChains(self.driver)
              hk_button = self.driver.find_element(By.XPATH, '//*[@id="nc_1_n1z"]')
              for x in listx:
                  action.click_and_hold(hk_button)
                  action.move_by_offset(xoffset=x, yoffset=random.randint(0, 2))
                  action.perform()
                  action.release()
              time.sleep(1)
              self.driver.refresh()
              time.sleep(1)
      except:
          time.sleep(1)

这里我定义了两个函数,一个用于检测滑块,另外一个用于滑块的拖动,这里需要注意的是,在我之前的文章分享中我是使用的drag_and_drop_by_offset方法拖动,这里却是使用move_by_offset,这是因为move_by_offset能实现连续的拖动,但是drag_and_drop_by_offset却只能实现拖动到指定的位置后松开,这就很容易会被检测出来是爬虫。

3.selenium中ActionChains的详细使用方法

·click(on_element=None) ——单击鼠标左键

· click_and_hold(on_element=None) ——点击鼠标左键,不松开

· context_click(on_element=None) ——点击鼠标右键

· double_click(on_element=None) ——双击鼠标左键

· drag_and_drop(source, target) ——拖拽到某个元素然后松开

· drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开

· key_down(value, element=None) ——按下某个键盘上的键

· key_up(value, element=None) ——松开某个键

· move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标

· move_to_element(to_element) ——鼠标移动到某个元素

· move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置

· perform() ——执行链中的所有动作

· release(on_element=None) ——在某个元素位置松开鼠标左键

· send_keys(keys_to_send) ——发送某个键到当前焦点的元素

· send_keys_to_element(element, keys_to_send) ——发送某个键到指定元素

4.使用selenium时遇到的问题

之前的文章里面有分享过可以去看看,无非是Chromedriver的版本问题以及定位的问题,定位的问题上面提到过了,xpath不行就换css定位,一般来说css定位的准确性还是很高的,另外selenium中也有其他的定位方法,例如根据Class和ID定位的,chromdriver的问题之前的文章里有提到怎么下载对应版本的Chromedriver。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

### 使用 Python 和 SeleniumActionChains 进行复杂操作 #### 鼠标拖放 通过 `drag_and_drop` 方法可以实现鼠标拖动某个元素并释放到另一个位置的操作。以下是具体代码示例: ```python from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get('https://example.com') source_element = driver.find_element('id', 'draggable-element') target_element = driver.find_element('id', 'droppable-area') actions = ActionChains(driver) actions.drag_and_drop(source_element, target_element).perform() # 执行拖放动作[^1] ``` 上述代码中,`drag_and_drop` 将源元素拖放到目标区域。 --- #### 鼠标悬停 当需要模拟鼠标悬停在一个特定的 HTML 元素上时,可使用 `move_to_element` 方法。以下是一个具体的例子: ```python menu_item = driver.find_element('css selector', '.dropdown-menu-item') actions = ActionChains(driver) actions.move_to_element(menu_item).perform() # 模拟鼠标悬停在菜单项上[^3] ``` 此代码片段展示了如何让光标停留在下拉菜单中的某一项上,从而触发隐藏子菜单显示的行为。 --- #### 右键单击 (Context Click) 为了模拟用户的右键点击行为,可以利用 `context_click` 方法来完成这一功能需求: ```python right_click_target = driver.find_element('xpath', '//div[@class="right-click-target"]') actions = ActionChains(driver) actions.context_click(right_click_target).perform() # 发起右键点击事件[^2] ``` 这段脚本会定位到指定的目标节点,并对其执行一次标准的右键点击操作。 --- #### 键盘组合输入 除了基本的鼠标控制外,还可以借助于 `send_keys` 来发送键盘指令或者快捷键命令给当前焦点所在的控件。比如复制选定文字可以用 Ctrl+C 表达如下所示: ```python element_to_copy = driver.find_element('name', 'input-field-name') actions.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform() # Select all text inside the input field. actions.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() # Copy selected text to clipboard.[^4] ``` 这里演示的是全选 (`Ctrl+A`) 加拷贝 (`Ctrl+C`) 功能的应用场景之一。 --- #### 复杂多步序列化任务处理 如果存在一系列连续性的交互步骤,则可以通过创建单独的动作实例逐一加入队列后再统一提交的方式来进行管理: ```python login_button = driver.find_element('id', 'login-btn') password_field = driver.find_element('id', 'pwd-input') actions.reset_actions() # 清除之前的任何未完成状态 actions.click(login_button)\ .pause(2)\ .send_keys(password_field, "SecurePassword!")\ .double_click(password_field).perform() # 登录按钮点击 -> 延迟两秒 -> 输入密码 -> 密码框双击激活[^4] ``` 以上案例包含了从登录界面开始的一整套流程设计思路。 --- ### 性能优化建议 对于频繁使用的页面对象模型(POM),考虑封装常用的功能模块减少重复编码量;另外适当引入显式等待机制提高稳定性的同时也兼顾效率问题[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值