不多說,直接看代碼如下:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
class webutils():
def __init__(self, browser='firefox'):
'''
:param browser: 瀏覽器對象
:return:
'''
if browser == "firefox" :
driver = webdriver.Firefox()
elif browser == "chrome":
driver = webdriver.Chrome()
elif browser == "ie" :
DesiredCapabilities.INTERNETEXPLORER['ignoreProtectedModeSettings'] = True
driver = webdriver.Ie("../resources/drivers/IEDriverServer.exe")
elif browser == "phantomjs":
driver = webdriver.PhantomJS()
try:
self.driver = driver
except Exception:
raise NameError("Not found this browser,You can enter 'firefox', 'chrome', 'ie' or 'phantomjs'.")
def getElement(self,by,value):
'''
:param by: 查找元素的方式
:param value: 文本值
:return: 查找到的元素
'''
if by=="id":
return self.driver.find_element_by_id(value)
elif by=="class":
return self.driver.find_element_by_class_name(value)
elif by=="name":
return self.driver.find_element_by_name(value)
elif by=="css":
return self.driver.find_element_by_css_selector(value)
elif by=="linktext":
return self.driver.find_element_by_link_text(value)
elif by=="partcialtext":
return self.driver.find_element_by_partial_link_text(value)
elif by=="tag":
return self.driver.find_element_by_tag_name(value)
elif by=='xpath':
return self.driver.find_element_by_xpath(value)
elif by=='js'or by=="jquery":
return self.ExcuteJs(value)
else:
print ("請輸入適合的查找元素方式。。。")
def ExcuteJs(self,js):
'''
:param js: js查找元素方式,或jQuery
:return: 找到元素
'''
self.driver.execute_script(js)
def SetTextBox(self,text,by,value):
'''
:param text: 設置文本框的值
:param by: 查找元素的方式
:param value: 文本值
:return:
'''
element=self.getElement(by,value)
self.driver.execute_script("arguments[0].innerHTML = \"" + text + "\"",element)
def getTextBox(self,by,value):
'''
:param by: 查找元素的方式
:param value: 文本值
:return: 返回富文本框的值
'''
elment=self.getElement(by,value)
return self.driver.execute_script("arguments[0].innerHTML()",elment)
def InputByJs(self,by,value):
'''
:param by: 查找元素的方式
:param value: 文本值
:return:
'''
element=self.getElement(by,value)
self.driver.execute_script("arguments[0].value=\""+value+"\"",element)
def scrollToElement(self,by,value):
'''
:param by: 查找元素的方式
:param value: 文本值
:return:
'''
elment=self.getElement(by,value)
self.driver.execute_script("arguments[0].scrollIntoViewIfNeeded(true);",elment)
def SwitchWindow_Two(self):
'''
適用於兩個窗口的切換
:return:
'''
CurrentHandle=self.driver.current_window_handle
handles=self.driver.window_handles
for handle in handles:
if handle==CurrentHandle:
continue
else:
self.driver._switch_to.window(handle)
def SwitchWindow_By_Tltle(self,Title):
'''
:param Title: 瀏覽器窗口標題
:return:
'''
flag=False
CurrentHandle=self.driver.current_window_handle
handles=self.driver.window_handles
for handle in handles:
if handle==CurrentHandle:
continue
else:
self.driver.switch_to_window(handle)
if Title in self.driver.title:
flag=True
return flag
return flag
def SwitchWindow_By_Url(self,url):
'''
:param url: 需要切換窗口的url
:return:
'''
flag=False
CurrentHandle=self.driver.current_window_handle
handles=self.driver.window_handles
for handle in handles:
self.driver.switch_to_window(handle)
if url in self.driver.current_url:
flag=True
return flag
return flag
def max_window(self):
'''
:return: 最大化窗口
'''
self.driver.maximize_window()
def getUrl(self,url):
'''
:param url: 轉向地址
:return:
'''
self.driver.get(url)
def wait(self,seconds):
'''
:param seconds: 等待時間
:return:
'''
self.driver.implicitly_wait(seconds)
def Close(self):
'''
:return: 關閉窗口
'''
self.driver.close()
def Quit(self):
'''
:return: 退出瀏覽器
'''
self.driver.quit()
def find_element(self,element):
"""
Judge element positioning way, and returns the element.
Usage:
driver.find_element 此為元組(id,kw),此方法為PageObject模式准備方法
"""
by = element[0]
value = element[1]
if by == "id":
return self.driver.find_element_by_id(value)
elif by == "name":
return self.driver.find_element_by_name(value)
elif by == "class":
return self.driver.find_element_by_class_name(value)
elif by == "text":
return self.driver.find_element_by_link_text(value)
elif by == "text_part":
return self.driver.find_element_by_partial_link_text(value)
elif by == "xpath":
return self.driver.find_element_by_xpath(value)
elif by == "css":
return self.driver.find_element_by_css_selector(value)
else:
raise NameError("Please enter the correct targeting elements,'id','name','class','text','xpath','css'.")
def wait_element(self, element, seconds=5):
"""
等待元素在指定的時間類出現
:param element: 元素的定位表達式
:param seconds: 等待的時間
:return:
"""
by = element[0]
value = element[1]
if by == "id":
WebDriverWait(self.driver,seconds,1).until(EC.presence_of_element_located((By.ID, value)))
elif by == "name":
WebDriverWait(self.driver,seconds,1).until(EC.presence_of_element_located((By.NAME, value)))
elif by == "class":
WebDriverWait(self.driver,seconds,1).until(EC.presence_of_element_located((By.CLASS_NAME, value)))
elif by == "text":
WebDriverWait(self.driver,seconds,1).until(EC.presence_of_element_located((By.LINK_TEXT, value)))
elif by == "xpath":
WebDriverWait(self.driver,seconds,1).until(EC.presence_of_element_located((By.XPATH, value)))
elif by == "css":
WebDriverWait(self.driver,seconds,1).until(EC.presence_of_element_located((By.CSS_SELECTOR, value)))
else:
raise NameError("Please enter the correct targeting elements,'id','name','class','text','xpaht','css'.")
def Send_Keys(self,element,value):
'''
:param element: 元素的定位表達式
:param value: 輸入值
:return:
'''
self.wait_element(element)
self.find_element(element).clear()
self.find_element(element).send_keys(value)
def Click(self,element):
'''
功能:點擊
:param element: 元素的定位表達式
:return:
'''
self.wait_element(element)
self.find_element(element).click()
def Right_Click(self,element):
'''
功能:右擊
:param element: 元素的定位表達式
:return:
'''
self.wait_element()
ActionChains.context_click(self.find_element(element)).perform()
def MoveToElement(self,element):
'''
功能:移動到元素
:param element: 元素的定位表達式
:return:
'''
self.wait_element(element)
ActionChains.move_to_element(self.find_element(element)).perform()
def double_click(self,element):
'''
功能:雙擊元素
:param element: 元素的定位表達式
:return:
'''
self.wait_element(element)
ActionChains.double_click(self.find_element(element)).perform()
def drag_and_drop(self,element):
'''
功能:拖拽元素
:param element: 元素的表達式
:return:
'''
self.wait_element(element)
ActionChains.drag_and_drop(self.find_element(element)).perform()
def back(self):
'''
功能:返回
:return:
'''
self.driver.back()
def forward(self,element):
'''
:param element: 元素的表達式
:return:
'''
self.driver.forward()
def get_attribute(self, element, attribute):
"""
功能:得到元素的屬性值
:param element: 元素表達式
:param attribute: 屬性名稱
:return:
"""
self.wait_element(element)
return self.find_element(element).get_attribute(attribute)
def get_text(self, element):
"""
:param element: 元素表達式
:return: 返回的是元素的文本值
"""
self.wait_element(element)
return self.find_element(element).text
def get_display(self, element):
"""
功能:判斷元素是否顯示
:param element: 元素表達式
:return:
"""
self.wait_element(element)
return self.find_element(element).is_displayed()
def get_title(self):
"""
功能:得到瀏覽器的標題
:return:
"""
return self.driver.title
def get_url(self):
"""
功能:得到瀏覽器的url
:return:
"""
return self.driver.current_url
def get_screenshot(self, file_path):
"""
功能:截圖並保存
:param file_path: 文件路徑
:return:
"""
self.driver.get_screenshot_as_file(file_path)
def submit(self, element):
"""
功能:提交特定的表單
:param element: 元素表達式
:return:
"""
self.wait_element(element)
self.find_element(element).submit()
def switch_to_frame(self, element):
"""
功能:切換到特定的frame
:param element: 元素的表達式
:return:
"""
self.wait_element(element)
self.driver._switch_to_frame(self.find_element(element))
def switch_to_frame_out(self):
"""
功能:切換到默認的上下文
:return:
"""
self.driver.switch_to.default_content()
def F5(self):
'''
功能:刷新頁面
:return:
'''
self.driver.refresh()
def accept_alert(self):
"""
功能:確認按鈕
:return:
"""
self.driver.switch_to.alert.accept()
def dismiss_alert(self):
"""
功能:對話框取消
:return:
"""
self.driver.switch_to.alert.dismiss()
