selenium --高级控件交互方法

ActionChains解析

  • 实例化类ActionChains,参数为driver实例。
  • 中间可以有多个操作。
  • .perform()代表确定执行。

ActionChains(self.driver).操作.perform()

键盘事件

  • 按下(key_down)、释放(key_up)键盘键位
  • 结合send_keys回车(send_keys(Keys.ENTER))

使用场景和对应事件

  • 键盘事件: 使用shift实现大小写(Keys.SHIFT)

  • 键盘事件: 输入后回车(Keys.ENTER)

  • 键盘事件: 复制粘贴(Keys.CONTROL.sendkeys(“xvvv”.))

  • 鼠标事件: 双击(double_click(ele))

  • 鼠标事件: 拖动元素(drag_and_drop(ele))

  • 鼠标事件: 指定位置(例: 悬浮在下拉框的小三角位置处)(move_to_element(ele))

  • 鼠标事件: 滚轮/滚动操作-滚动到元素(scroll_to_element(ele)、scroll_by_amount(x,y))

键盘事件-使用shift实现大写

  • ActionChains(self.driver): 实例化ActionChains类
  • key_down(Keys.SHIFT, ele): 按下shift键实现大写
  • send_keys(“selenium”): 输入大写的selenium
  • perform(): 确认执行
        def test_shift(self):
            """
            # 键盘事件: 使用shift实现大小写

            1、访问 https://ceshiren.com/
            2、点击搜索按钮
            3、输入搜索的内容,输入的同时按着shift键
            :return:
            """
            self.driver.get("https://ceshiren.com/")
            self.driver.find_element(By.CSS_SELECTOR, "#search-button").click()
            # 目标元素即为输入框
            ele = self.driver.find_element(By.ID,"search-term")
            # key_down 代表按下某个键位, Keys.SHIFT表示按shift键, ele表示目标元素
            # sendkeys 表示输入内容
            # perform 表示执行此链式操作
            ActionChains(self.driver)\
                .key_down(Keys.SHIFT, ele)\
                .send_keys("selenium")\
                .perform()
            time.sleep(3)

键盘事件-输入后回车

  • 直接输入回车: 元素.send_keys(Keys.ENTER)
  • 使用ActionChains: key_down(Keys.ENTER)
        def test_enter_send_keys(self):
            """
            # 键盘事件: 输入后回车
            :return:
            """
            self.driver.get("https://www.sogou.com/")
            self.driver.find_element(By.ID, "query").send_keys("霍格沃茨开发")
        # 第一种回车方式: 定位元素.send_keys(Keys.ENTER)
        self.driver.find_element(By.ID, "query").send_keys(Keys.ENTER)
        time.sleep(3)

        # 第二种回车方式:使用ActiChains: key_down(Keys.ENTER)
        ActionChains(self.driver).key_down(Keys.ENTER).perform()
        time.sleep(3)

键盘事件-复制粘贴

  • 多系统兼容
    • mac 的复制按钮为 COMMAND
    • windows 的复制按钮为 CONTROL
  • 左箭头:Keys.ARROW_LEFT
  • 按下COMMAND或者CONTROL: key_down(cmd_ctrl)
  • 按下剪切与粘贴按钮: send_keys("xvvvvv")
    def test_copy_and_paste(self):
        """
        # 键盘事件: 复制粘贴
        1、访问 https://ceshiren.com/
        2、点击搜索按钮
        3、输入搜索的内容,同时按住ctrl键 + shift键 + 左方向键,实现选中光标左边的第一个字符
        4、按住 ctrl键 + c键,实现复制选中的内容, 按住v键,实现粘贴复制的内容
        :return:
        """
        self.driver.get("https://ceshiren.com/")
        self.driver.find_element(By.CSS_SELECTOR, "#search-button").click()
        # 目标元素即为输入框
        ele = self.driver.find_element(By.ID, "search-term")
        # 先根据操作系统的类型判断复制功能的键盘事件选哪种:mac(darwin)操作系统, 使用Keys.COMMAND; windos操作系统使用Keys.CONTROL
        command_control = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL
        # key_down 代表按下某个键位, Keys.SHIFT表示按shift键, ele表示目标元素
        # sendkeys 表示输入内容
        # Keys.ARROW_LEFT 表示按左方向键,出现几个Keys.ARROW_LEFT,表示光标向左移动几个键位
        # command_control 表示Keys.CONTROL, Ctrl键
        # send_keys("xvvv")  表示x键按一下,v键按三下(即表示剪切一次,粘贴三次)
        # key_up(command_control) 表示松开Ctrl键
        ActionChains(self.driver)\
            .key_down(Keys.SHIFT, ele)\
            .send_keys("selenium")\
            .key_down(Keys.ARROW_LEFT)\
            .key_down(Keys.ARROW_LEFT)\
            .key_down(command_control).send_keys("xvvv").key_up(command_control)\
            .perform()
        time.sleep(3)

