1. 程式人生 > >兩種web免登入自動化測試實現方法及比較

兩種web免登入自動化測試實現方法及比較

在做web測試過程中,通常需要先登入被測系統,有的網站登入需要驗證碼,這無疑增加了測試時間成本,怎麼才能實現免登陸?今天我為大家介紹兩種方法

一、通過selenium的Cookie類的相關操作,儲存和載入瀏覽器的cookie,實現免登陸

通過檢視selenium的api或原始碼,可以發現cookie類有以下欄位,並有相應的set, get方法和多個過載的構造方法:


1.儲存登入後的瀏覽器cookie,程式碼如下:

以登入M京東為例,可以通過輸入賬號和密碼來登入,這裡通過社交賬號聯合登入,登入成功後記錄cookie到本地檔案

@DataProvider(name="getQQ")
public Object[][] getQQ() {
return new Object[][] {
//{"979320969"},
{"3454608466"},
};
}

@Test(dataProvider="getQQ")
public void saveCookie_mjd(String qq) throws IOException {
driver.get("https://plogin.m.jd.com/user/login.action?appid=100");
driver.findElement(By.linkText("QQ")).click();
try {
driver.switchTo().frame("ptlogin_iframe");

} catch (NoSuchFrameException e) {
driver.findElement(By.className("ch_uin")).click();//切換其他賬號
driver.switchTo().alert().accept();
driver.switchTo().frame("ptlogin_iframe");

}
driver.findElement(By.id("nick_"+qq)).click();
driver.switchTo().defaultContent();
Assert.assertTrue(driver.getCurrentUrl().contains("https://m.jd.com"));


Set<Cookie> set = driver.manage().getCookies();
File cookieFile = new File("./cookies"+qq+".txt");
if (cookieFile.exists()) {
cookieFile.delete();
cookieFile.createNewFile();
}


BufferedWriter bw = new BufferedWriter(new FileWriter(cookieFile));
for (Cookie cookie : set) {
String name = cookie.getName();
String value = cookie.getValue();
String domain = cookie.getDomain();
String path = cookie.getPath();
Date expiry = cookie.getExpiry();
//Date expiry = null;
//if (cookie.getExpiry()!=null) {
//expiry= DateFormatUtils.format(cookie.getExpiry(), "yyyy-MM-dd HH:mm:ss");
//}
boolean httpOnly = cookie.isHttpOnly();
boolean secure = cookie.isSecure();


bw.write(name+";"+value+";"+domain+";"+path+";"+expiry+";"+secure+";"+httpOnly);
bw.newLine();
}
bw.flush();
bw.close();
driver.manage().deleteAllCookies();
}

2.再次登入載入已儲存的cookie

@Test
public void testLoadCookie() throws IOException{
driver.get("https://m.jd.com/");
loadCookies("3454608466");
driver.get("http://home.m.jd.com/myJd/newhome.action");
Assert.assertTrue(driver.getTitle().contains("京東觸屏版"));
Assert.assertTrue(driver.findElement(By.className("my-info")).isDisplayed());
System.out.println("M京東登入成功");
//其他測試步驟 略……
}

private void loadCookies(String qq) throws IOException {
driver.manage().deleteAllCookies();
File file = new File("./cookies"+qq+".txt");
BufferedReader br;
try {
br = new BufferedReader(new FileReader(file));
String line = null;
while ((line=br.readLine())!=null) {
String[] cookieFilds = line.split(";");
String name = cookieFilds[0].trim();
String value = cookieFilds[1].trim();
String domain = cookieFilds[2].trim();
String path = cookieFilds[3].trim();
Date expiry = null;
if (!cookieFilds[4].equals(null)) {
expiry = DateUtils.parseDate(cookieFilds[4]);
}


boolean httpOnly = Boolean.valueOf(cookieFilds[5]);
boolean secure = Boolean.valueOf(cookieFilds[6]);


Cookie cookie = new Cookie(name, value, domain, path, expiry, secure, httpOnly);
driver.manage().addCookie(cookie);
}
br.close();
} catch (FileNotFoundException e) {
System.out.println("cookies檔案不存在,呼叫saveCookie_mjd方法重新儲存cookies");
saveCookie_mjd(qq);
}


}

二、通過第三方元件browsermob-proxy,這個元件是開源的,可以從https://github.com/lightbody/browsermob-proxy獲取最新release原始碼,本地測試工程的pom.xml配置如下:

