【自动化】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}")