鼠标事件

  • 双击
  • 拖动元素
  • 指定位置(悬浮)

鼠标事件-双击

  • double_click(元素对象): 双击元素
    def test_double_click(self):
        """
        # 鼠标事件: 双击
        1、访问 https://vip.ceshiren.com/#/ui_study/frame;
        2、定位到 “点击两次响应”的元素,并赋值给一个元素对象ele;
        3、通过ActionChains实现双击
        :return:
        """
        self.driver.get("https://vip.ceshiren.com/#/ui_study/frame")
        ele = self.driver.find_element(By.ID, "primary_btn")
        ActionChains(self.driver).double_click(ele).perform()
        time.sleep(3)

鼠标事件-拖动元素

  • drag_and_drop(起始元素对象, 结束元素对象): 拖动并放开元素
    def test_drag_and_drop(self):
        """
        # 鼠标事件: 拖动元素
        1、访问 https://vip.ceshiren.com/#/ui_study/action_chains;
        2、获取起始元素位置
        3、获取目标元素位置
        4、通过ActiChains实现拖拽操作
        :return:
        """
        self.driver.get("https://vip.ceshiren.com/#/ui_study/action_chains")
        start_ele = self.driver.find_element(By.ID, "item1")
        target_ele = self.driver.find_element(By.ID, "item3")
        ActionChains(self.driver).drag_and_drop(start_ele, target_ele).perform()
        time.sleep(3)

鼠标事件-悬浮

  • move_to_element(元素对象): 移动到某个元素
    def test_move_to_element(self):
        """
        # 鼠标事件: 把光标移动到指定位置(例: 悬浮在下拉框的小三角位置处)
        1、访问 https://vip.ceshiren.com/#/ui_study/action_chains2;
        2、定位到目标元素
        3、通过ActionChains实现将光标移动到指定位置的操作
        :return:
        """
        self.driver.get("https://vip.ceshiren.com/#/ui_study/action_chains2")
        ele = self.driver.find_element(By.CLASS_NAME, "menu")
        ActionChains(self.driver).move_to_element(ele).perform()
        time.sleep(3)
        self.driver.find_element(By.XPATH, "//*[contains(text(), '测开班')]").click()
        time.sleep(3)

滚轮/滚动操作-滚动到元素

  • 滚动到元素
  • scroll_to_element(WebElement对象):滚动到某个元素
  • 根据坐标滚动
  • 滚轮/滚动操作-根据坐标滚动
    scroll_by_amount(横坐标, 纵坐标)
  • 注意: selenium 版本需要在 4.2 之后
    def test_scroll_to_element(self):
        """
        # 鼠标事件: 滚轮/滚动操作-滚动到元素
        1、访问 https://ceshiren.com/;
        2、定位到目标元素
        3、通过ActionChains实现通过鼠标滚轮滚动到目标元素位置
        :return:
        """
        self.driver.get("https://ceshiren.com/")
        ele = self.driver.find_element(By.XPATH, "//*[@id='ember47']/td[1]/span/a")
        # 第一种方式:通过scroll_to_element(ele)实现
        ActionChains(self.driver).scroll_to_element(ele).perform()
        # 第二种方式:通过scroll_by_amount(ele)实现
        ActionChains(self.driver).scroll_by_amount(0, 3000).perform()
        time.sleep(10)