python自动测试v_python下selenium自动化测试自我实践
周末實(shí)驗(yàn)自動(dòng)化提交數(shù)據(jù)時(shí),本來(lái)沒(méi)打算寫記錄的,不過(guò)遇到一些問(wèn)題,覺(jué)得可以提提。基本操作就不用寫了,搜索過(guò)程中都發(fā)現(xiàn)了兩個(gè)博客都出了selenium+python的書,說(shuō)明操作一搜一大把。
1. 等待頁(yè)面加載完成
本來(lái)用的sleep(),自己判斷的有的需要時(shí)間長(zhǎng)點(diǎn)就給3-4秒,時(shí)間短的頁(yè)面內(nèi)等待就0.5秒。但有時(shí)候網(wǎng)絡(luò)不穩(wěn)定可能需要的時(shí)間更長(zhǎng)就會(huì)拋錯(cuò)。發(fā)現(xiàn)文檔中有說(shuō):
顯式等待是你在代碼中定義等待一定條件發(fā)生后再進(jìn)一步執(zhí)行你的代碼。 最糟糕的案例是使用time.sleep(),它將條件設(shè)置為等待一個(gè)確切的時(shí)間段。
尷尬=-=! 但是最后我還是采用了sleep(),以后需要優(yōu)化再改吧。
一些跳轉(zhuǎn)鏈接的地方我用了 driver.current_url來(lái)獲取當(dāng)前URL和預(yù)期的作對(duì)比來(lái)完成操作。
2.開左右兩個(gè)窗口各占一半屏
使用maximize_window將瀏覽器最大化,然后用get_window_size獲取到寬高。接下來(lái)就只是簡(jiǎn)單的用set_window_rect置左右窗口位置和大小了。
def start(self, align=None):
""" 配置并啟動(dòng) """
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars') # 無(wú)提醒
#option.add_argument('headless') # 靜默運(yùn)行
self.driver = webdriver.Chrome(chrome_options=option)
# 置屏幕左右
if align:
# 全屏
self.driver.maximize_window()
# 獲取大小
size = self.driver.get_window_size()
width = size['width']
height = size['height']
if align == 'left':
self.driver.set_window_rect(0, 0, int(width/2), height)
elif align == 'right':
self.driver.set_window_rect(int(width/2), 0, int(width/2), height)
else:
pass
return self.driver
3. 多線程
上面明顯是一個(gè)執(zhí)行之后再另外一個(gè),剛好需要加多線程,正好測(cè)試測(cè)試。 類中的方法加多線程試出來(lái)一種辦法:
study = StudyMap('left')
study2 = StudyMap('right')
# for i in range(10):
# study.addCompleteMap()
#構(gòu)建線程
threads =[]
t = Thread(target=study.addCompleteMap)
threads.append(t)
t = Thread(target=study2.addCompleteMap)
threads.append(t)
#啟動(dòng)所有線程
for t in threads:
t.start()
先初始化兩個(gè)類,這個(gè)過(guò)程是單線程的,之后調(diào)用addCompleteMap方法使用多線程。ok。
想多次執(zhí)行addCompleteMap函數(shù)怎么辦呢,比如上面我注釋掉的
for i in range(10):
study.addCompleteMap()
加個(gè)函數(shù)試試,
study = StudyMap('left')
study2 = StudyMap('right')
def runx(cls):
for i in range(10):
cls.addCompleteMap()
# 構(gòu)建線程
threads = []
t = Thread(target=runx, args=(study,))
threads.append(t)
t = Thread(target=runx, args=(study2,))
threads.append(t)
# 啟動(dòng)所有線程
for t in threads:
t.start()
可以的,將runx方法多線程,參數(shù)為類對(duì)象。所以不管是普通方法還是類中的成員方法,用多線程來(lái)實(shí)現(xiàn)沒(méi)有多大區(qū)別。這不,都轉(zhuǎn)了一例。具體更深入的問(wèn)題,留到以后研究或者遇到了再研究吧。
4. 多線程取數(shù)據(jù)問(wèn)題
上面的還有問(wèn)題,業(yè)務(wù)中第二步有用數(shù)據(jù),兩個(gè)選擇了同樣的數(shù)據(jù)不能保存成功。以及有的頁(yè)面小屏看不到確定按鈕。(沒(méi)打算自動(dòng)化測(cè)試,只是想填數(shù)據(jù)。還真給測(cè)出了BUG)
1) 針對(duì)數(shù)據(jù)混亂問(wèn)題,加鎖
圖:多線程調(diào)用數(shù)據(jù)重復(fù),線程加鎖前
lock = threading.Lock()
# 選擇試卷需要加鎖
lock.acquire()
logging.info('[獲取試卷]')
... ... 其他邏輯處理
logging.info('[保存]')
lock.release()
圖:多線程加鎖后,數(shù)據(jù)調(diào)用完整
加鎖導(dǎo)致速度變慢,考慮取數(shù)據(jù)時(shí)可以分開取:第一個(gè)線程取第1行,第二個(gè)線程取第2行也可以,就取了鎖。用線程名取不同的數(shù)據(jù)。為了避免數(shù)據(jù)不夠最后多備1條數(shù)據(jù)。還有其他業(yè)務(wù)需同時(shí)取3條數(shù)據(jù),同理。
線程加name:
# 構(gòu)建線程
threads = []
t = Thread(target=runx, args=(study,), name="t1")
threads.append(t)
t = Thread(target=runx, args=(study2,), name='t2')
threads.append(t)
判斷獲取不同的數(shù)據(jù),為了清晰,在另外一處業(yè)務(wù)取不同的3條數(shù)據(jù)處來(lái)查看:
原寫法:
self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[1]").click()
self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[2]").click()
self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[3]").click()
修改為:根據(jù)線程獲取不同數(shù)據(jù)
if threading.current_thread().name == 't1':
tn = 1
else:
tn = 4
# 線程1->取123行, 2->456行
self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[{0}]".format(tn)).click()
self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[{0}]".format(tn+1)).click()
self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[{0}]".format(tn+2)).click()
圖:不用鎖,不同線程選擇不同數(shù)據(jù)
2) 針對(duì)按鈕看不到,放全屏操作完后,再還原
為了重置窗口大小,將1節(jié)中的方法拆分
from selenium import webdriver
from time import sleep
class AutoSubmit():
""" 自動(dòng)提交測(cè)試 """
def __init__(self):
self.rect = (0, 0, 800, 600)
pass
def start(self, align=None):
""" 配置并啟動(dòng) """
logging.info('配置并啟動(dòng)Chrome')
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars') # 無(wú)提醒
#option.add_argument('headless') # 靜默運(yùn)行
self.driver = webdriver.Chrome(chrome_options=option)
# 置屏幕左右
if align:
# 全屏
self.driver.maximize_window()
# 獲取大小
size = self.driver.get_window_size()
width = size['width']
height = size['height']
if align == 'left':
self.rect=(0, 0, int(width/2), height)
elif align == 'right':
self.rect=(int(width/2), 0, int(width/2), height)
else:
pass
# 設(shè)置窗口
self.setWindow()
return self.driver
def setWindow(self, *, maxWindow=False, minWindow=False):
""" 設(shè)置窗口位置和大小 """
if maxWindow:
self.driver.maximize_window()
elif minWindow:
self.driver.minimize_window()
else:
self.driver.set_window_rect(*self.rect)
start()中左右屏幕只改變self.rect變量,調(diào)用setWdindow()方法重置大小,不傳參則為當(dāng)前rect大小,傳maxWindow/minWindow則放大縮小。
調(diào)用打開左右兩個(gè)窗口
# 左右兩個(gè)窗口
driver1 = a1.start('left')
driver2 = a2.start('right')
窗口2全屏加載bing首頁(yè),并置原大小
# 需要全屏?xí)r
a2.setWindow(maxWindow=True)
driver2.get('http://bing.com')
sleep(2)
a2.setWindow()
參考資料
總結(jié)
以上是生活随笔為你收集整理的python自动测试v_python下selenium自动化测试自我实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux 休眠定时唤醒_Linux重启
- 下一篇: python考试搜题-大学mooc用Py