selenium 常用方法封装 标签页切换 元素点击 双击 拖拽 右击 滚动 等等

# coding:utf-8
import datetime, hmac, random, string, time, uuid, pymysql, requests, ujson
from decimal import Decimal
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains


class driver_api:
    def __init__(self, 浏览器对象, 超时时间=15, 定位方式='xpath'):
        self.超时时间 = 超时时间
        self.定位方式 = 定位方式
        self.浏览器对象 = 浏览器对象

    def 标签页(self, 方式='查询', 变量=False):
        """
        对标签页进行操作

        :param 方式: 对标签页进行操作的方式:     
            '查询':返回当前所有标签页信息;           
            '切换':切换到指定标签页;          
            '新增':新增一个标签页;           
            '删除':删除一个标签页;           
        :param 变量: 方式不同入参不同 
            '查询':入参布尔值True返回当前信息;
            '切换':入参int标识位置 入参str标识标签页标题(模糊匹配);
            '新增':入参url链接地址;
            '删除':入参int标识位置 入参str标识标签页标题(模糊匹配);
        :return: 只有查询时有返回
        """
        if 方式 == '查询':
            当前句柄 = self.浏览器对象.current_window_handle  # 定位当前页面句柄
            全部句柄 = self.浏览器对象.window_handles  # 获取全部页面句柄
            all_return = []
            位置 = 0
            for 单个句柄 in 全部句柄:  # 遍历全部页面句柄
                self.浏览器对象.switch_to.window(单个句柄)
                uir = self.浏览器对象.current_url
                标题 = self.浏览器对象.title
                句柄 = 单个句柄
                if 单个句柄 == 当前句柄:
                    all_return.append({
                        'uir': uir,
                        '标题': 标题,
                        '句柄': 句柄,
                        '位置': 位置,
                        '当前': 1,

                    })
                else:
                    all_return.append({
                        'uir': uir,
                        '标题': 标题,
                        '句柄': 句柄,
                        '位置': 位置,
                        '当前': 0,

                    })
                位置 += 1
            self.浏览器对象.switch_to.window(当前句柄)  # 切换到新页面
            if 变量:
                输出 = [_ for _ in all_return if _['当前'] == 1]
                return 输出[0]
            else:
                return all_return

        if 方式 == '切换':
            if type(变量) == int:
                self.浏览器对象.switch_to.window(self.浏览器对象.window_handles[变量])
            else:
                全部句柄 = self.浏览器对象.window_handles  # 获取全部页面句柄
                for 单个句柄 in 全部句柄:  # 遍历全部页面句柄
                    self.浏览器对象.switch_to.window(单个句柄)
                    标题 = self.浏览器对象.title
                    if 标题 in 变量:
                        break

        if 方式 == '新增':
            self.浏览器对象.execute_script(f'window.open("{变量}")')

        if 方式 == '删除':
            if type(变量) == int:
                当前句柄 = self.浏览器对象.current_window_handle  # 定位当前页面句柄
                选定句柄 = self.浏览器对象.window_handles[变量]
                if str(当前句柄) != str(选定句柄):
                    self.浏览器对象.switch_to.window(选定句柄)
                    self.浏览器对象.close()
                    self.浏览器对象.switch_to.window(当前句柄)
                else:
                    self.浏览器对象.switch_to.window(选定句柄)
                    self.浏览器对象.close()
            else:
                当前句柄 = self.浏览器对象.current_window_handle  # 定位当前页面句柄
                全部句柄 = self.浏览器对象.window_handles  # 获取全部页面句柄
                for 单个句柄 in 全部句柄:  # 遍历全部页面句柄
                    self.浏览器对象.switch_to.window(单个句柄)
                    标题 = self.浏览器对象.title
                    if 标题 in 变量:
                        if str(单个句柄) != str(当前句柄):
                            self.浏览器对象.close()
                            self.浏览器对象.switch_to.window(当前句柄)
                            break
                        else:
                            self.浏览器对象.close()
                            break

    def 导航键(self, 方式='刷新'):
        """
        类型于手机的导航栏

        :param 方式: 对标签页进行操作的方式:     
            '刷新':刷新当前页面;           
            '返回':返回上一步 相当于点击浏览器左上角的返回按钮;          
            '前进':前进下一步 相当于点击浏览器左上角的前进按钮  前提是你可用进行下一步 看一下浏览器左上角的前进按钮是否是可用状态 是可用状态才行;           
            '关闭':删除一个标签页;           
        :return: 
        """

        if 方式 == '刷新':
            self.浏览器对象.refresh()
        if 方式 == '返回':
            self.浏览器对象.back()
        if 方式 == '前进':
            self.浏览器对象.forward()
        if 方式 == '关闭':
            self.浏览器对象.close()

    def 点击(self, 点位, 滚动=False, 类型=None, 超时=None):
        """
        右击对应的元素

        :param 点位: 元素对象的点位信息 
            默认使用类初始化的'xpath'方式 如果初始化用的是什么 后续其他操作就是什么 如果要该 请用类型进行入参
        :param 滚动: 是否通过滚动找到元素
            默认不滚动 如果元素需要滚动才能看见 请传布尔值True
        :param 类型: 元素对象的定位方式
            默认类初始化的方式 可选:
                ID = "id"
                XPATH = "xpath"
                LINK_TEXT = "link text"
                PARTIAL_LINK_TEXT = "partial link text"
                NAME = "name"
                TAG_NAME = "tag name"
                CLASS_NAME = "class name"
                CSS_SELECTOR = "css selector"
        :param 超时: 等待元素最长时间
            等待元素可用的最长时间 默认类初始化的时间
        :return: 
        """

        if 类型 is None:
            使用类型 = self.定位方式
        else:
            使用类型 = 类型
        if 超时 is None:
            超时时间 = self.超时时间
        else:
            超时时间 = 超时

        当前次数 = 0
        输出结果 = False
        self.浏览器对象.implicitly_wait(3)
        while 当前次数 <= 超时时间:
            try:
                元素对象 = self.浏览器对象.find_element(使用类型, 点位)
                if 滚动:
                    self.浏览器对象.execute_script("arguments[0].scrollIntoView();", 元素对象[0])
                元素对象.click()
                输出结果 = True
                break
            except Exception as e:
                print(e)
                time.sleep(1)
            当前次数 += 3
        self.浏览器对象.implicitly_wait(self.超时时间)
        return 输出结果

    def 双击(self, 点位, 滚动=False, 类型=None, 超时=None):
        """
        右击对应的元素

        :param 点位: 元素对象的点位信息 
            默认使用类初始化的'xpath'方式 如果初始化用的是什么 后续其他操作就是什么 如果要该 请用类型进行入参
        :param 滚动: 是否通过滚动找到元素
            默认不滚动 如果元素需要滚动才能看见 请传布尔值True
        :param 类型: 元素对象的定位方式
            默认类初始化的方式 可选:
                ID = "id"
                XPATH = "xpath"
                LINK_TEXT = "link text"
                PARTIAL_LINK_TEXT = "partial link text"
                NAME = "name"
                TAG_NAME = "tag name"
                CLASS_NAME = "class name"
                CSS_SELECTOR = "css selector"
        :param 超时: 等待元素最长时间
            等待元素可用的最长时间 默认类初始化的时间
        :return: 
        """
        if 类型 is None:
            使用类型 = self.定位方式
        else:
            使用类型 = 类型
        if 超时 is None:
            超时时间 = self.超时时间
        else:
            超时时间 = 超时

        当前次数 = 0
        输出结果 = False
        self.浏览器对象.implicitly_wait(3)
        while 当前次数 <= 超时时间:
            try:
                元素对象 = self.浏览器对象.find_element(使用类型, 点位)
                if 滚动:
                    self.浏览器对象.execute_script("arguments[0].scrollIntoView();", 元素对象[0])
                ActionChains(self.浏览器对象).double_click(元素对象).perform()
                输出结果 = True
                break
            except Exception as e:
                print(e)
                time.sleep(1)
            当前次数 += 3
        self.浏览器对象.implicitly_wait(self.超时时间)
        return 输出结果

    def 右击(self, 点位, 滚动=False, 类型=None, 超时=None):
        """
        右击对应的元素

        :param 点位: 元素对象的点位信息 
            默认使用类初始化的'xpath'方式 如果初始化用的是什么 后续其他操作就是什么 如果要该 请用类型进行入参
        :param 滚动: 是否通过滚动找到元素
            默认不滚动 如果元素需要滚动才能看见 请传布尔值True
        :param 类型: 元素对象的定位方式
            默认类初始化的方式 可选:
                ID = "id"
                XPATH = "xpath"
                LINK_TEXT = "link text"
                PARTIAL_LINK_TEXT = "partial link text"
                NAME = "name"
                TAG_NAME = "tag name"
                CLASS_NAME = "class name"
                CSS_SELECTOR = "css selector"
        :param 超时: 等待元素最长时间
            等待元素可用的最长时间 默认类初始化的时间
        :return: 
        """
        if 类型 is None:
            使用类型 = self.定位方式
        else:
            使用类型 = 类型
        if 超时 is None:
            超时时间 = self.超时时间
        else:
            超时时间 = 超时

        当前次数 = 0
        输出结果 = False
        self.浏览器对象.implicitly_wait(3)
        while 当前次数 <= 超时时间:
            try:
                元素对象 = self.浏览器对象.find_element(使用类型, 点位)
                if 滚动:
                    self.浏览器对象.execute_script("arguments[0].scrollIntoView();", 元素对象[0])
                ActionChains(self.浏览器对象).context_click(元素对象).perform()
                输出结果 = True
                break
            except Exception as e:
                print(e)
                time.sleep(1)
            当前次数 += 3
        self.浏览器对象.implicitly_wait(self.超时时间)
        return 输出结果

    def 长按(self, 点位, 时间=3, 滚动=False, 类型=None, 超时=None):
        """
        长按对应的元素

        :param 点位: 元素对象的点位信息 
            默认使用类初始化的'xpath'方式 如果初始化用的是什么 后续其他操作就是什么 如果要该 请用类型进行入参
        :param 时间: 长按元素的时间
            默认按住3秒
        :param 滚动: 是否通过滚动找到元素
            默认不滚动 如果元素需要滚动才能看见 请传布尔值True
        :param 类型: 元素对象的定位方式
            默认类初始化的方式 可选:
                ID = "id"
                XPATH = "xpath"
                LINK_TEXT = "link text"
                PARTIAL_LINK_TEXT = "partial link text"
                NAME = "name"
                TAG_NAME = "tag name"
                CLASS_NAME = "class name"
                CSS_SELECTOR = "css selector"
        :param 超时: 等待元素最长时间
            等待元素可用的最长时间 默认类初始化的时间
        :return: 
        """
        if 类型 is None:
            使用类型 = self.定位方式
        else:
            使用类型 = 类型
        if 超时 is None:
            超时时间 = self.超时时间
        else:
            超时时间 = 超时

        当前次数 = 0
        输出结果 = False
        self.浏览器对象.implicitly_wait(3)
        while 当前次数 <= 超时时间:
            try:
                元素对象 = self.浏览器对象.find_element(使用类型, 点位)
                if 滚动:
                    self.浏览器对象.execute_script("arguments[0].scrollIntoView();", 元素对象[0])

                操作对象 = ActionChains(self.浏览器对象)
                操作对象.click_and_hold(元素对象)
                操作对象.perform()
                time.sleep(时间)
                操作对象.release(元素对象)

                输出结果 = True
                break
            except Exception as e:
                print(e)
                time.sleep(1)
            当前次数 += 3
        self.浏览器对象.implicitly_wait(self.超时时间)
        return 输出结果

    def 悬停(self, 点位, 滚动=False, 类型=None, 超时=None):
        """
        触发对应元素的  鼠标悬停事件  鼠标没有真正移动到哪里 但是你可以理解成鼠标悬停在哪里了

        :param 点位: 元素对象的点位信息 
            默认使用类初始化的'xpath'方式 如果初始化用的是什么 后续其他操作就是什么 如果要该 请用类型进行入参
        :param 滚动: 是否通过滚动找到元素
            默认不滚动 如果元素需要滚动才能看见 请传布尔值True
        :param 类型: 元素对象的定位方式
            默认类初始化的方式 可选:
                ID = "id"
                XPATH = "xpath"
                LINK_TEXT = "link text"
                PARTIAL_LINK_TEXT = "partial link text"
                NAME = "name"
                TAG_NAME = "tag name"
                CLASS_NAME = "class name"
                CSS_SELECTOR = "css selector"
        :param 超时: 等待元素最长时间
            等待元素可用的最长时间 默认类初始化的时间
        :return: 
        """
        if 类型 is None:
            使用类型 = self.定位方式
        else:
            使用类型 = 类型
        if 类型 is None:
            超时时间 = self.超时时间
        else:
            超时时间 = 超时

        当前次数 = 0
        输出结果 = False
        self.浏览器对象.implicitly_wait(3)
        while 当前次数 <= 超时时间:
            try:

                元素对象 = self.浏览器对象.find_element(使用类型, 点位)
                if 滚动:
                    self.浏览器对象.execute_script("arguments[0].scrollIntoView();", 元素对象[0])
                ActionChains(self.浏览器对象).move_to_element(元素对象).perform()
                输出结果 = True
                break
            except Exception as e:
                print(e)
                time.sleep(1)
            当前次数 += 3
        self.浏览器对象.implicitly_wait(self.超时时间)
        return 输出结果

    def 拖拽(self, 点位, 位置对象, 滚动=False, 类型=None, 超时=None):
        """
        触发对应元素的  鼠标悬停事件  鼠标没有真正移动到哪里 但是你可以理解成鼠标悬停在哪里了

        :param 点位: 元素对象的点位信息 
            默认使用类初始化的'xpath'方式 如果初始化用的是什么 后续其他操作就是什么 如果要该 请用类型进行入参
        :param 位置对象: 拖拽的目标对象 必填的哦
            默认使用元素对象 即默认移动到指定的元素对象位置
            传人元祖(x,y)对象即移动指定像素 将元素向x和y轴分别拖动x和y
        :param 滚动: 是否通过滚动找到元素
            默认不滚动 如果元素需要滚动才能看见 请传布尔值True
        :param 类型: 元素对象的定位方式
            默认类初始化的方式 可选:
                ID = "id"
                XPATH = "xpath"
                LINK_TEXT = "link text"
                PARTIAL_LINK_TEXT = "partial link text"
                NAME = "name"
                TAG_NAME = "tag name"
                CLASS_NAME = "class name"
                CSS_SELECTOR = "css selector"
        :param 超时: 等待元素最长时间
            等待元素可用的最长时间 默认类初始化的时间
        :return: 
        """
        if 类型 is None:
            使用类型 = self.定位方式
        else:
            使用类型 = 类型
        if 类型 is None:
            超时时间 = self.超时时间
        else:
            超时时间 = 超时

        当前次数 = 0
        输出结果 = False
        self.浏览器对象.implicitly_wait(3)
        while 当前次数 <= 超时时间:
            try:
                元素对象 = self.浏览器对象.find_element(使用类型, 点位)
                if 滚动:
                    self.浏览器对象.execute_script("arguments[0].scrollIntoView();", 元素对象[0])
                if type(位置对象) == ():
                    ActionChains(self.浏览器对象).drag_and_drop_by_offset(元素对象, 位置对象[0], 位置对象[1]).perform()
                    输出结果 = True
                    break
                else:
                    ActionChains(self.浏览器对象).drag_and_drop(元素对象, 位置对象).perform()
                    输出结果 = True
                    break
            except Exception as e:
                print(e)
                time.sleep(1)
            当前次数 += 3
        self.浏览器对象.implicitly_wait(self.超时时间)
        return 输出结果

    def 输入(self, 点位, 文本='', 滚动=False, 类型=None, 超时=None):
        """
        向对应元素输入指定内容

        :param 点位: 元素对象的点位信息 
            默认使用类初始化的'xpath'方式 如果初始化用的是什么 后续其他操作就是什么 如果要该 请用类型进行入参
        :param 文本: 向对象输入的文本
            不填就输入空气
        :param 滚动: 是否通过滚动找到元素
            默认不滚动 如果元素需要滚动才能看见 请传布尔值True
        :param 类型: 元素对象的定位方式
            默认类初始化的方式 可选:
                ID = "id"
                XPATH = "xpath"
                LINK_TEXT = "link text"
                PARTIAL_LINK_TEXT = "partial link text"
                NAME = "name"
                TAG_NAME = "tag name"
                CLASS_NAME = "class name"
                CSS_SELECTOR = "css selector"
        :param 超时: 等待元素最长时间
            等待元素可用的最长时间 默认类初始化的时间
        :return: 
        """
        if 类型 is None:
            使用类型 = self.定位方式
        else:
            使用类型 = 类型
        if 类型 is None:
            超时时间 = self.超时时间
        else:
            超时时间 = 超时

        当前次数 = 0
        输出结果 = False
        self.浏览器对象.implicitly_wait(3)
        while 当前次数 <= 超时时间:
            try:

                元素对象 = self.浏览器对象.find_element(使用类型, 点位)
                if 滚动:
                    self.浏览器对象.execute_script("arguments[0].scrollIntoView();", 元素对象[0])
                元素对象.send_keys(文本)
                输出结果 = True
                break
            except Exception as e:
                print(e)
                time.sleep(1)
            当前次数 += 3
        self.浏览器对象.implicitly_wait(self.超时时间)
        return 输出结果

    def 检测(self, 点位, 滚动=False, 类型=None, 超时=None):
        """
        检测元素是否存在 并输出元素对象

        :param 点位: 元素对象的点位信息 
            默认使用类初始化的'xpath'方式 如果初始化用的是什么 后续其他操作就是什么 如果要该 请用类型进行入参
        :param 滚动: 是否通过滚动找到元素
            默认不滚动 如果元素需要滚动才能看见 请传布尔值True
        :param 类型: 元素对象的定位方式
            默认类初始化的方式 可选:
                ID = "id"
                XPATH = "xpath"
                LINK_TEXT = "link text"
                PARTIAL_LINK_TEXT = "partial link text"
                NAME = "name"
                TAG_NAME = "tag name"
                CLASS_NAME = "class name"
                CSS_SELECTOR = "css selector"
        :param 超时: 等待元素最长时间
            等待元素可用的最长时间 默认类初始化的时间
        :return:
            找到输出元素对象  找不到输出布尔值False
        """
        if 类型 is None:
            使用类型 = self.定位方式
        else:
            使用类型 = 类型
        if 类型 is None:
            超时时间 = self.超时时间
        else:
            超时时间 = 超时

        当前次数 = 0
        输出结果 = False
        self.浏览器对象.implicitly_wait(3)
        while 当前次数 <= 超时时间:
            try:

                元素对象 = self.浏览器对象.find_element(使用类型, 点位)
                if 滚动:
                    self.浏览器对象.execute_script("arguments[0].scrollIntoView();", 元素对象[0])
                输出结果 = 元素对象
                break
            except Exception as e:
                print(e)
                time.sleep(1)
            当前次数 += 3
        self.浏览器对象.implicitly_wait(self.超时时间)
        return 输出结果

    def 获取(self, 点位, 自定义='class', 滚动=False, 类型=None, 超时=None):
        """
        获取元素的相关信息

        :param 点位: 元素对象的点位信息
            默认使用类初始化的'xpath'方式 如果初始化用的是什么 后续其他操作就是什么 如果要该 请用类型进行入参
        :param 自定义: 要获取的额外信息
            默认是'class' 可用自己输入 例如id name 等等
        :param 滚动: 是否通过滚动找到元素
            默认不滚动 如果元素需要滚动才能看见 请传布尔值True
        :param 类型: 元素对象的定位方式
            默认类初始化的方式 可选:
                ID = "id"
                XPATH = "xpath"
                LINK_TEXT = "link text"
                PARTIAL_LINK_TEXT = "partial link text"
                NAME = "name"
                TAG_NAME = "tag name"
                CLASS_NAME = "class name"
                CSS_SELECTOR = "css selector"
        :param 超时: 等待元素最长时间
            等待元素可用的最长时间 默认类初始化的时间
        :return:
            找到元素 输出元素的相关信息  找不到输出空字典{}
        """
        if 类型 is None:
            使用类型 = self.定位方式
        else:
            使用类型 = 类型
        if 类型 is None:
            超时时间 = self.超时时间
        else:
            超时时间 = 超时

        当前次数 = 0
        输出结果 = {}
        self.浏览器对象.implicitly_wait(3)
        while 当前次数 <= 超时时间:
            try:
                元素对象 = self.浏览器对象.find_element(使用类型, 点位)
                if 滚动:
                    self.浏览器对象.execute_script("arguments[0].scrollIntoView();", 元素对象[0])
                if 元素对象:
                    try:
                        输出结果.update({
                            '坐标': 元素对象.location
                        })
                    except Exception as e:
                        pass
                    try:
                        输出结果.update({
                            '自定义值': 元素对象.get_attribute(自定义)
                        })
                    except Exception as e:
                        pass
                    try:
                        输出结果.update({
                            '是否选中': 元素对象.is_selected()
                        })
                    except Exception as e:
                        pass
                    try:
                        输出结果.update({
                            '元素大小': 元素对象.size
                        })
                    except Exception as e:
                        pass
                    try:
                        输出结果.update({
                            '是否显示': 元素对象.is_displayed()
                        })
                    except Exception as e:
                        pass
                    try:
                        输出结果.update({
                            '是否使用': 元素对象.is_enabled()
                        })
                    except Exception as e:
                        pass
                    try:
                        输出结果.update({
                            '文本内容': 元素对象.text
                        })
                    except Exception as e:
                        pass
                    try:
                        输出结果.update({
                            'tagName': 元素对象.tag_name
                        })
                    except Exception as e:
                        pass
                    break
            except Exception as e:
                print(e)
            time.sleep(1)
            当前次数 += 3

        self.浏览器对象.implicitly_wait(self.超时时间)
        return 输出结果

