美文网首页
39. 鼠标操作

39. 鼠标操作

作者: 薛东弗斯 | 来源:发表于2024-03-18 06:05 被阅读0次
    selenium提供模拟鼠标操作的功能,常见的鼠标操作有:单击、右键点击、双击、移动鼠标、拖动鼠标
    selenium工具中全局鼠标操作语法如下:
    1. 初始化ActionChains类(动作链条): actions = ActionChains(driver)
    2. 找到要操作的元素: find_element
    3. 调用鼠标操作方法: actions.move_to_element(element)
    4. 执行鼠标操作方法: actions.perform()
    具体用法: ActionChains(driver).click(element).perform()
    
    image.png
    # 鼠标点击“百度一下,id=“su””
    import time
    
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.select import Select
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://www.baidu.com/")
    driver.find_element(By.ID, 'kw').send_keys("selenium")
    actions = ActionChains(driver)
    element = driver.find_element(By.ID, 'su')
    actions.click(element).perform()
    time.sleep(3)
    driver.close()
    
    image.png
    # 双击
    import time
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.select import Select
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://sahitest.com/demo/clicks.htm")
    actions = ActionChains(driver)
    element = driver.find_element(By.CSS_SELECTOR, 'body > form > input[type=button]:nth-child(8)')
    actions.double_click(element).perform()
    actions.double_click(element).perform()
    actions.double_click(element).perform()
    time.sleep(3)
    driver.close()
    
    image.png
    # 右键点击
    import time
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.select import Select
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://sahitest.com/demo/clicks.htm")
    actions = ActionChains(driver)
    element = driver.find_element(By.XPATH, '/html/body/form/input[4]')
    actions.context_click(element).perform()
    time.sleep(3)
    driver.close()
    
    image.png
    image.png
    # 悬浮
    import time
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.select import Select
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https:www.baidu.com")
    actions = ActionChains(driver)
    element = driver.find_element(By.CSS_SELECTOR, '#s-top-left > div > a')
    actions.move_to_element(element).perform()   # 悬浮
    driver.find_element(By.XPATH, '//*[@id="s-top-more"]/div[3]/a').click()
    time.sleep(3)
    driver.close()
    
    image.png
    image.png
    # 拖动
    import time
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.select import Select
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://sahitest.com/demo/dragDropMooTools.htm")
    actions = ActionChains(driver)
    element_start = driver.find_element(By.ID, 'dragger')
    element_end = driver.find_element(By.XPATH, '/html/body/div[5]')
    actions.drag_and_drop(element_start, element_end).perform()
    time.sleep(3)
    driver.close()
    
    image.png
    
    import time
    
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.select import Select
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://www.iviewui.com/view-ui-plus/component/form/slider")
    actions = ActionChains(driver)
    # 双击
    # element = driver.find_element(By.CSS_SELECTOR, 'body > form > input[type=button]:nth-child(8)')
    # actions.double_click(element).perform()
    # 右击
    # element = driver.find_element(By.XPATH, '/html/body/form/input[4]')
    # actions.context_click(element).perform()
    # 悬浮
    # element = driver.find_element(By.CSS_SELECTOR, '#s-top-left > div > a')
    # actions.move_to_element(element).perform()
    # driver.find_element(By.XPATH,'//*[@id="s-top-more"]/div[1]/a[3]').click()
    # 拖动
    # element_start = driver.find_element(By.ID, 'dragger')
    # element_end = driver.find_element(By.XPATH, '/html/body/div[5]')
    # actions.drag_and_drop(element_start, element_end).perform()
    # 根据坐标点拖动
    element = driver.find_element(By.XPATH, '//div[@class="ivu-slider-button"]')
    actions.drag_and_drop_by_offset(element, 250, 0).perform()
    
    time.sleep(3)
    driver.close()
    
    
    import time
    
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.select import Select
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://passport.ctrip.com/user/member/fastOrder")
    element = driver.find_element(By.XPATH, '//*[@id="slider"]/div[1]/div[2]')
    ActionChains(driver).drag_and_drop_by_offset(element, 300, 0).perform()
    time.sleep(3)
    driver.close()
    
    import re
    import requests
    import time
    from io import BytesIO
    
    import cv2
    import numpy as np
    from PIL import Image
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    
    
    class CrackSlider():
        # 通过浏览器截图,识别验证码中缺口位置,获取需要滑动距离,并破解滑动验证码
    
        def __init__(self):
            super(CrackSlider, self).__init__()
            self.opts = webdriver.ChromeOptions()
            self.opts.add_experimental_option('excludeSwitches', ['enable-logging'])
            # self.driver = webdriver.Chrome(ChromeDriverManager().install(), options=self.opts)
            self.driver = webdriver.Chrome(options=self.opts)
            self.driver.maximize_window()
    
            self.url = 'https://icas.jnu.edu.cn/cas/login'
            self.wait = WebDriverWait(self.driver, 10)
    
        def get_pic(self):
            self.driver.get(self.url)
            time.sleep(5)
            target_link = self.driver.find_element(By.CLASS_NAME, "yidun_bg-img").get_attribute('src')
            template_link = self.driver.find_element(By.CLASS_NAME, "yidun_jigsaw").get_attribute('src')
    
            target_img = Image.open(BytesIO(requests.get(target_link).content))
            template_img = Image.open(BytesIO(requests.get(template_link).content))
            target_img.save('target.jpg')
            template_img.save('template.png')
    
        def crack_slider(self, distance):
            slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'yidun_slider')))
            ActionChains(self.driver).click_and_hold(slider).perform()
            ActionChains(self.driver).move_by_offset(xoffset=distance, yoffset=0).perform()
            time.sleep(1)
            ActionChains(self.driver).release().perform()
            return 0
    
    
    def add_alpha_channel(img):
        """ 为jpg图像添加alpha通道 """
    
        r_channel, g_channel, b_channel = cv2.split(img)  # 剥离jpg图像通道
        alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 255  # 创建Alpha通道
    
        img_new = cv2.merge((r_channel, g_channel, b_channel, alpha_channel))  # 融合通道
        return img_new
    
    
    def handel_img(img):
        imgGray = cv2.cvtColor(img, cv2.COLOR_RGBA2GRAY)  # 转灰度图
        imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)  # 高斯模糊
        imgCanny = cv2.Canny(imgBlur, 60, 60)  # Canny算子边缘检测
        return imgCanny
    
    
    def match(img_jpg_path, img_png_path):
        # 读取图像
        img_jpg = cv2.imread(img_jpg_path, cv2.IMREAD_UNCHANGED)
        img_png = cv2.imread(img_png_path, cv2.IMREAD_UNCHANGED)
        # 判断jpg图像是否已经为4通道
        if img_jpg.shape[2] == 3:
            img_jpg = add_alpha_channel(img_jpg)
        img = handel_img(img_jpg)
        small_img = handel_img(img_png)
        res_TM_CCOEFF_NORMED = cv2.matchTemplate(img, small_img, 3)
        value = cv2.minMaxLoc(res_TM_CCOEFF_NORMED)
        value = value[3][0]  # 获取到移动距离
        return value
    
    if __name__ == '__main__':
        # 1. 打开chromedriver,试试下载图片
        cs = CrackSlider()
        cs.get_pic()
        # 2. 对比图片,计算距离
        img_jpg_path = 'target.jpg'  # 读者可自行修改文件路径
        img_png_path = 'template.png'  # 读者可自行修改文件路径
        distance = match(img_jpg_path, img_png_path)
        distance = distance /480 * 345 + 12
        # 3. 移动
        cs.crack_slider(distance)
        time.sleep(5)
    

    相关文章

      网友评论

          本文标题:39. 鼠标操作

          本文链接:https://www.haomeiwen.com/subject/rjgpzdtx.html