UI自动化web端框架pyse.py代码
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from openpyxl import load_workbook
from pynput.mouse import Controller as MouseController, Button
class Pyse(object):
def __init__(self, browser='chrome'): # 初始化driver
if browser == "firefox" or browser == "ff":
driver = webdriver.Firefox()
elif browser == "chrome":
option = webdriver.ChromeOptions()
option.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=option)
elif browser == "internet explorer" or browser == "ie":
driver = webdriver.Ie()
elif browser == "opera":
driver = webdriver.Opera()
elif browser == "phantomjs":
driver = webdriver.PhantomJS()
elif browser == 'edge':
driver = webdriver.Edge()
try:
self.driver = driver
except Exception:
raise NameError(
"Not found %s browser,You can enter 'ie', 'ff', 'opera', 'phantomjs', 'edge' or 'chrome'." % browser)
def element_wait(self, css, secs=5): # 等待元素出现,显示等待
'''
Waiting for an element to display.
Usage:
driver.element_wait("css=>#el",10)
'''
if "=>" not in css:
raise NameError("Positioning syntax errors, lack of '=>'.")
by = css.split("=>")[0]
value = css.split("=>")[1]
if by == "id":
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.ID, value)))
elif by == "name":
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.NAME, value)))
elif by == "class":
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CLASS_NAME, value)))
elif by == "link_text":
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.LINK_TEXT, value)))
elif by == "xpath":
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.XPATH, value)))
elif by == "css":
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, value)))
else:
raise NameError(
"Please enter the correct targeting elements,'id','name','class','link_text','xpath','css'.")
def get_element(self, css): # 获取元素
'''
Judge element positioning way, and returns the element.
'''
if "=>" not in css:
raise NameError("Positioning syntax errors, lack of '=>'.")
by = css.split("=>")[0]
value = css.split("=>")[1]
if by == "id":
element = self.driver.find_element_by_id(value)
elif by == "name":
element = self.driver.find_element_by_name(value)
elif by == "class":
element = self.driver.find_element_by_class_name(value)
elif by == "link_text":
element = self.driver.find_element_by_link_text(value)
elif by == "xpath":
element = self.driver.find_element_by_xpath(value)
elif by == "css":
element = self.driver.find_element_by_css_selector(value)
else:
raise NameError(
"Please enter the correct targeting elements,'id','name','class','link_text','xpath','css'.")
return element
def open(self, url): # 打开目标网址
'''
open url.
Usage:
driver.open("https://www.baidu.com")
'''
self.driver.get(url)
def max_window(self): # 窗口最大化展示
'''
Set browser window maximized.
Usage:
driver.max_window()
'''
self.driver.maximize_window()
def set_window(self, wide, high): # 设置窗口宽和高
'''
Set browser window wide and high.
Usage:
driver.set_window(wide,high)
'''
self.driver.set_window_size(wide, high)
def type(self, css, text): # 往文本框输入字符串
'''
Operation input box.
Usage:
driver.type("css=>#el","selenium")
'''
self.element_wait(css)
el = self.get_element(css)
el.send_keys(text)
def clear(self, css): # 清除字符串
'''
Clear the contents of the input box.
Usage:
driver.clear("css=>#el")
'''
self.element_wait(css)
el = self.get_element(css)
el.clear()
def click(self, css): # 点击操作
'''
It can click any text / image can be clicked
Connection, check box, radio buttons, and even drop-down box etc..
Usage:
driver.click("css=>#el")
'''
self.element_wait(css)
el = self.get_element(css)
el.click()
def right_click(self, css): # 右击操作
'''
Right click element.
Usage:
driver.right_click("css=>#el")
'''
self.element_wait(css)
el = self.get_element(css)
ActionChains(self.driver).context_click(el).perform()
def move_to_element(self, css): # 鼠标悬浮
'''
Mouse over the element.
Usage:
driver.move_to_element("css=>#el")
'''
self.element_wait(css)
el = self.get_element(css)
ActionChains(self.driver).move_to_element(el).perform()
def double_click(self, css): # 双击
'''
Double click element.
Usage:
driver.double_click("css=>#el")
'''
self.element_wait(css)
el = self.get_element(css)
ActionChains(self.driver).double_click(el).perform()
def drag_and_drop(self, el_css, ta_css): # 拖拽操作,拼图
'''
Drags an element a certain distance and then drops it.
Usage:
driver.drag_and_drop("css=>#el","css=>#ta")
'''
self.element_wait(el_css)
element = self.get_element(el_css)
self.element_wait(ta_css)
target = self.get_element(ta_css)
ActionChains(driver).drag_and_drop(element, target).perform()
def click_text(self, text):
'''
Click the element by the link text
Usage:
driver.click_text("新闻")
'''
self.driver.find_element_by_partial_link_text(text).click()
def close(self): # 关闭当前浏览器
'''
Simulates the user clicking the "close" button in the titlebar of a popup
window or tab.
Usage:
driver.close()
'''
self.driver.close()
def quit(self): # 关闭所有浏览器
'''
Quit the driver and close all the windows.
Usage:
driver.quit()
'''
self.driver.quit()
def submit(self, css): # 提交操作
'''
Submit the specified form.
Usage:
driver.submit("css=>#el")
'''
self.element_wait(css)
el = self.get_element(css)
el.submit()
def F5(self): # 按钮刷新
'''
Refresh the current page.
Usage:
driver.F5()
'''
self.driver.refresh()
def js(self, script): # 执行js
'''
Execute JavaScript scripts.
Usage:
driver.js("window.scrollTo(200,1000);")
'''
self.driver.execute_script(script)
def get_attribute(self, css, attribute): # 获取属性
'''
Gets the value of an element attribute.
Usage:
driver.get_attribute("css=>#el","type")
'''
el = self.get_element(css)
return el.get_attribute(attribute)
def get_text(self, css):
'''
Get element text information.
Usage:
driver.get_text("css=>#el")
'''
self.element_wait(css)
el = self.get_element(css)
return el.text
def get_display(self, css):
'''
Gets the element to display,The return result is true or false.
Usage:
driver.get_display("css=>#el")
'''
self.element_wait(css)
el = self.get_element(css)
return el.is_displayed()
def get_title(self):
'''
Get window title.
Usage:
driver.get_title()
'''
return self.driver.title
def get_url(self):
'''
Get the URL address of the current page.
Usage:
driver.get_url()
'''
return self.driver.current_url
def get_windows_img(self, file_path): #截图
'''
Get the current window screenshot.
Usage:
driver.get_windows_img()
'''
self.driver.get_screenshot_as_file(file_path)
def wait(self, secs):
'''
Implicitly wait.All elements on the page.
Usage:
driver.wait(10)
'''
self.driver.implicitly_wait(secs)
def accept_alert(self): # 确认操作
'''
Accept warning box.
Usage:
driver.accept_alert()
'''
self.driver.switch_to.alert.accept()
def dismiss_alert(self): # 取消操作
'''
Dismisses the alert available.
Usage:
driver.dismiss_alert()
'''
self.driver.switch_to.alert.dismiss()
def switch_to_frame(self, css): # 向下跳一层
'''
Switch to the specified frame.
Usage:
driver.switch_to_frame("css=>#el")
'''
self.element_wait(css)
iframe_el = self.get_element(css)
self.driver.switch_to.frame(iframe_el)
def switch_to_frame_out(self): # 跳到最外层
'''
Returns the current form machine form at the next higher level.
Corresponding relationship with switch_to_frame () method.
Usage:
driver.switch_to_frame_out()
'''
self.driver.switch_to.default_content()
def open_new_window(self, css): # 打开新窗口
'''
Open the new window and switch the handle to the newly opened window.
Usage:
driver.open_new_window()
'''
original_windows = self.driver.current_window_handle
el = self.get_element(css)
el.click()
all_handles = self.driver.window_handles
for handle in all_handles:
if handle != original_windows:
self.driver.switch_to.window(handle)
# def _save_png(self, name):
# self.get_windows_img(name)
def wait_and_save_exception(self, css, name): # 等待并保存异常
try:
self.element_wait(css, secs=5)
print(name)
return True
except Exception as e:
from lib.core.path import PICTUREPATH
name = PICTUREPATH + name + '.jpg'
print(name)
self.get_windows_img(name)
return False
def wait_and_exception(self, css):
try:
self.element_wait(css, secs=10)
return True
except Exception as e:
return False
def select_by_value(self, css, value): # 下拉框操作
self.element_wait(css)
el = self.get_element(css)
Select(el).select_by_value(value)
def get_text_via_javascript(self, css_selector, secs=20):
"""通过 JavaScript 直接获取文本,避免元素过时问题"""
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, css_selector)))
script = """
var element = document.querySelector(arguments[0]);
return element ? element.textContent.trim() : null;
"""
return self.driver.execute_script(script, css_selector)
def js_click_by_selector(self, css_selector, secs=20):
"""通过 CSS 选择器直接 JavaScript 点击"""
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, css_selector)))
script = """
var element = document.querySelector(arguments[0]);
if (element) {
element.click();
return true;
} else {
return false;
}
"""
result = self.driver.execute_script(script, css_selector)
return result
def js_double_click(self):
# 定位需要双击的元素
element = self.driver.find_element(By.CSS_SELECTOR, "") # 替换为你的元素定位
js_code = """
var element = arguments[0];
// 创建双击事件
var event = new MouseEvent('dblclick', {
'view': window,
'bubbles': true,
'cancelable': true
});
// 触发事件
element.dispatchEvent(event);
"""
self.driver.execute_script(js_code, element)
def get_placeholder_text(self):
"""通过 CSS 选择器直接 JavaScript 获取placeholder的值"""
js_script1 = """
var input = document.querySelector('#app > div.temporary > div > div:nth-child(1) > div > div > div.left-header > form > div.el-form-item.asterisk-left.el-form-item--label-right.margin-12 > div > div > div > input');
return input ? input.placeholder : null;
"""
placeholder1 = self.driver.execute_script(js_script1)
return placeholder1
def fix_downloaded_files_style(self, directory_path):
"""
修复目录权限问题
"""
try:
# 检查目录是否存在
if not os.path.exists(directory_path):
# 创建目录: directory_path
os.makedirs(directory_path)
# 修改目录权限(Windows)
if os.name == 'nt': # Windows系统
import subprocess
# 使用icacls命令修改权限
try:
# 给Everyone用户完全控制权限
subprocess.run(['icacls', directory_path, '/grant', 'Everyone:F'],
check=True, capture_output=True)
# 已为directory_path设置完全控制权限
except subprocess.CalledProcessError:
print("可能需要管理员权限来修改目录权限")
# 检查权限
if os.access(directory_path, os.W_OK):
# 目录现在可写
return True
else:
# 目录仍然不可写
return False
except Exception as e:
return False
def delete_downloaded_files(self, file_path):
""" 删除下载文件 """
if os.path.exists(file_path):
os.remove(file_path)
def get_latest_downloaded_file(self, directory):
"""获取指定目录中最新的文件"""
files = [os.path.join(directory, f) for f in os.listdir(directory)]
if not files:
return None
return max(files, key=os.path.getctime)
def js_get_Attribute(self, css_selector, Attribute, secs=20):
"""获取attribute,Attribute可以传placeholder、id、class等"""
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, css_selector)))
"""使用 JavaScript 获取标签内属性"""
placeholder_text = self.driver.execute_script(
f'return document.querySelector(arguments[0]).getAttribute(arguments[1]);', css_selector, Attribute)
return placeholder_text
def js_hover_with_javascript(self, css_selector, secs=20):
"""使用 JavaScript 触发鼠标悬浮事件"""
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, css_selector)))
# 执行 JavaScript 来触发鼠标事件
self.driver.execute_script("""
// 创建并分发鼠标事件
function simulateHover(element) {
const mouseOverEvent = new MouseEvent('mouseover', {
view: window,
bubbles: true,
cancelable: true
});
const mouseEnterEvent = new MouseEvent('mouseenter', {
view: window,
bubbles: true,
cancelable: true
});
const mouseMoveEvent = new MouseEvent('mousemove', {
view: window,
bubbles: true,
cancelable: true
});
element.dispatchEvent(mouseOverEvent);
element.dispatchEvent(mouseEnterEvent);
element.dispatchEvent(mouseMoveEvent);
}
const element = document.querySelector(arguments[0]);
if (element) {
simulateHover(element);
return true;
}
return false;
""", css_selector)
def js_send_keys_by_selector(self, css_selector, text, secs=20):
"""iframe里input框输入内容"""
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, css_selector)))
"""通过 CSS 选择器直接 JavaScript 输入"""
script = """
var selector = arguments[0];
var text = arguments[1];
var element = document.querySelector(selector);
if (element) {
element.value = text;
// 触发事件
var inputEvent = new Event('input', { bubbles: true });
var changeEvent = new Event('change', { bubbles: true });
element.dispatchEvent(inputEvent);
element.dispatchEvent(changeEvent);
return true;
} else {
return false;
}
"""
result = self.driver.execute_script(script, css_selector, text)
return result
def get_style_object(self, css_selector, secs=20):
"""使用 JavaScript 获取完整的 style 对象"""
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, css_selector)))
style_object = self.driver.execute_script("""
const element = document.querySelector(arguments[0]);
if (element) {
// 将 CSSStyleDeclaration 对象转换为普通对象
const style = element.style;
const result = {};
for (let i = 0; i < style.length; i++) {
const property = style[i];
result[property] = style[property];
}
return result;
}
return null;
""", css_selector)
return style_object
def get_excel_data(self, file_path):
# 加载已有的 Excel 文件
wb = load_workbook(file_path)
# 获取指定的工作表
# ws = wb['Sheet'] 获取默认的 Sheet 工作表
ws = wb.worksheets[0] # 通过索引获取
# 遍历读取所有单元格数据
# for row in ws.iter_rows(values_only=True):
# print(row)
# 读取指定单元格的数据
print('第1行第1个单元格的内容是:--->', ws['A1'].value)
print('第1行第2个单元格的内容是:--->', ws['B1'].value)
print('第3行第1个单元格的内容是:--->', ws['A3'].value)
print('第3行第2个单元格的内容是:--->', ws['B3'].value)
print('第3行第3个单元格的内容是:--->', ws['C3'].value)
print('第3行第4个单元格的内容是:--->', ws['D3'].value)
print('第3行第5个单元格的内容是:--->', ws['E3'].value)
def click_outside_js_son(self, x, y):
"""模拟鼠标点击弹窗外区域,坐标点击"""
mouse = MouseController()
# 移动到指定位置并点击
mouse.position = (x, y) # 设置鼠标位置
time.sleep(0.1) # 短暂延迟
mouse.click(Button.left, 1) # 左键单击
def get_text_forward(self):
"""获取到前往XXX页的文本"""
input_value = self.d.driver.execute_script("""
// 查找页面中value为"4"的输入框并返回其值
var inputs = document.getElementsByClassName('el-input__inner');
for(var i = 0; i < inputs.length; i++){
if(inputs[i].type === 'number' && inputs[i].value === '4'){
return inputs[i].value;
}
}
return null; // 未找到时返回null
""")
return input_value
if __name__ == '__main__':
driver = Pyse("chrome") # 打开一个chrome浏览器
浙公网安备 33010602011771号