加粗样式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在你提供的代码中,selenium在打开的面停留的问题可能是由于面加载速度较慢导致的。selenium在打开网后,需要等待面加载完全才能执行后续的操作。如果面加载速度较慢,selenium可能会在面首停留,而没有执行`driver.get()`操作。 为了解决这个问题,你可以使用显式等待来等待面加载完成。显式等待是一种在特定条件下等待特定时间的方法。你可以使用`WebDriverWait`类和`ExpectedConditions`类来实现显式等待。例如,你可以使用`ExpectedConditions.visibilityOfElementLocated`来等待面上的某个元素可见,然后再执行后续的操作。 另外,你还可以使用隐式等待来设置一个全局的等待时间,让selenium在查找元素时等待一段时间。你可以使用`driver.manage().timeouts().implicitlyWait`方法来设置隐式等待的时间。 综上所述,你可以在代码中添加显式等待或隐式等待来解决selenium在打开的面停留的问题。这样可以确保面加载完成后再执行后续的操作。 #### 引用[.reference_title] - *1* [Mac中Java+Selenium无法打开网址的解决方法](https://blog.csdn.net/weixin_37623976/article/details/105843877)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [python爬虫(十六)selenium面等待](https://blog.csdn.net/hwwaizs/article/details/120107589)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值