Javascript無法直接訪問SqlServer數據庫的,但可以使用瀏覽器的“執行SQL”功能查詢數據庫,將查詢結果保存在瀏覽器變量中,然后在Javascript代碼中引用這些變量即可。在瀏覽器的項目管理器中,新建執行SQL步驟,設置好SqlServer數據庫連接參數,以及Sql查詢語句和引用變量值。
Sqlserver連接參數及查詢語句
在Javascript代碼輸入框中,點擊鼠標右鍵選擇Sql查詢結果中對應的字段,這樣就把Sql查詢結果賦值給Javascript變量了。
Javascript引用Sqlserver查詢結果
在網頁填表步驟中,可直接引用Javascript變量的值。
Javascript變量的應用
提示:如果把Sql語句改為Install,則可以構建把Javascript變量插入到Sqlserver數據庫的方案。
本Pandas教程中,我們將詳細介紹如何使用Pandas read_html方法從HTML中獲取數據。首先,在最簡單的示例中,我們將使用Pandas從一個字符串讀取HTML。其次,我們將通過幾個示例來使用Pandas read_html從Wikipedia表格中獲取數據。在之前的一篇文章(關于Python中的探索性數據分析)中,我們也使用了Pandas從HTML表格中讀取數據。
在開始學習Python和Pandas時,為了進行數據分析和可視化,我們通常從實踐導入數據開始。在之前的文章中,我們已經了解到我們可以直接在Python中輸入值(例如,從Python字典創建Pandas dataframe)。然而,通過從可用的源導入數據來獲取數據當然更為常見。這通常是通過從CSV文件或Excel文件中讀取數據來完成的。例如,要從一個.csv文件導入數據,我們可以使用Pandas read_csv方法。這里有一個如何使用該方法的快速的例子,但一定要查看有關該主題的博客文章以獲得更多信息。
現在,上面的方法只有在我們已經有了合適格式的數據(如csv或JSON)時才有用(請參閱關于如何使用Python和Pandas解析JSON文件的文章)。
我們大多數人會使用Wikipedia來了解我們感興趣的主題信息。此外,這些Wikipedia文章通常包含HTML表格。
要使用pandas在Python中獲得這些表格,我們可以將其剪切并粘貼到一個電子表單中,然后,例如使用read_excel將它們讀入Python。現在,這個任務當然可以用更少的步驟來完成:我們可以通過web抓取來對它進行自動化。一定要查看一下什么是web抓取。
當然,這個Pandas讀取HTML教程將要求我們安裝Pandas及其依賴項。例如,我們可以使用pip來安裝Python包,比如Pandas,或者安裝一個Python發行版(例如,Anaconda、ActivePython)。下面是如何使用pip安裝Pandas: pip install pandas。
注意,如果出現消息說有一個更新版本的pip可用,請查看這篇有關如何升級pip的文章。注意,我們還需要安裝lxml或BeautifulSoup4,當然,這些包也可以使用pip來安裝: pip install lxml。
下面是如何使用Pandas read_html從HTML表格中抓取數據的最簡單的語法:
現在我們已經知道了使用Pandas讀取HTML表格的簡單語法,接下來我們可以查看一些read_html示例。
第一個示例是關于如何使用Pandas read_html方法的,我們將從一個字符串讀取HTML表格。
現在,我們得到的結果不是一個Pandas DataFrame,而是一個Python列表。也就是說,如果我們使用type函數,我們可以看到:
如果我們想得到該表格,我們可以使用列表的第一個索引(0)
在第二個Pandas read_html示例中,我們將從Wikipedia抓取數據。實際上,我們將得到蟒科蛇(也稱為蟒蛇)的HTML表格。
現在,我們得到了一個包含7個表(len(df))的列表。如果我們去Wikipedia頁面,我們可以看到第一個表是右邊的那個。然而,在本例中,我們可能對第二個表更感興趣。
在第三個示例中,我們將從瑞典的covid-19病例中讀取HTML表。這里,我們將使用read_html方法的一些附加參數。具體來說,我們將使用match參數。在此之后,我們還需要清洗數據,最后,我們將進行一些簡單的數據可視化操作。
如上圖所示,該表格的標題為:“瑞典各郡新增COVID-19病例”。現在,我們可以使用match參數并將其作為一個字符串輸入:
通過這種方式,我們只得到這個表,但它仍然是一個dataframes列表。現在,如上圖所示,在底部,我們有三個需要刪除的行。因此,我們要刪除最后三行。
現在,我們將使用Pandas iloc刪除最后3行。注意,我們使用-3作為第二個參數(請確保你查看了這個Panda iloc教程,以獲得更多信息)。最后,我們還創建了這個dataframe的一個副本。
在下一節中,我們將學習如何將多索引列名更改為單個索引。
現在,我們要去掉多索引列。也就是說,我們將把2列索引(名稱)變成唯一的列名。這里,我們將使用DataFrame.columns 和 DataFrame.columns,get_level_values:
最后,正如你在“date”列中所看到的,我們使用Pandas read_html從WikiPedia表格抓取了一些注釋。接下來,我們將使用str.replace方法和一個正則表達式來刪除它們:
現在,我們繼續使用Pandas set_index將日期列變成索引。這樣一來,我們稍后就可以很容易地創建一個時間序列圖。
現在,為了能夠繪制這個時間序列圖,我們需要用0填充缺失的值,并將這些列的數據類型更改為numeric。這里我們也使用了apply方法。最后,我們使用cumsum方法來獲得列中每個新值累加后的值:
在最后一個示例中,我們使用Pandas read_html獲取我們抓取的數據,并創建了一個時間序列圖。現在,我們還導入了matplotlib,這樣我們就可以改變Pandas圖例的標題的位置:
在這個Pandas教程中,我們學習了如何使用Pandas read_html方法從HTML中抓取數據。此外,我們使用來自一篇Wikipedia文章的數據來創建了一個時間序列圖。最后,我們也可以通過參數index_col來使用Pandas read_html將' Date '列設置為索引列。
英文原文:https://www.marsja.se/how-to-use-pandas-read_html-to-scrape-data-from-html-tables
譯者:一瞬
ostman是一款支持http協議的接口調試與測試工具,其主要特點就是功能強大,使用簡單且易用性好 。無論是開發人員進行接口調試,還是測試人員做接口測試,postman都是我們的首選工具之一 。那么接下來就介紹下postman到底有哪些功能,它們分別都能干些什么 。下面先通過一張圖來直觀地來看下postman中所包含的功能 。
當然,以上功能也只是展示了postman的一部分功能,為了能更加全面的體現這款工具的特點,我將從以下三個維度來加以說明。它們分別是:
postman在2018年之后就不再支持瀏覽器版本,所以,想要使用它就必須先下載客戶端再安裝使用,下面就以Windows系統為例進行安裝 。
1.下載與安裝
postman安裝步驟:
2.界面導航說明
初次使用postman的朋友可能對界面上的一些元素不太熟悉,下面就通過一張圖來說明這些元素的含義 。
3.發送第一個請求
如果你是第一次使用postman發送請求,下面這個例子可以作為一個最基本的入門,可以幫我們建立一個初始印象 。
1.常見類型的接口請求
常見的接口有如下四種類型,分別是含有查詢參數的接口,表單類型的接口,json類型的接口以及含有上傳文件的接口,以下就對這四種類型接口及如何在postman中請求進行說明 。
1.1 .查詢參數的接口請求
什么是查詢參數?
所謂的查詢參數,其實就是URL地址中問號(?)后面的部分就叫查詢參數,比如:http://cx.shouji.360.cn/phonearea.php?number=13012345678 。在這個接口中,查詢參數就是:number=13012345678 。而這一部分是由有鍵值對組成,格式為:key1=value1&key2=value2, 如果有多組鍵值對,要用&隔開 。
postman如何請求
在postman中實現對這類接口請求非常簡單,一般就需要明確倆個參數即可,一個是請求方法,一個請求地址。
針對上面的那個接口,地址已經給出 ,而它的請求方法是get 。那么在postman中只需要把這倆個參數填寫上即可請求 。
具體實現步驟:
說明:查詢參數的URL一般直接拷貝到輸入的URL地址欄中就可以了,當然也可以把查詢參數在Params中輸入,倆者的效果是一樣的 。
1.2 表單類型的接口請求
什么是表單 ?
我們都知道,在發送HTTP請求的時候,一個請求中一般包含三個部分,分別是請求行,請求頭,請求體 。
不同的接口,請求體的數據類型是不一樣的,比較常見的一種就是表單類型,那么什么是表單類型呢 ? 簡單理解就是在請求頭中查看Content-Type,它的值如果是:application/x-www-form-urlencoded .那么就說明客戶端提交的數據是以表單形式提交的 。見下圖
postman中如何請求?
如果在postman請求上圖的接口,我們只需要填寫四個參數,分別是(可以參考上圖):
實現步驟:
1.3 上傳文件的表單請求
在做接口測試時,我們經常會遇到需要上傳文件的接口,比如微信的更新頭像。這就需要用到:multipart/form-data。它也屬于一種表單,但它既支持表單請求,也支持文件上傳。 它的請求報文中數據往往是下面這樣的。
POST http://localhost/index.php/home/Uploadify/imageUp/savepath/head_pic/pictitle/banner/dir/images.html HTTP/1.1
Content-Type: multipart/form-data
file=a1.jpg
這種類型的接口,在postman中該如何請求呢 ? 我們先分析需要填寫的參數 。
實現步驟:
1.4 json類型的接口請求
這應該是接口測試中最常見的一種情況了 , 也就是請求體類型為json,我們來看下這個請求報文 。
POST http://xxx/api/sys/login HTTP/1.1
Content-Type: application/json;charset=UTF-8
{"account":"root","password":"123456"}
根據以上報文,我們可以分析出,我們在postman只需要填寫四個參數即可,具體如下:
實現步驟:
2.接口響應數據解析
響應數據是發送請求后經過服務器處理后返回的結果,響應由三部分組成,分別是狀態行、響應頭、響應體。我們來看下postman的響應數據展示。
在postman中的響應數據展示:
那么這些數據對我們做接口測試有什么作用呢 ?
接下來我們再來關注下Body中的幾個顯示主題,分別是:Pretty,Raw,Preview .
Pretty:翻譯成中文就是漂亮 , 也就是說返回的Body數據在這個標簽中查看 ,都是經過格式化的,格式化后的數據看起來更加直觀,所以postman默認展示的也是這個選項。比如返回html頁面,它會經過格式化成HTML格式后展示,比如返回json,那么也會格式化成json格式展示 。
Raw:翻譯成中文未經過加工的,也就是原始數據 ,原始數據一般都是本文格式的,未經過格式化處理的,一般在抓包工具中都有這個選項 。
Preview:翻譯成中文就是預覽,這個選項一般對返回HTML的頁面效果特別明顯,如請求百度后返回結果,點擊這個選項后就直接能查看到的頁面 ,如下圖 。同時這個選項和瀏覽器抓包中的Preview也是一樣的 。
3.接口管理(Collection)
當我們對一個或多個系統中的很多用例進行維護時,首先想到的就是對用例進行分類管理,同時還希望對這批用例做回歸測試 。在postman也提供了這樣一個功能,就是Collection 。通過這個Collection就可以滿足我們的上面說的需求。
先對Collection功能的使用場景做個簡單總結 。
那么Collection是如何去管理用例的呢 ? 先想象我們要測試一個系統,系統下有多個模塊,每個模塊下有很多的被測接口用例 。那么基于這個場景,我們來通過Collection來進行實現:
那么通過以上三個步驟,達到的效果就是如圖所示:
總結,通過上面的操作,我們實現了一個最簡單的demo模型。但實際上,有了這個功能才是postman學習的開始,因為很多功能都是基礎這個功能的基礎上進行的,比如用例的批量執行,Mock ,接口文檔等功能 。
4. 批量執行接口請求
當我們在一個Collection中編寫了很多的接口測試用例,想一起執行這批用例,在postman中是如何操作呢 ?
實現步驟:
對上面的幾個紅框內的功能進行簡單說明:
總體來說,這個功能主要是用于對一個Collection中的所有用例或部分用例進行批量運行,已達到手工回歸測試的目的。
5.日志調試
在做接口測試時,經常會因為代碼寫的有問題導致報錯,這時通過查看日志就顯得非常重要了,postman也提供了這樣的功能,它允許我們在腳本中編寫打印語句,查看打印的結果 ; 同時也可以查看每個請求的日志信息 。
在postman中編寫日志打印語句使用的是JavaScript,編寫的位置可以是Pre-request Script 或Tests標簽中。編寫打印語句如:console.log("我是一條日志")
那么打印的日如何看呢 ? 在postman中有倆個入口,第一個入口就是:view-show postman console 。
第二個入口就是左下角第三個圖標 。
打開的日志界面
這里面有幾個比較實用的功能:
總之,通過這個功能,我們在請求接口報錯時,通過打印響應的日志,就能很輕松地找到問題原因了 。
6.斷言
如果沒有斷言,我們只能做接口的功能測試,但有了斷言后,就為我們做自動化提供了條件,并且在postman中的斷言是非常方便和強大的 。
我們先來了解下postman斷言的一些特點 ,具體如下
在上面我們介紹到,編寫的斷言代碼是JavaScript,那如果不會寫怎么辦 ? 不用擔心,因為postman已經給我們內置了一些常用的斷言 。用的時候,只需從右側點擊其中一個斷言,就會在文本框中自動生成對應斷言代碼塊 。
接下來就讓我們了解一些常用斷言,還是按響應的組成來劃分,分別是狀態行,響應頭,響應體。
狀態行中又包括狀態碼,狀態消息 。在postman也可以對這兩個進行斷言
狀態行中的斷言:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200); //這里填寫的200是預期結果,實際結果是請求返回結果
});
pm.test("Status code name has string", function () {
pm.response.to.have.status("OK"); //斷言響應狀態消息包含OK
});
響應頭中的斷言
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type"); //斷言響應頭存在"Content-Type"
});
斷言響應體(重點)
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
//注解
pm.expect(pm.response.text()).to.include("string") 獲取響應文本中包含string
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
//注解
pm.response.to.have.body("response_body_string"); 獲取響應體等于response_body_string
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
//注解
var jsonData = pm.response.json() 獲取響應體,以json顯示,賦值給jsonData .注意:該響應體必須返會是的json,否則會報錯
pm.expect(jsonData.value).to.eql(100) 獲取jsonData中鍵名為value的值,然后和100進行比較
響應時間(一般用于性能測試)
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200); //斷言響應時間<200ms
});
案例說明:
針對以下接口返回的數據進行斷言:
{
"cityid": "101120101",
"city": "濟南",
"update_time": "2020-04-17 10:50",
"wea": "晴",
"wea_img": "qing",
"tem": "16",
"tem_day": "20",
"tem_night": "9",
"win": "東北風",
"win_speed": "3級",
"win_meter": "小于12km/h",
"air": "113"
}
總結,整體來說,如果用postman做接口測試,這個斷言功能必不可少,其中我們常斷言的響應體包含和JSON這倆個斷言又是重重之重。
7. 變量(全局/集合/環境)
變量可以使我們在請求或腳本中存儲和重復使用其值,通過將值保存在變量中,可以在集合,環境或請求中引用。
對我們做接口測試來說,又是一個非常重要的功能 。
在postman常用的三種變量分別是全局變量,環境變量,集合變量 。
其中,他們的作用域范圍依次從大到小:全局變量>集合變量>環境變量 。 當在幾個不同的范圍內都申明了相同的變量時,則會優先使用范圍最小的變量使。
想要使用變量中的值只需倆個步驟,分別是定義變量和獲取變量 。
定義變量
定義全局變量和環境變量,點擊右上角的小齒輪,彈出如下界面,就可以根據需求定義全局變量或者環境變量了。
已經定義的全局變量和環境變量,可以進行快速查看
定義集合變量
選擇一個集合,打開查看更多動作(...)菜單,然后點擊編輯 。選擇“變量”選項卡以編輯或添加到集合變量。
定義變量除了以上方式,還有另外一種方式 。但是這種方式在不同的位置定義,編寫不一樣。
在Tests,Pre-requests Script:
獲取變量
定義好變量,接下來就可以使用變量了 。需要注意的是,在不同的位置獲取變量,編寫的規則也是不一樣的 。
如果在請求參數中獲取變量,無論是獲取全局變量,還是環境變量,還是集合變量,獲取的方式都是一樣的編寫規則:{{變量名}} 。
如果是在編寫代碼的位置(Tests,Pre-requests Script)獲取變量,獲取不同類型的變量,編寫的代碼都不相同,具體如下:
變量的使用場景非常廣泛,比如我們后面要提到的接口關聯,請求前置腳本都會使用到變量 。
8.請求前置腳本
前置腳本其實就是在Pre-requests Script中編寫的JavaScript腳本,想要了解這個功能,需要先了解它的執行順序。那么下面就來看下它的執行順序 。
可以看出,一個請求在發送之前,會先去執行Pre Request Script(前置腳本)中的代碼 。那么這個功能在實際工作中有什么作用呢 ?
主要場景:一般情況下,在發送請求前需要對接口的數據做進一步處理,就都可以使用這個功能,比如說,登錄接口的密碼,在發送前需要做加密處理,那么就可以在前置腳本中做加密處理,再比如說,有的接口的輸入參數有一些隨機數,每請求一次接口參數值都會發送變化,就可以在前置腳本中編寫生成隨機數的代碼 。總體來說,就是在請求接口之前對我們的請求數據進行進一步加工處理的都可以使用前置腳本這個功能。
接下來通過一個案例來看下該功能是如何使用 ?
案例:
實現步驟:
總之,這個前置腳本對我們做接口測試也非常有用,對一些復雜的場景,都可以使用前置腳本進行處理后再請求接口 。
9. 接口關聯
在我們測試的接口中,經常出現這種情況 。 上一個接口的返回數據是下一個接口的輸入參數 ,那么這倆個接口就產生了關聯。 這種關聯在做接口測試時非常常見,那么在postman中,如何實現這種關聯關系呢 ?
實現思路:
案例:
{
"url": "/public/upload/user//head_pic//ba51d1c2f7f7b98dfb5cad90846e2d79.jpg",
"title": "banner",
"original": "",
"state": "SUCCESS",
"path": "images"
}
而圖像預覽接口URL為:http://localhost/public/upload/user//head_pic//ba51d1c2f7f7b98dfb5cad90846e2d79.jpg 。可以看出這個接口的URL后半部分其實是上一個接口返回的url的值 。那么這倆個接口就產生了關聯。那么在postman 可以通過以下三步完成這倆個接口的關聯實現 。
實現步驟:
可以看出,接口的關聯的解決方案都是用的是變量中的知識,也就是說只要你明確了要提取的值,后面就是保存該值,然后在其他接口使用該值就可以了。
10.常見返回值獲取
在做接口測試時,請求接口返回的數據都是很復雜的json數據,有著多層嵌套,這樣的數據層級在postman怎么獲取呢 ?
案例1:多層json嵌套, 獲取user_id的值
{
"code": 0,
"message": "請求成功!",
"data": {
"user_id": "1252163151781167104"
}
}
//獲取json體數據
var jsonData = pm.response.json()
// 獲取user_id的值,通過.獲取
var user_id = jsonData.data.user_id
案例2:json中存在列表,獲取points中的第二個元素
{
"code": 0,
"message": "請求成功!",
"data": {
"roles": {
"api": [
"API-USER-DELETE"
],
"points": [
"point-user-delete",
"POINT-USER-UPDATE",
"POINT-USER-ADD"
]
},
"authCache": null
}
}
//獲取json體數據
var jsonData = pm.response.json()
// 獲取user_id的值,通過下標獲取列表中某個元素
var user_id = jsonData.data.roles.points[1]
案例3:列表中取最后一個元素
{
"code": 0,
"message": "請求成功!",
"data": {
"total": 24,
"rows": [
{
"id": "1066370498633486336",
"mobile": "15812340003",
"username": "zbz"
},
{
"id": "1071632760222810112",
"mobile": "16612094236",
"username": "llx"
},
...
{
"id": "1075383133106425856",
"mobile": "13523679872",
"username": "test001",
},
//獲取json體數據
var jsonData = pm.response.json()
// 獲取id的值,通過slice(-1)獲取列表中最后一個元素。
var id = jsonData.data.rows.slice(-1)[0]
說明:由于平臺文章規則限制,在一文中無法容納過多的內容,故將第二部分和第三部分分成兩個單獨的篇幅加以發布,感興趣的朋友可以查看后面的兩篇postman文章 。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。