当前位置: 首页 > article >正文

【自动化】Python SeleniumUtil 工具 开启开发者模式 自动安装油猴用户脚本等

【自动化】Python SeleniumUtil 工具

【Python】使用Selenium 操作浏览器 自动化测试 记录-CSDN博客文章浏览阅读58次。文章浏览阅读42次。【附件】Selenium chromedriver 驱动及浏览器下载。【附件】Selenium chromedriver 驱动及浏览器下载-CSDN博客。3.安装Chrome浏览器驱动。2.安装 selenium。1.安装python。https://blog.csdn.net/G971005287W/article/details/144557463

【学习记录】浏览器指纹相关学习记录(指纹介绍、获取指纹、修改指纹、随机指纹保护隐私等)-CSDN博客文章浏览阅读762次,点赞18次,收藏7次。可以识别是同一个用户。https://blog.csdn.net/G971005287W/article/details/144528762

【自动化】Python SeleniumUtil 油猴 工具 自动安装用户脚本-CSDN博客文章浏览阅读2次。【自动化】Python SeleniumUtil 工具-CSDN博客。【自动化】Python SeleniumUtil 油猴 工具。【自动化】Python SeleniumUtil 工具。https://blog.csdn.net/G971005287W/article/details/144565736

Python SeleniumUtil

import time

from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC


class SeleniumUtil:
    class 标签页:
        @staticmethod
        def 切换到新窗口句柄(driver, before_handles, after_handles):
            # 检查是否有新的窗口句柄出现
            new_handles = after_handles - before_handles
            if new_handles:
                # 切换到新打开的标签页
                new_window = new_handles.pop()
                driver.switch_to.window(new_window)
                return True
            else:
                return False

        @staticmethod
        def 获取所有已知窗口句柄(driver):
            return set(driver.window_handles)

        @staticmethod
        def 切换到第一个窗口(driver):
            # 切换到第一个窗口
            driver.switch_to.window(driver.window_handles[0])

        @staticmethod
        def 切换到当前窗口(driver):
            # 存储窗口的 ID
            original_window = driver.current_window_handle
            print(original_window)
            # 检查没有打开其他的窗口
            assert len(driver.window_handles) == 1

    class Driver:
        #初始化浏览器
        @staticmethod
        def 初始化驱动通过Debug模式(驱动路径, debuggerAddress):
            # 设置Edge选项
            options = webdriver.ChromeOptions()
            # options.add_experimental_option('prefs',{"extensions.ui.developer_mode": True,})
            options.add_experimental_option("debuggerAddress", debuggerAddress)
            # C:\\chromedriver\\129.0.6656.0\\chromedriver.exe
            service = ChromeService(executable_path = 驱动路径)
            # 创建一个新的Edge浏览器实例,并启用无痕模式
            driver = webdriver.Chrome(service = service, options = options)
            return driver

    # 如果你只需要确认元素存在,但不立即与其交互,那么可以使用 presence_of_element_located。
    # 如果你需要确保元素不仅存在而且可以安全地被用户交互(如点击),则应使用 element_to_be_clickable
    class 页面元素:
        @staticmethod
        def 判断元素是否存在(driver, 标签, 内容, 超时时间):
            element = SeleniumUtil.页面元素.获取元素(driver, 标签, 内容, 超时时间)
            if element is not None:
                return True
            else:
                return False


        @staticmethod
        def 点击元素(元素):
            if 元素 is not None:
                元素.click()
                return True
            else:
                return False

        @staticmethod
        def get元素(driver, 需要交互, 类型, 值, 超时时间):
            if 超时时间 is None:
                超时时间 = 7

            if 需要交互 is None:
                需要交互 = True

            try:
                wait = WebDriverWait(driver, 超时时间)
                if 需要交互:
                    元素 = wait.until(EC.element_to_be_clickable((类型, 值)))
                    if 元素 is not None:
                        return 元素
                    else:
                        return driver.find_element(类型, 值)

                else:
                    元素 = wait.until(EC.presence_of_element_located((类型, 值)))
                    if 元素 is not None:
                        return 元素
                    else:
                        return driver.find_element(类型, 值)
            except Exception as e:
                try:
                    return driver.find_element(类型, 值)
                except Exception as e2:
                    time.sleep(0)
                    return None


        @staticmethod
        def get元素ById(driver, id, 需要交互, 超时时间):
            return SeleniumUtil.页面元素.get元素(driver, 需要交互, By.ID, id, 超时时间)


        @staticmethod
        def get元素By标签及内容(driver, 标签, 内容, 需要交互, 超时时间):
            return SeleniumUtil.页面元素.get元素(driver, 需要交互, By.XPATH, f"//{标签}[text()='{内容}']", 超时时间)

        @staticmethod
        def get元素ByName属性(driver, name, 需要交互, 超时时间):
            return SeleniumUtil.页面元素.get元素(driver, 需要交互, By.NAME, name, 超时时间)

        @staticmethod
        def get元素By标签及属性(driver, 标签, 属性, 属性值, 需要交互, 超时时间):
            return SeleniumUtil.页面元素.get元素(driver, 需要交互, By.CSS_SELECTOR, f'{标签}[{属性}="{属性值}"]', 超时时间)

        @staticmethod
        def get元素By标签及属性立即(driver, 标签, 属性, 属性值, 需要交互, 超时时间):
            值 = f'{标签}[{属性}="{属性值}"]'
            print(值)
            return driver.find_element(By.CSS_SELECTOR, 值)

        #
        # @staticmethod
        # def 获取元素通过标签及属性(driver, 标签, 属性, 属性值):
        #     try:
        #         element = driver.find_element(By.CSS_SELECTOR, f'{标签}[{属性}="{属性值}"]')
        #         return element
        #     except Exception as e:
        #         time.sleep(0)
        #         return None


    class 扩展程序:
        @staticmethod
        def 打开扩展程序页(driver):
            driver.get('chrome://extensions')

        @staticmethod
        def 查询开发者模式状态(driver):
            # 打开目标网页
            SeleniumUtil.扩展程序.打开扩展程序页(driver)

            # 使用WebDriverWait等待页面加载完成,代替固定等待时间
            # time.sleep(5)
            try:
                wait = WebDriverWait(driver, 5)
                time.sleep(1)
                js = """
                    // window.location.href = 'chrome://extensions'
                    //获取开发者模式状态
                    let flag = document.querySelector("body > extensions-manager").shadowRoot.querySelector("#toolbar").shadowRoot.querySelector("#devMode").getAttribute("aria-pressed");
                    if(flag === 'true'){
                        return true;
                    }else{
                        return false;
                    }
                """
                status = driver.execute_script(js)

                print(f"当前开发者模式状态-{status}")
                return status
            except Exception as e:
                time.sleep(0)

        @staticmethod
        def 切换开发者模式状态(driver):
            try:
                wait = WebDriverWait(driver, 7)
                time.sleep(1)
                js = """
                    document.querySelector("body > extensions-manager").shadowRoot.querySelector("#toolbar").shadowRoot.querySelector("#devMode").click();
                    return true;
                """
                driver.execute_script(js)
            except Exception as e:
                time.sleep(0)

        @staticmethod
        def 打开开发者模式(driver):
            SeleniumUtil.扩展程序.修改开发者模式状态(driver, True)

        @staticmethod
        def 修改开发者模式状态(driver, flag):

            # 打开目标网页
            SeleniumUtil.扩展程序.打开扩展程序页(driver)

            # 使用WebDriverWait等待页面加载完成,代替固定等待时间
            from selenium.webdriver.support.ui import WebDriverWait
            from selenium.webdriver.support import expected_conditions as EC
            开发者模式状态 = SeleniumUtil.扩展程序.查询开发者模式状态(driver)

            if 开发者模式状态 == flag:
                time.sleep(0)
            else:
                SeleniumUtil.扩展程序.切换开发者模式状态(driver)

            print(f"修改开发者模式状态-{flag}")


