一、selenium常用方法封裝(baseselenium.py)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import os
from Common.log_utils import LogUtils
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import pyperclip
import allure
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
class driver():
# 調(diào)用瀏覽器,可以考慮寫(xiě)到conftest.py
def open_browser(self, browser_type):
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
if browser_type == 'chrome':
driver = webdriver.Chrome(options=options)
return driver
elif browser_type == 'firefox':
driver = webdriver.firefox()
else:
print('type error')
class BaseSelenium(object):
def __init__(self, driver):
"""WebDriver需以參數(shù)的形式傳入,否則運(yùn)行時(shí)會(huì)導(dǎo)致多個(gè)瀏覽器窗口被打開(kāi)"""
self.driver = driver
"""log類(lèi)實(shí)例化"""
self.log = LogUtils()
# 調(diào)用瀏覽器
def open_browser(self, browser_type):
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
if browser_type == 'chrome':
driver = webdriver.Chrome(options=options)
return driver
elif browser_type == 'firefox':
driver = webdriver.firefox()
else:
print('type error')
#關(guān)閉瀏覽器
def quit(self):
self.driver.quit()
"傳入U(xiǎn)RL,最大化窗口"
def open_url(self, url):
self.driver.maximize_window()
self.url = "https://%s" % url
self.driver.get(self.url)
"獲取title"
def get_title(self):
self.log.info("獲取頁(yè)面title")
try:
self.log.info("當(dāng)前頁(yè)面title為:{}".format(self.driver.title))
return self.driver.title
except Exception as e:
self.log.error("獲取頁(yè)面title失敗{}".format(e))
self.screenshot_save()
"獲取頁(yè)面元素"
def get_element(self, *args):
sleep_time = 10
frequency = 0.5
if args is not None:
try:
# 顯式等待,等待元素可見(jiàn)
element = WebDriverWait(self.driver, sleep_time, frequency).until(
EC.visibility_of_element_located(*args)
)
except Exception as e:
self.log.error("查找元素{}失?。簕}".format(args, e))
else:
return element
else:
self.log.error("element value is NUll")
def get_elements(self, *args):
sleep_time = 10
frequency = 0.5
if args is not None:
try:
# 顯式等待,等待元素可見(jiàn)
elements = WebDriverWait(self.driver, sleep_time, frequency).until(
EC.visibility_of_all_elements_located(*args)
)
except Exception as e:
self.screenshot_save()
self.log.error("查找元素{}失?。簕}".format(args, e))
else:
return elements
else:
self.log.error("element value is NUll")
"獲取頁(yè)面元素"
def get_element_presence(self, *args):
sleep_time = 10
frequency = 0.5
if args != None:
try:
# 顯式等待,等待元素存在
element = WebDriverWait(self.driver, sleep_time, frequency).until(
EC.presence_of_element_located(*args)
)
except Exception as e:
self.screenshot_save()
self.log.error("查找元素{}失?。簕}".format(*args, e))
else:
return element
else:
self.log.error("element value is NUll")
"等待元素可點(diǎn)擊"
def element_clickable(self, *args):
sleep_time = 10
frequency = 0.5
if args != None:
try:
# 顯式等待,等待元素可點(diǎn)擊
element = WebDriverWait(self.driver, sleep_time, frequency).until(
EC.element_to_be_clickable(*args)
)
if element:
return element
else:
self.screenshot_save()
except Exception as e:
self.screenshot_save()
self.log.error("查找元素{}失?。簕}".format(args, e))
else:
self.log.error("element value is NUll")
def click_clickable(self, name=None, *args):
try:
element = self.get_element(*args)
print(element)
element.click()
except Exception as e:
self.screenshot_save()
self.log.error("{}元素[{}]點(diǎn)擊失敗".format(name, e))
else:
self.log.info("點(diǎn)擊{},元素[{}]點(diǎn)擊成功".format(name, *args))
"模擬鍵盤(pán)輸入方法重寫(xiě)"
def send_key(self, value, *args):
if args is not None:
if value is not None and value != 'None':
try:
element = self.get_element(*args)
element.send_keys(str(value))
self.log.info("輸入值:{}".format(value))
except:
try:
element = self.get_element_presence(*args)
element.send_keys(str(value))
self.log.info("二次嘗試輸入值:{}".format(value))
except Exception as e:
self.log.error("輸入錯(cuò)誤:{}{}".format(value, e))
self.screenshot_save()
else:
self.log.warning("沒(méi)有傳入字符串,或輸入為空")
else:
self.log.error("沒(méi)有傳入元素")
"重寫(xiě)清空輸入框方法"
def clear_value(self, *args):
if args is not None:
try:
element = self.get_element(*args)
element.clear()
self.log.info("清除輸入框{}成功".format(*args))
except Exception as e:
self.log.error("清除輸入框{}失敗".format(e))
self.screenshot_save()
else:
self.log.error("沒(méi)有傳入元素")
"重寫(xiě)模擬鼠標(biāo)懸停方法"
def mouse_move(self, *args):
try:
action = self.get_element_presence(*args)
ActionChains(self.driver).move_to_element(action).perform()
self.log.info("鼠標(biāo)移動(dòng)到元素{}成功".format(*args))
except Exception as e:
self.log.error("鼠標(biāo)移動(dòng)至元素:{}失敗".format(e))
self.screenshot_save()
def double_click(self, name, *args):
if args:
try:
ele = self.get_element(*args)
ActionChains(self.driver).double_click(ele).perform()
self.log.info("雙擊{}成功".format(name))
except Exception as e:
self.log.error('雙擊元素{}失敗{}:'.format(args, e))
self.screenshot_save()
else:
self.log.error('傳入元素為空')
"重寫(xiě)表單提交方法"
def text_submit(self, *args):
try:
ele = self.get_element(*args)
ele.submit()
self.log.info("表單{}提交成功".format(*args))
except Exception as e:
self.log.error("表單{}提交失敗".format(e))
self.screenshot_save()
"重寫(xiě)頁(yè)面文字獲取方法"
def get_text(self, *args):
try:
text = self.get_element(*args).text
self.log.info("獲取文字 {} 成功".format(text))
return text
except Exception as e:
self.log.error("獲取文字失??!{},嘗試二次獲取".format(e))
try:
text = self.get_element_presence(*args).text
self.log.info("獲取文字 {} 成功".format(text))
return text
except Exception as e:
self.log.error("二次獲取文字失??!{}".format(e))
self.screenshot_save()
"多元素文字匹配"
def get_texts(self, *args):
text = []
try:
for ele in self.get_elements(*args):
text.append(ele.text)
except Exception as e:
self.log.error("獲取文字失敗!{}".format(e))
self.screenshot_save()
else:
self.log.info("獲取文字 {} 成功".format(text))
return text
"重寫(xiě)頁(yè)面截圖方法"
def screenshot_save(self, name=None):
p = os.path.abspath(os.path.dirname(os.getcwd()) + os.path.sep ) #xxx路徑
path=p+r'\xxx\Outputs\logs'
# print(path)
if name:
try:
file_path = os.path.join(path, name +
time.strftime("%Y.%m.%d-%H-%M-%S") + '.png')
self.driver.save_screenshot(file_path)
allure.attach(file_path, name, allure.attachment_type.PNG)
self.log.info("頁(yè)面[{}]截圖成功".format(self.get_url()))
except Exception as e:
self.log.error("截圖失敗{}".format(e))
else:
try:
file_path = os.path.join(path,
time.strftime("%Y.%m.%d-%H-%M-%S") + '.png')
self.driver.save_screenshot(file_path)
self.log.info("頁(yè)面[{}]截圖成功".format(self.get_url()))
except Exception as e:
self.log.error("截圖失敗{}".format(e))
"重寫(xiě)獲取當(dāng)前頁(yè)面URL方法"
def get_url(self):
url = self.driver.current_url
if url:
try:
self.log.info("獲取URL[{}]成功".format(url))
return url
except Exception as e:
self.log.error("獲取URL失敗{}".format(e))
else:
self.log.error("獲取url失敗")
"重寫(xiě)點(diǎn)擊元素方法"
def click_element(self, name=None, *args):
try:
element = self.get_element(*args)
element.click()
self.log.info("點(diǎn)擊{},元素[{}]點(diǎn)擊成功".format(name, *args))
except Exception as e:
self.log.error("{}元素[{}]第一次點(diǎn)擊失敗".format(name, e))
try:
self.log.info('切換到元素存在')
self.element_presence_click(name, *args)
except Exception as e:
self.log.error("{}元素[{}]第二次點(diǎn)擊失敗".format(name, e))
self.screenshot_save()
try:
self.log.info('切換到j(luò)s點(diǎn)擊')
self.js_click(name, *args)
except Exception as e:
self.log.error("{}元素[{}]第三次點(diǎn)擊失敗".format(name, e))
self.screenshot_save()
# 獲取元素值
def get_attribute(self, name, *args):
try:
attribute = self.get_element(*args).get_attribute(name)
if attribute:
self.log.info("獲取元素{}成功:{}".format(name, attribute))
return attribute
except Exception as e:
self.log.warning(e)
self.screenshot_save(name)
# 模擬回車(chē)方法
def keys_enter(self, *args):
try:
ele = self.get_element(*args)
ele.send_keys(Keys.ENTER)
self.log.info("元素{}回車(chē)成功".format(args))
except Exception as e:
self.log.error("模擬回車(chē)失敗,原因:{}".format(e))
self.screenshot_save()
# 模擬輸入框全選刪除
def keys_delete(self, *args):
try:
ele = self.get_element(*args)
ele.send_keys(Keys.CONTROL + "a")
ele.send_keys(Keys.BACKSPACE)
except Exception as e:
self.log.error("刪除失敗{}".format(e))
self.screenshot_save()
# 獲取剪切板信息
def get_paste(self, *args):
try:
ele = self.get_element(*args)
ele.send_keys(Keys.CONTROL + "a")
ele.send_keys(Keys.CONTROL + "c")
vls = pyperclip.paste()
self.log.info("獲取剪切板信息成功:{}".format(vls))
return vls
except Exception as e:
self.log.error("獲取剪切板失敗:{}".format(e))
# 刪除html屬性
def remove_art(self, js_path, art_name):
js = '{}.removeAttribute("{}");'.format(js_path, art_name)
try:
self.driver.execute_script(js)
self.log.info('運(yùn)行刪除{}屬性js腳本成功'.format(art_name))
except Exception as e:
self.log.error('運(yùn)行刪除#{}#js腳本失敗{}'.format(art_name, e))
# 通過(guò)js點(diǎn)擊
def js_click(self, name, *args):
element = self.get_element(*args)
try:
self.driver.execute_script("arguments[0].click();", element)
self.log.info('點(diǎn)擊{}成功'.format(name))
except Exception as e:
self.log.error('通過(guò)js點(diǎn)擊{}元素{}失敗'.format(name, e))
def js_get_text(self, *args):
element = self.get_element_presence(*args)
try:
res = self.driver.execute_script("arguments[0].getInnerHTML();", element)
self.log.info('獲取{}成功'.format(res))
except Exception as e:
self.log.error('通過(guò)js獲取{}元素{}失敗'.format(*args, e))
else:
return res
# 使用selenium默認(rèn)的點(diǎn)擊
def default_click(self, name, args):
try:
element = self.driver.find_element(*args)
element.click()
except Exception as e:
self.log.error('元素{}點(diǎn)擊失敗:{}'.format(*args, e))
else:
self.log.info('不加任何等待,直接點(diǎn)擊:{}'.format(name))
# 等待元素存在時(shí)點(diǎn)擊
def element_presence_click(self, name, *args):
try:
element = self.get_element_presence(*args)
element.click()
except Exception as e:
self.log.error("點(diǎn)擊{}元素[{}]點(diǎn)擊失敗".format(name, e))
else:
self.log.info("點(diǎn)擊{},元素[{}]點(diǎn)擊成功".format(name, *args))
二、頁(yè)面層(調(diào)用基類(lèi)進(jìn)行頁(yè)面元素定位,頁(yè)面操作)
page1
######項(xiàng)目頁(yè)面
from PageObjects.BaseSelenium import BaseSelenium
from selenium.webdriver.common.by import By
class Tt(BaseSelenium):
# def __init__(self,browser_type='chrome',url = 'www.baidu.com'):
# super(Tt, self).__init__(browser_type='chrome',url = 'www.baidu.com')
def test_baidu(self,key):
self.send_key(key, (By.ID, 'kw'))
self.element_presence_click('點(diǎn)擊百度一下',(By.ID,'su'))
def clear(self):
self.clear_value((By.ID, 'kw'))
page2文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-507651.html
######項(xiàng)目頁(yè)面
from PageObjects.BaseSelenium import BaseSelenium
from selenium.webdriver.common.by import By
class Tt1(BaseSelenium):
# def __init__(self,browser_type='chrome',url = 'www.baidu.com'):
# super(Tt1, self).__init__(browser_type='chrome',url = 'www.baidu.com')
def test_baidu1(self):
self.send_key('222', (By.ID, 'kw'))
self.element_presence_click('點(diǎn)擊百度一下',(By.ID,'su'))
def clear(self):
self.clear_value((By.ID, 'kw'))
三、用例層(調(diào)用頁(yè)面層組合成用例)
from PageLocators.page import Tt
from PageLocators.page1 import Tt1
from PageObjects.BaseSelenium import driver
from selenium.webdriver.common.by import By
class Test_1():
def setup_class(self):
d=driver().open_browser('chrome')
self.baidu = Tt(d)
self.baidu1 = Tt1(d)
self.baidu.open_url(url='www.baidu.com')
def test1(self):
self.baidu.test_baidu('LZP')
time.sleep(2)
self.baidu.clear_value((By.ID, 'kw'))
def test2(self):
self.baidu1.test_baidu1()
time.sleep(2)
self.baidu1.clear()
def test3(self):
self.baidu.test_baidu('LP')
time.sleep(2)
self.baidu.clear()
def teardown_class(self):
self.baidu.quit()
if __name__=='__main__':
pytest.main(['-s','test.py','-W','ignore:Module already imported:pytest.PytestWarning'])
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-507651.html
到了這里,關(guān)于python+selenium自動(dòng)化測(cè)試關(guān)鍵字驅(qū)動(dòng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!