1. 程式人生 > 其它 >web自動化框架設計

web自動化框架設計

from time import sleep
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver import ActionChains
from selenium.webdriver.ie.options import Options
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
import sys


# BasePage的定義是,它是一個其他page的公共方法的封裝,它是一個底層使用的框架

class BasePage:

def __init__(self, driver_base_page: WebDriver = None):

if driver_base_page is None:
_driver_type = 'chrome'
if _driver_type == 'chrome':
self.driver = webdriver.Chrome()
elif _driver_type == 'ie':
cap = Options()
cap.ignore_zoom_level = True
self.driver = webdriver.Ie(options=cap)
else:
self.driver = driver_base_page
# if self._base_url != '':
# self.driver.get(self._base_url)
# # 視窗最大化
self.driver.maximize_window()

# 新增隱式等待,判斷元素是否載入到DOM
self.driver.implicitly_wait(10)

# 封裝查詢單個元素+顯示等待6秒
def _find(self, *locator) -> WebElement:
# 優先先判斷頁面有沒有載入等待的標識
js1 = 'return document.getElementsByClassName("ant-spin-dot")'
# 獲取查詢等待的標識
ele = len(self.driver.execute_script(js1))
while ele > 0: # 查詢到等待標識則繼續查詢標識,直到標識消失
ele = len(self.driver.execute_script(js1))
WebDriverWait(self.driver, 5).until(lambda x: x.find_element(*locator), message="沒有找到元素")
return self.driver.find_element(*locator)

# 封裝多個元素查詢方法
def _finds(self, *locator) -> list[WebElement]:
# 優先先判斷頁面有沒有載入等待的標識
js1 = 'return document.getElementsByClassName("ant-spin-dot")'
# 獲取查詢等待的標識
ele = len(self.driver.execute_script(js1))
while ele > 0: # 查詢到等待標識則繼續查詢標識,直到標識消失
ele = len(self.driver.execute_script(js1))
WebDriverWait(self.driver, 5).until(lambda x: x.find_element(*locator), message="沒有找到元素")
return self.driver.find_elements(*locator)

# 查詢元素後進行點選操作,僅用於滑鼠左擊
def _click(self, *locator):
# 優先先判斷頁面有沒有載入等待的標識
js1 = 'return document.getElementsByClassName("ant-spin-dot")'
# 獲取查詢等待的標識
ele = len(self.driver.execute_script(js1))
while ele > 0: # 查詢到等待標識則繼續查詢標識,直到標識消失
ele = len(self.driver.execute_script(js1))
WebDriverWait(self.driver, 5).until(lambda x: x.find_element(*locator), message="沒有找到元素")
try:
WebDriverWait(self.driver, 3).until(
expected_conditions.element_to_be_clickable(locator))
self.driver.find_element(*locator).click()
except TimeoutException:
self.driver.find_element(*locator).click()

def _select(self, *locator):
WebDriverWait(self.driver, 5).until(lambda x: x.find_element(*locator), message="沒有找到元素")
element = self.driver.find_element(*locator)
sleep(0.5)
return element

# 獲取查詢結果
def _get_search_res(self, *locator):
js1 = 'return document.getElementsByClassName("ant-spin-dot")'
# 優先判斷頁面是否存在等待的標識
ele = len(self.driver.execute_script(js1))
while ele > 0: # 查詢到等待標識則繼續查詢標識,直到標識消失
ele = len(self.driver.execute_script(js1))
else:
# 因為查詢結束後頁面更新資料需要時間,強制等待1.5秒
sleep(1.5)
try:
WebDriverWait(self.driver, 8).until(lambda x: x.find_element(*locator), message="沒有找到元素")
elements = self.driver.find_elements(*locator)
except TimeoutException:
elements = None
return elements

# 等待頁面載入完成
def _wait(self, time=0.5):
js1 = 'return document.getElementsByClassName("ant-spin-dot")'
# 獲取查詢等待的標識
ele = len(self.driver.execute_script(js1))
while ele > 0: # 查詢到等待標識則繼續查詢標識,直到標識消失
ele = len(self.driver.execute_script(js1))
sleep(time)

# 搜尋後勾選一條資料(find)
def _find_to_search_one(self, *locator):
# 查詢過程,等待查詢動作完成才能去獲取查詢列表,所以對頁面查詢的是否存在查詢等待的元素
js1 = 'return document.getElementsByClassName("ant-spin-dot")'
ele = len(self.driver.execute_script(js1))
# 輪詢查詢等待的元素是否存在
while ele > 0:
ele = len(self.driver.execute_script(js1))
else: # 元素不存在是說明查詢結束了
WebDriverWait(self.driver, 60, 0.5).until(
expected_conditions.presence_of_element_located(locator))
sleep(1)
element = self.driver.find_element(*locator)
return element

# 滑鼠左鍵雙擊
def _double_ckick(self, *locator):
# 獲取目標元素
ele_input = self.driver.find_element(*locator)
ActionChains(self.driver).double_click(ele_input).perform() # 使用雙擊目標元素
sleep(1)

# 封裝關閉瀏覽器,資源回收
def quit(self):
return self.driver.quit()


if __name__ == "__main__":
# print(sys.path)

sys.path.append("E:\\git\\auto-test\\fusion_fintrade\\pages\\login.py")
print(sys.path)