<!-- https://mvnrepository.com/artifact/net.lightbody.bmp/browsermob-core-littleproxy -->
<dependency>
    <groupId>net.lightbody.bmp</groupId>
    <artifactId>browsermob-core-littleproxy</artifactId>
    <version>2.1.0-beta-6</version>
</dependency>
手工登入後,複製瀏覽器的cookie

然後通過browsermob-proxy元件的介面修改request請求頭資訊新增cookie

   @Test
public void test22() throws Exception {
        // 啟動 proxy
BrowserMobProxyServer server = new BrowserMobProxyServer();
server.start();
// 獲取一個 Selenium proxy 物件
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(server);
// 配置 capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
// 啟動瀏覽器
WebDriver driver = new FirefoxDriver(capabilities);
driver.manage().window().maximize();
// 從瀏覽器複製urlcookie,,設定測試urlcookie
String testUrl = "測試地址url";
        final String cookieValue = "從瀏覽器複製的cookie"; //登入後獲取請求中cookie的那長串內容
server.addRequestFilter(new RequestFilter() {
            @Override
public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) {
                request.headers().add("Cookie", cookieValue);
                return null;
}
        });
driver.get(testUrl);
Thread.sleep(3000);
//        剩餘測試步驟……
driver.quit();
server.stop();
}
接下來,登入成功,可以繼續餘下測試步驟……

以上兩種方法,第一種儲存和設定cookie比較繁瑣,但是理解起來比較直觀,需要熟悉selenium從cookie類和cookie操作的常用api;第二種方法顯示比較簡單,但是需要學習browsermob-proxy元件及其介面。如有其它更好的方法實現免登陸,歡迎一起交流探討!

相關推薦

web登入自動化測試實現方法比較

在做web測試過程中,通常需要先登入被測系統,有的網站登入需要驗證碼,這無疑增加了測試時間成本,怎麼才能實現免登陸?今天我為大家介紹兩種方法 一、通過selenium的Cookie類的相關操作,儲存和載入瀏覽器的cookie,實現免登陸 通過檢視selenium的api或原

35 並行/發 同/異步 非/ 阻塞 進程的開啟方式, 進程的常用方法屬性

self 屬性 任務序列 設置 並行 告訴 方法 main 解釋器 主要內容: 1 名詞解釋 並行 : 即兩件事情或多件事情,在同一時間點同時執行.是從微觀上,也就是在一個精確的時間片刻,有不同的程序在執行,這就要求必須有多個處理器 並發 : 即兩件事情或多件事情在

模型選擇和超引數調整方法Spark MLlib使用示例(Scala/Java/Python)

機器學習除錯:模型選擇和超引數調整 模型選擇(又名超引數調整)        在機器學習中非常重要的任務就是模型選擇,或者使用資料來找到具體問題的最佳的模型和引數,這個過程也叫做除錯。除錯可以在獨立的如邏輯迴歸等估計器中完成,也可以在包含多樣演算法、特徵工程和其他步驟的管線

python 和 selenium實現web UI功能自動化測試框架(米兔888)

之前分享了python和requests搭配實現的介面自動化測試框架,今天,我再來整理分析下基於python和selenium的web UI自動化測試,希望能對大家有所幫助,也是自己整理知識學習的方法,跟大家一起努力,奮鬥在自動化測試的道路上。其實UI自動化和介面自動化框架的

Webdriver UI自動化測試 實現自動登入

自動化測試實施過程中,有測試需求:第一個用例時登入用例,只要登入成功,後面的用例就不需要重複登入。隨機想到了每次請求目標網站,攜帶上次登入成功後服務端返回的cookie,來實現繞過登入: 保持c

自動化測試實現過程簡單記錄

記錄 對數 現場 factory 適合 模式 自動化腳本 控制 自動化測試 第一步:判斷項目是否適合自動化 開始自動化後: 1.自動化腳本實現場景 錄制獲取測試所需控件 結構化語句控制腳本的執行 插入檢查點和異常判定反饋語句 將公共普遍功能點獨立成共享腳本 對數據實現

快速入門web接口自動化測試---知識與思想準備階段(一)

重要 請求 協議 工具 簡單 目標 多說 tro font 剛換了工作,老板要求我搞接口自動化,可是之前完全沒有搞過,怎麽辦?怎麽辦?答:先把B裝下了,然後學!個人感覺,這是在工作提升自己的最好方式,嘻嘻,鄙人在這裏以日記的形式,記錄自己作為一個技術渣,點點滴滴

