from selenium import webdriver
from selenium.webdriver import EdgeService
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import time
import os
import shutil
from openpyxl.drawing.image import Image
from openpyxl import Workbook
# Selenium WebDriver 驱动程序的放置位置与浏览器类型和操作系统有关。常用浏览器的驱动程序和对应的位置如下:
# Chrome:下载地址为 https://sites.google.com/a/chromium.org/chromedriver/downloads,对于 Windows 系统,通常将驱动程序放在 C:\Program Files (x86)\Google\Chrome\Application 目录下;对于 Linux 或 macOS 系统,可以将驱动程序放在 /usr/local/bin/ 目录下。
# Firefox:下载地址为 https://github.com/mozilla/geckodriver/releases,将驱动程序放在系统 PATH 路径下即可。
# Safari:Safari WebDriver 已经集成在 macOS 系统中,无需下载和安装外部驱动程序。
# Edge:下载地址为 https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/,将驱动程序放在系统 PATH 路径下即可。
# Opera:下载地址为 https://github.com/operasoftware/operachromiumdriver/releases,对于 Windows 系统,通常将驱动程序放在 C:\Program Files\Opera\ 目录下;对于 Linux 或 macOS 系统,可以将驱动程序放在 /usr/local/bin/ 目录下。
# 如果你不将驱动程序放在系统 PATH 路径下,可以在代码中指定驱动程序的路径,并且通过 options 参数来配置浏览器选项。具体示例如下:
# python
# from selenium import webdriver
# from selenium.webdriver.chrome.options import Options
# # 指定 Chrome WebDriver 的路径
# chrome_options = Options()
# chrome_options.add_argument('--disable-extensions')
# chrome_options.add_argument('--disable-gpu')
# chrome_options.add_argument('--headless') # 无界面模式
# chrome_options.add_argument('--no-sandbox')
# chrome_options.add_argument('--disable-dev-shm-usage')
# driver = webdriver.Chrome('/path/to/chromedriver', options=chrome_options)
# edge downLoad: https://developer.microsoft.com/zh-cn/microsoft-edge/tools/webdriver/
# chrome downLoad:https://sites.google.com/a/chromium.org/chromedriver/downloads
class BrowserAutomator:
def __init__(self, browser='chrome'):
if browser == 'chrome':
# 创建一个谷歌浏览器对象
option = webdriver.ChromeOptions()
option.add_argument('--disable-infobars')
# 处理SSL证书错误问题
option.add_argument('--ignore-certificate-errors')
option.add_argument('--ignore-ssl-errors')
# 忽略无用的日志
option.add_experimental_option(
"excludeSwitches", ['enable-automation', 'enable-logging'])
# driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
self.driver = webdriver.Chrome(options=option)
elif browser == 'edge':
options = webdriver.EdgeOptions()
# 禁用自动打开最近打开的网页
options.use_chromium = True
options.add_argument(
"disable-features=msLocalSave;msSavePassword;promptForDownload")
# 屏蔽inforbar
options.add_experimental_option('useAutomationExtension', False)
options.add_experimental_option(
'excludeSwitches', ['enable-automation', 'enable-logging'])
options.add_argument("--disable-gpu")
# 使用Selenium的--headless选项可以将浏览器设置为无头模式,即在后台运行而不显示界面。
# options.add_argument("--headless")
# options.add_argument("--disable-dev-shm-usage")
# options.add_argument("--no-sandbox")
# options.add_argument("--disable-browser-side-navigation")
# options.add_argument("--disable-new-profile-management")
"""
以上代码中,EdgeOptions类的add_argument()方法用于设置浏览器选项。
通过添加多个参数,可以屏蔽个人的profile信息。
例如,"--disable-extensions"参数用于禁用浏览器扩展程序,
"--disable-infobars"参数用于禁用信息栏,
"--disable-plugins-discovery"参数用于禁用插件探测,
"--disable-save-password-bubble"参数用于禁用保存密码弹窗,
"--disable-translate"参数用于禁用翻译功能,
"--disable-popup-blocking"参数用于禁用弹窗拦截,
"--disable-session-crashed-bubble"参数用于禁用会话崩溃弹窗,
"--disable-notifications"参数用于禁用通知。这些参数的组合可以根据具体需求进行调整。
"""
# options.add_argument("--disable-extensions")
# options.add_argument("--disable-infobars")
# options.add_argument("--disable-plugins-discovery")
# options.add_argument("--disable-save-password-bubble")
# options.add_argument("--disable-translate")
# options.add_argument("--disable-popup-blocking")
# options.add_argument("--disable-session-crashed-bubble")
# options.add_argument("--disable-notifications")
# 创建一个EdgeService对象,指定msedgedriver.exe的路径
service = EdgeService('C:\\python\\driver\\msedgedriver.exe')
self.driver = webdriver.Edge(service=service, options=options)
# self.driver = webdriver.Edge(options=options)
else:
raise ValueError('Invalid browser specified')
self.driver.maximize_window()
def go_to_url(self, url):
self.driver.get(url)
def find_element(self, by, value, timeout=10):
"""
查找单个元素
:param by: 元素定位信息,如 By.ID
:param value: 元素定位信息,如 'element_id'
:param timeout: 超时时间,默认为10秒
:return: WebElement对象或None
"""
try:
element = WebDriverWait(self.driver, timeout).until(
EC.presence_of_element_located((by, value))
)
return element
except (TimeoutException, NoSuchElementException):
return None
def find_elements(self, by, value, timeout=10):
"""
查找多个元素
:param by: 元素定位信息,如 By.CLASS_NAME
:param value: 元素定位信息,如 'element_class'
:param timeout: 超时时间,默认为10秒
:return: WebElement对象列表或空列表
"""
try:
elements = WebDriverWait(self.driver, timeout).until(
EC.presence_of_all_elements_located((by, value))
)
return elements
except (TimeoutException, NoSuchElementException):
return []
def click_element(self, element):
element.click()
def send_keys_to_element(self, element, keys):
element.send_keys(keys)
def close(self):
self.driver.quit()
def switch_to_next_tab(self):
self.driver.find_element_by_tag_name(
'body').send_keys(Keys.CONTROL + Keys.TAB)
def switch_to_previous_tab(self):
self.driver.find_element_by_tag_name('body').send_keys(
Keys.CONTROL + Keys.SHIFT + Keys.TAB)
def switch_to_tab(self, index):
self.driver.switch_to.window(self.driver.window_handles[index])
def screen_to_file(self, pic_dir, name):
print(pic_dir)
time.sleep(1)
pname = os.path.join(pic_dir + "/" + name+ ".png")
self.driver.get_screenshot_as_file(pname)
def execute_script(self, script, *args):
return self.driver.execute_script(script, *args)
def insert_pic_to_execel(excel_file, folder_path, height):
workbook = Workbook()
sheet = workbook.active
image_files = [file for file in os.listdir(folder_path) if file.endswith((".jpg", ".jpeg", ".png"))]
if not image_files:
print("没有找到图片文件!")
return
row = 1
column = "A"
for file in image_files:
image_path = os.path.join(folder_path, file)
print(image_path)
img = Image(image_path)
sheet.add_image(img, f"{column}{row}")
row = row + height
workbook.save(os.path.join(folder_path, excel_file))
print("Excel file saved.")
def chromeTest():
# 创建一个BrowserAutomator实例,指定使用Chrome浏览器
automator = BrowserAutomator('chrome')
pic_dir=os.path.join(os.path.dirname(__file__), "images")
if os.path.exists(pic_dir): # 检查文件夹是否存在
shutil.rmtree(pic_dir)
os.mkdir(pic_dir)
# 打开网页
automator.go_to_url('https://www.baidu.com')
automator.screen_to_file(pic_dir, "1")
# 查找元素
search_box = automator.find_element(By.ID, 'kw')
# 在搜索框中输入文本
automator.send_keys_to_element(search_box, 'python')
automator.screen_to_file(pic_dir, "2")
btn_box = automator.find_element(By.ID, 'su')
automator.click_element(btn_box)
automator.screen_to_file(pic_dir, "3")
insert_pic_to_execel("aa.xlsx", pic_dir, 58)
time.sleep(10)
# 关闭浏览器
automator.close()
chromeTest()
python可以自动切换chrome,edge浏览器,包括了一些自动化测试的常用方法, 包括查找元素之类的。一个python自动化测试的基础类
chromeDriver的下载链接
https://sites.google.com/a/chromium.org/chromedriver/downloads
EdgeDriver的下载链接