14 Web 自動(dòng)化測試 -- PageObject 思想

到這節(jié)課為止我們已經(jīng)基本上把WebDriver和TestNG的基礎(chǔ)都講完了,下去開始講講實(shí)戰(zhàn)過程中我們會(huì)用到的一些思想和工具闹炉。

例如這節(jié)我們要講的PageObject思想蒿赢。相信如果現(xiàn)在你們的腳本已經(jīng)經(jīng)過幾個(gè)迭代的修改了,你們一定會(huì)遇到一個(gè)頭痛的問題渣触,那就是頁面變化诉植,以前腳本的定位方式不能用了,得修改定位方式昵观,那如果以往的腳本沒有用PageObject思想晾腔,意味著你得一個(gè)一個(gè)Case中把需要修改的定位方式找出來,然后再進(jìn)行修改啊犬。這不但照成腳本維護(hù)的成本加大灼擂,也可能照成大量代碼冗余。

那這時(shí)候PageObject就顯得尤為重要觉至。 那什么是PageObject呢剔应?

什么是PageObject思想

PageObject 見名思意,就是頁面對象语御。說白就是把頁面元素定位和頁面元素操作分開峻贮。
PageObject在實(shí)戰(zhàn)過程中我們回對腳本實(shí)現(xiàn)進(jìn)行分層。通常做法是分三層:

  1. 對象庫層
  2. 邏輯層
  3. 業(yè)務(wù)層

對象層用于存放我們的頁面元素和一些特殊控件操作应闯。邏輯層則是一些封裝好的功能用例模塊纤控。業(yè)務(wù)層則是我們真正的測試用例的操作。

當(dāng)然如果我們的測試數(shù)據(jù)量大時(shí)碉纺,我們還可以在三層基礎(chǔ)上再加一層 數(shù)據(jù)層船万,用于存放我們的測試數(shù)據(jù)刻撒,這也是比較常規(guī)的做法。

  1. 對象庫層
  2. 邏輯層
  3. 業(yè)務(wù)層
  4. 數(shù)據(jù)層

實(shí)戰(zhàn)例子

廢話不多說我們直接來看個(gè)例子耿导,我們還是以163郵箱登錄為例子声怔。

對象庫層

首先我們新建個(gè)叫LoginPage的類,編寫登錄頁面所有可能需要操作的元素定位方式和操作舱呻,代碼示例如下:

package com.selenium.pageobjcet;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

/**
 * Created by 米陽 on 14/10/2017.
 */
public class LoginPage {

    // 定位 ifrmae
    public static By loginFrame = By.id("x-URS-iframe");
    // 定位 郵箱地址輸入框
    public static By emailField = By.name("email");
    // 定位 密碼輸入框
    public static By pwdFiled = By.name("password");
    // 定位 登錄按鈕
    public static By loginBtn = By.id("dologin");


    WebDriver driver;

    public LoginPage(WebDriver driver) {
        this.driver = driver;
    }

    /**
     * 往郵箱文本框輸入郵箱
     * @param email 郵箱地址
     */
    public void sendKeysEmail(String email) {
        driver.findElement(emailField).clear();
        driver.findElement(emailField).sendKeys(email);
    }

    /**
     * 往密碼文本框輸入密碼 
     * @param pwd 密碼
     */
    public void sendKeysPWD(String pwd) {
        driver.findElement(pwdFiled).clear();
        driver.findElement(pwdFiled).sendKeys(pwd);
    }

}

這里我們只把郵件輸入框和密碼輸入框的操作進(jìn)行封裝醋火,當(dāng)然如果為了便于閱讀也可以把所有的元素操作進(jìn)行封裝取名。


操作層

我們再新建個(gè)叫LoginMail的類箱吕,用于登錄邏輯封裝胎撇,供業(yè)務(wù)層Case調(diào)用,實(shí)現(xiàn)如下:

package com.selenium.pageobjcet;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

/**
 * Created by 米陽 on 14/10/2017.
 */
public class LoginMail {
    WebDriver driver;

    public LoginMail(WebDriver driver) {
        this.driver = driver;
    }

    /**
     * 登陸
     *
     * @param emial 郵箱地址
     * @param pwd   密碼
     */
    public void login(String emial, String pwd) {
        LoginPage loginPage = new LoginPage(driver);
        WebElement element = driver.findElement(LoginPage.loginFrame);
        driver.switchTo().frame(element);
        loginPage.sendKeysEmail(emial);
        loginPage.sendKeysPWD(pwd);
        driver.findElement(LoginPage.loginBtn).click();
    }
}

