更多內(nèi)容請查看:
從零開始搭建WEB自動化框架01 —— Pytest 使用
從零開始搭建WEB自動化框架02 —— POM 設(shè)計模式
從零開始搭建WEB自動化框架03 —— 元素類
本系列學(xué)習(xí)文章適合的對象為已經(jīng)掌握 Selenium 基礎(chǔ)用法,并有一定實踐經(jīng)驗的同學(xué)搞莺。同時挤巡,希望你可以理解 Page Object Model 設(shè)計模型饵隙。
現(xiàn)在,基礎(chǔ)的元素碴开,Pytest框架已經(jīng)都搭建好了中跌,但是我們的整個框架依然非常的單薄须妻,并沒有任何實質(zhì)性的內(nèi)容呈現(xiàn)。
所以煞额,接下來我們需要針對這個P(Page)做一個類化思恐,讓更實際的內(nèi)容填充到框架中。
Page內(nèi)容并不會全部展示膊毁,有興趣的可以移步github查看胀莹。
上一篇文章已經(jīng)提到過了,什么是類婚温?
類就是具體事務(wù)中提取出來的共性描焰。
元素都會有自己的標(biāo)簽,各種屬性栅螟,所以我們可以依據(jù)這一點荆秦,整理出一個基礎(chǔ)元素類 Element 篱竭,那同樣的,頁面也都有自己的共性萄凤,在做具體頁面的內(nèi)容時室抽,我們需要先將這些頁面的共性提取出來,做一個公共頁面類 PageBase靡努。
每個公司的產(chǎn)品都有自己的特性坪圾、適配的操作系統(tǒng)等,我也是根據(jù)當(dāng)前的情況做了一個提煉惑朦,更多的共性需要各位自己去挖掘兽泄。
class PageCommon(object):
def __init__(self, ed_driver):
self._ed_driver = ed_driver
self._cur_dur = 0
self._focus = None
def close(self):
self._ed_driver.close()
self._ed_driver.switch_to.window(self._ed_driver.window_handles[-1])
def scroll_top(self, dur=300):
fact_dur = self._cur_dur - dur
js = "var q=document.documentElement.scrollTop={}".format(fact_dur)
self._ed_driver.execute_script(js)
self._cur_dur = fact_dur if fact_dur > 0 else 0
def scroll_bottom(self, dur=300):
fact_dur = self._cur_dur + dur
js = "var q=document.documentElement.scrollTop={}".format(fact_dur)
self._ed_driver.execute_script(js)
self._cur_dur = fact_dur
我公司是以Web為主,所以以上代碼更適合Web端漾月。當(dāng)然還有更多特性是基于業(yè)務(wù)的病梢,所以就沒有都寫出來。
這里面有一個很關(guān)鍵的地方梁肿,就是它的入?yún)ⅲ篹d_driver蜓陌。
它代表了當(dāng)前的頁面、元素吩蔑、操作是歸屬于哪個瀏覽器的钮热,在并行測試時,這個非常重要烛芬,可以明確你的測試指令發(fā)送到哪個瀏覽器中隧期。
driver 的獲取屬于基礎(chǔ)操作,如果不理解的話可能需要回去再看一下 Selenium 初始化相關(guān)的內(nèi)容赘娄。
當(dāng)擁有基類后仆潮,所有頁面都應(yīng)該繼承這個頁面。
當(dāng)然遣臼,也可能你有一個基類性置,但是基于業(yè)務(wù)形態(tài),可能會有更多的次基類以適配不同的業(yè)務(wù)暑诸,這些就需要自行探索如何設(shè)置繼承了蚌讼。
class StartProcessPage(PageCommon):
def __init__(self, ed_driver):
super().__init__(ed_driver)
self.start_btn = Button(self._ed_driver, By.XPATH, ct.XPATH_SP_START_BTN)
self.start_time_input = InputView(self._ed_driver, By.XPATH, ct.XPATH_SP_START_TIME_INPUT)
接下來就是設(shè)置具體頁面,并且在頁面中初始化元素个榕。
從這里就可以看出來篡石,我們的頁面其實是承載元素的,而具體的操作則在各自元素中已經(jīng)進(jìn)行了定義西采,做到了完全的分離凰萨。
(詳細(xì)可以見元素篇)
使用時,可以直接元素+操作的形式。
spp = StartProcessPage(driver)
spp.start_time_input.input("xxxx")
spp.start_btn.click()
這樣胖眷,一個非常簡單的測試操作就已經(jīng)完成了
當(dāng)然武通,以上的設(shè)置都是基于最小顆粒度去進(jìn)行的,當(dāng)應(yīng)用到實際業(yè)務(wù)時珊搀,還可以有更多的適配冶忱。
比如將常用操作封裝到一個方法中:
def start_process(self):
self.start_time_input.input("xxxx")
self.start_btn.click()
更多操作可以參考一下其他人的文章,在頁面類中境析,其實可以變通的地方是非常多的囚枪,它主要是明確一下,我們的操作都是基于頁面而展開的劳淆,這樣在可讀性链沼、維護(hù)上都很有優(yōu)勢。
當(dāng)有了頁面信息沛鸵、頁面元素括勺、一些基礎(chǔ)操作集合之后,一個頁面類大體就完成了曲掰,通過上面的操作已經(jīng)可以開始進(jìn)行流程操作了疾捍,它甚至已經(jīng)可以開始承載我們的自動化測試了,比如:
def test_start_a_order(self, driver):
spp = StartProcessPage(driver)
op = OrderPage(driver)
with step('開始一個訂單'):
op.click_start_process_btn()
spp.start_process()
op.check_order_is_started()
但是好像還缺點東西栏妖,比如說操作日志好像沒有拾氓?