SpringBoot之旅 -- 定時任務(Spring Schedule 與 Quartz 整合 )實現

目的 config object cnblogs java title cor 進行 eat 相關文章 Spring Boot 相關文章目錄 前言 最近在項目中使用到定時任務,之前一直都是使用Quartz 來實現,最近看Spring 基礎發現其實Spring 提供

JavaScript創建標簽的的方法實現點擊按鈕讓text自增

IV 類型 attribute ima char AD 第一個 圖片 ava 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8

Jmeter Thread Group中如果存在HTTP request執行失敗,就對整個Thread Group重新執行,限定最大執行次數N次 由於在對WEB系統進行自動化測試的過程中,經常會由於

Jmeter Thread Group中如果存在HTTP request執行失敗,就對整個Thread Group重新執行,限定最大執行次數N次 由於在對WEB系統進行自動化測試的過程中,經常會由於握手連線斷開等原因導致HTTP請求傳送失敗,如果重新執行一次,會是成功的。在每天的自動

Java&Selenium自動化測試實現頁面元素、頁面物件測試程式碼分離

一、摘要 本篇博文將介紹自動化測試實現頁面元素、頁面物件及測試程式碼分離在自動化框架中的實現 二、解析頁面元素定位資訊 首先,將頁面元素與實際的程式碼分離,首先我們將頁面元素定位資訊和定位表示式儲存在屬性檔案中,例如我們PaaS平臺提供Mysql服務的頁面,在工程中新建一個名為MysqlService.

React元件匯入的方式(動態匯入元件的實現)

一、 react元件兩種匯入方式 React元件可以通過兩種方式匯入另一個元件 import(常用) import component from './component' require const component = require('./component')

搭建基於IDEA+Selenium+Java+TestNG+Maven+Jenkins+SVN的Web端UI自動化測試環境

第一步:工具下載安裝配置 第二步:整合各個工具到自動化測試環境 1.IDEA上的各種操作 a.通過在idea工具,新建一個maven專案,在右邊載入框這裡,選擇maven-archetype-quickstart,然後點選next b.輸入Group Id:域.公司簡稱;Artifact Id:專案名稱

JavaWeb-使用cookie完成週內登入功能

歡迎頁面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML

佇列的儲存方式的介紹與實現

簡介 佇列是一種特殊的線性表,它的特殊之處在於它必須在佇列的頭部進行刪除元素,在佇列尾部插入元素。我們把佇列的頭部稱為對頭(front),佇列尾部叫做隊尾(rear)。進行刪除元素位置叫隊頭(front),進行插入元素的位置叫在隊尾(rear)。佇列的儲存的資料稱為佇列元素

另外android沉浸式狀態列實現思路

http://www.jianshu.com/p/b100b64544f3 關於沉浸式狀態列相信大家都不陌生,IOS系統很早就有,android5.0及以後版本都支援給狀態列著色,而目前android主流版本還是4.4,網上通用實現4.4(API19)沉浸式狀態

佇列的儲存方式的介紹與實現(後續)

簡介 佇列分為順序儲存結構和鏈式儲存結構,鏈式儲存結構其實就是線性表的單鏈表,只是只能在對頭出元素,隊尾進元素而已。從之前實現的佇列的順序儲存結構中 我們可以看到他的缺點,我們為了避免“假溢位”就實現迴圈佇列的順序結構,但是迴圈佇列必須指定出佇列的長度,所以說它並不完美。當

MapReduce的執行環境:本地測試環境,伺服器環境

本地測試環境(windows):1、在windows下配置hadoop的環境變數2、拷貝debug工具(winutils.exe)到hadoop目錄中的bin目錄,注意winutils.exe的版本要

SpringBoot的定時任務(Spring Schedule 與 Quartz 整合 )實現

前言 最近在專案中使用到定時任務,之前一直都是使用Quartz 來實現,最近看Spring 基礎發現其實Spring 提供 Spring Schedule 可以幫助我們實現簡單的定時任務功能。 下面說一下兩種方式在Spring Boot 專案中的使用。 Spring

黑馬程式設計師——階乘的實現方法水仙花數的列印

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ------- 需求:分別使用迴圈和遞迴列印5的階乘 /* * 兩種方式實現求5的階乘 * 1.迴圈 *