51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 541|回复: 0
打印 上一主题 下一主题

Actionchains在selenium中的使用方法

[复制链接]
  • TA的每日心情
    无聊
    昨天 09:20
  • 签到天数: 937 天

    连续签到: 4 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-1-31 10:27:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    今天分享一下selenium最常用的ActionChains的使用,以及碰到的一些问题的解决。
      1.selenium解决鼠标悬停的问题
      今天抓取某个平台的数据时发现有的数据需要鼠标悬停在上面才能加载出来,于是就想到了使用ActionChains解决悬停的问题,下面是思路和举例:
      首先需要定位到需要悬停的元素位置,然后使用ActionChains悬停,我这里使用的是xpath定位,有些网站可能会出现xpath定位不准的的情况,这个时候就需要切换使用css定位,定位到了以后就使用ActionChains中的move_to_element方法实现鼠标的移动,最后加上perform执行所有的操作,下面是使用方法:
    1.  menu = self.wait.until(EC.presence_of_element_located((By.XPATH, ''xpath语法)) # 定位鼠标要悬停的元素
    2.   mouse = ActionChains(self.driver)
    3.   mouse.move_to_element(menu).perform()
    复制代码


     2.selenium解决滑块拖动的问题
      之前的文章中也提到过,使用selenium拖动滑块,这里需要注意的是滑块的拖动如果太快可能就会失败,所以咋拖动之前最好模拟生成一下滑块的轨迹,然后再去拖动,这里举个实例:
    1. def get_list_x(self):
    2.       """
    3.       的到滑块轨迹
    4.       :param distance:
    5.       :param t:
    6.       :return:
    7.       """
    8.       times = [1, 1.1, 1.3, 1.4, 1.7, 1.5, 1.8, 0.9, 1.6]
    9.       t = random.choice(times)
    10.       track = []
    11.       current = 0
    12.       mid = 258 * t / (t + 1)
    13.       v = 0
    14.       while current < 258:
    15.           if current < mid:
    16.               a = 3
    17.           else:
    18.               a = -1
    19.           v0 = v
    20.           v = v0 + a * t
    21.           move = v0 * t + 1 / 2 * a * t * t
    22.           current += move
    23.           track.append(round(move))
    24.       return track
    25.   def check_block(self, data, listx):
    26.       """
    27.       检测滑块
    28.       :return:
    29.       """
    30.       try:
    31.           while '亲,请拖动下方滑块完成验证' in data:
    32.               action = ActionChains(self.driver)
    33.               hk_button = self.driver.find_element(By.XPATH, '//*[@id="nc_1_n1z"]')
    34.               for x in listx:
    35.                   action.click_and_hold(hk_button)
    36.                   action.move_by_offset(xoffset=x, yoffset=random.randint(0, 2))
    37.                   action.perform()
    38.                   action.release()
    39.               time.sleep(1)
    40.               self.driver.refresh()
    41.               time.sleep(1)
    42.       except:
    43.           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。



    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-26 04:53 , Processed in 0.058440 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表