業(yè)務(wù)層

最后我們來看下業(yè)務(wù)層的封裝殖氏,也就是我們真正Case的編寫:

package com.selenium.pageobjcet;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.util.concurrent.TimeUnit;

/**
 * Created by 米陽 on 14/10/2017.
 */
public class LoginTest {
    WebDriver driver;

    @BeforeClass
    public void openChrome() {
        System.setProperty("webdriver.chrome.driver", "./drivers/chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

    @Test
    public void testLogin2() {
        driver.get("http://mail.163.com/");
        LoginMail loginMail = new LoginMail(driver);
        loginMail.login("meyoungtester", "meyoung123");
    }

    @AfterClass
    public void closedChrome() {
        driver.quit();
    }

}


小結(jié)

經(jīng)過我們對登陸功能的改裝晚树,采用了PageObject思想后,假設(shè)以后要是登錄頁面的A元素變更雅采,我們就不需要在工程里面到處找用到這個(gè)A元素的Case去修改他們的定位方式爵憎,我們只需要打開我們的LoginPage,找到A元素的定位方式婚瓜,進(jìn)行修改宝鼓,則整個(gè)工程用到A元素定位的就自然而然的修改了。同樣如果哪天登錄流程變更了巴刻,例如登錄過程必須輸入驗(yàn)證碼愚铡,那么我們也不需要把所有Case涉及到登錄的都找出來,插入輸入驗(yàn)證碼過程胡陪,只需要在先在LoginPage里面登陸驗(yàn)證碼的定位方式沥寥,接著加入打開LoginMail,在登錄邏輯里面加入我們的驗(yàn)證碼輸入步驟柠座,則用到登錄邏輯的所有Case則不需要其他維護(hù)邑雅。


PageObject 的優(yōu)點(diǎn)

一張圖差不多對PO思想引入的前后對比。PO思想對界面交互細(xì)節(jié)進(jìn)行了封裝妈经,這樣可以使我們的自動(dòng)化測試腳本案例更關(guān)注業(yè)務(wù)淮野,而非界面細(xì)節(jié),提高了測試案例的可讀性吹泡。

image.png

PageFactory

PageFactory 整體思想同于PageObject思想骤星,只是表象顯示上不太一樣,它通過注解的方式來定位元素對象爆哑,例如:

對象庫層:

    @FindBy(id = "kw")
    public static WebElement emailName;

Case使用:

    @Test
    public void test(){
        driver.get("https://www.baidu.com");
        // 初始化 LoginPage
        PageFactory.initElements(driver ,LoginPage.class);
        LoginPage.emailName.sendKeys("Test");
    }

PageObject VS PageFactor

WebDriver 提供了這兩種元素對象管理的思想洞难,總的來說沒有誰好誰壞,看個(gè)人習(xí)慣泪漂,實(shí)際工程也可以兩者結(jié)合使用廊营。就個(gè)人而言更習(xí)慣PageObject思想,但PageFactor也不錯(cuò)萝勤,通過注解方式代碼看起來更加簡潔露筒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敌卓,隨后出現(xiàn)的幾起案子慎式,更是在濱河造成了極大的恐慌,老刑警劉巖趟径,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘪吏,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜗巧,警方通過查閱死者的電腦和手機(jī)掌眠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幕屹,“玉大人蓝丙,你說我怎么就攤上這事⊥希” “怎么了渺尘?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長说敏。 經(jīng)常有香客問我鸥跟,道長,這世上最難降的妖魔是什么盔沫? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任医咨,我火速辦了婚禮,結(jié)果婚禮上架诞,老公的妹妹穿的比我還像新娘腋逆。我一直安慰自己,他們只是感情好侈贷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布惩歉。 她就那樣靜靜地躺著,像睡著了一般俏蛮。 火紅的嫁衣襯著肌膚如雪撑蚌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天搏屑,我揣著相機(jī)與錄音争涌,去河邊找鬼。 笑死辣恋,一個(gè)胖子當(dāng)著我的面吹牛亮垫,可吹牛的內(nèi)容都是我干的模软。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼饮潦,長吁一口氣:“原來是場噩夢啊……” “哼燃异!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起继蜡,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤回俐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后稀并,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仅颇,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年碘举,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忘瓦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡引颈,死狀恐怖政冻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情线欲,我是刑警寧澤明场,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站李丰,受9級(jí)特大地震影響苦锨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜趴泌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一舟舒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗜憔,春花似錦秃励、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呐舔,卻和暖如春币励,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背珊拼。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工食呻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓仅胞,卻偏偏與公主長得像每辟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子干旧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348