http://www.kler.cn/a/447146.html

相关文章:

  • 54、库卡机器人轴的软限位设置
  • WPF 使用LibVLCSharp.WPF实现视频播放、停止、暂停功能
  • RAG开发中,如何用Milvus 2.5 BM25算法实现混合搜索
  • 免费送源码:Java+ssm++MVC+HTML+CSS+MySQL springboot 社区医院信息管理系统的设计与实现 计算机毕业设计原创定制
  • 图书馆管理系统(三)基于jquery、ajax
  • Mybatis中使用MySql触发器报错:You have an error in your SQL syntax; ‘DELIMITER $$
  • VSCode:Markdown插件安装使用 -- 最简洁的VSCode中Markdown插件安装使用
  • PCB生产设备日志采集
  • 学习Cookie 基础
  • 24届FPGA秋招经验分享
  • 【批量生成WORD和PDF文件】根据表格内容和模板文件批量创建word文件,一次性生成多个word文档和批量创建PDF文件
  • Mybatis中使用MySql触发器报错:You have an error in your SQL syntax; ‘DELIMITER $$
  • 【DevOps工具篇】PM(Project Management)之Redmine
  • linux zip unzip 命令的使用
  • LeetCode 844. 比较含退格的字符串 (C++实现)
  • 在 Spark 上实现 Graph Embedding
  • Java编程基础与高级应用:从入门到实践
  • 【JavaEE初阶】线程安全问题
  • 【MongoDB】使用 MongoDB 存储日志、审批、MQ等数据的案例及优点
  • R机器学习:朴素贝叶斯算法的理解与实操
  • SpringBoot项目Jar包使用systemctl运行
  • STM32F407寄存器点灯
  • 批量提取zotero的论文构建知识库做问答的大模型(可选)——含转存PDF-分割统计PDF等
  • 【react项目】从零搭建react项目[nodejs安装]
  • 我的2024年度总结
  • 【AIGC-ChatGPT进阶副业提示词】末日生存指南 2.0:疯狂科学家的荒诞智慧