QTP实践总结

查询数据库修改freq

1.Testcasetable创建查询select * from testcasetable order by fseq desc

2.设计表-选项-修改自动递增数值

新建Action 需要修改Script.mts(D:\NewSoftShop\NewSoftShop\Action0)文件,把文件中新增的Action注释,重打开脚本

一、获取某个表格中指定位置的字符并累加输出:

(1)、对象转换:

tobj(i).object.children(0).innertext;将QTP对象转换为COM对象

(2)、累加输出:

str1= str1& tobj(i).object.children(0).innertext & ";" & tobj(i).object.children(1).innertext & "||"

完整方法:

Set obj=Description.Create()

obj("html tag").Value="TR"

Set tobj=Browser("NearMe市场后台 - 新排行榜管理").Page("NearMe市场后台 - 新排行榜管理").Frame("main_2").WebElement("html id:=table1","html tag:=table","class:=tb tb2","index:=1").ChildObjects(obj)

Msgbox tobj.count

For i=1 to tobj.count-2

str1= str1& tobj(i).object.children(0).innertext & ";" & tobj(i).object.children(1).innertext & "||"

Next

Msgbox str1

二、选择时间输入框当使用Set执行无效是需使用Object转换后再通过“Value=”输入时间:

Browser("NearMe市场后台 - 新排行榜管理").Page("NearMe市场后台 - 新排行榜管理_4").Frame("main_2").WebEdit("name:=starttime","html tag:=INPUT","type:=text").Object.Value="2015-01-08 15:36:55"

Browser("NearMe市场后台 - 新排行榜管理").Page("NearMe市场后台 - 新排行榜管理_4").Frame("main_2").WebEdit("name:=endtime","html tag:=INPUT","type:=text").Object.Value= "2015-01-09 15:36:55"

获取系统当前时间:now

比较时间:Cdate(Result)>=Cdate("2012-05-01 09:01:00") and Cdate(Result)<=Cdate("2014-06-05 22:59:59")

三、获取某个位置输入后得到的值,使用描述性编程描述对象后通过Object转换得到value值:

ID=Browser("NearMe市场后台 - 新排行榜管理").Page("NearMe市场后台 - 新排行榜管理").Frame("main").WebElement("html tag:=input","html id:=content").Object.value

Msgbox ID

四、获取一个html tag下的子对象:

如获取“TR”下tag为“strong”的值可使用方法:

tobj=Browser("…").Page("…").Frame("…").WebElement("…").ChildObjects(obj)

tobj(0).object.getElementsByTagName("STRONG")(0).innertext

五、Object、parentElement、GetElementsbyTagName,可同名子对象查找父对象:

说明:先使用描述性编程描述所要操作的子对象,通过Object将QTP对象转化为html 对象,再使用parentElement方法查找子对象查找上一层父对象,如果所查找位置未得到想要的结果继续查找上一层加一层(. parentElement),查找到对应结果后使用GetElementsbyTagName(“”)对应的html tag名称,如果有多个,添加(index),获取需要的值(.innertext)

Set Button=Browser("").Page("").Frame("").Link("html tag:=A","innertext:=添加","index:=0")

Msgbox Button.Object.parentElement.parentElement.GetElementsbyTagName("TD")(0).title

Button.Click

补充:如果出现获取不到时在Object后增加Document,

示例:

Button.Object.Document.parentElement.parentElement.GetElementsbyTagName("TD")(0).title

 

六、Trim(string…)使用方法,去除所获取字符串的前后空格

 

七、去除获取字符串中的字符,使用Replace(string,”需取代字符”,”替换字符”)(如:省略号)

SetButton=Browser("…").Page("…").Frame("main_6").WebElement("htmltag:=FONT","innertext:=…","index:=0")          str=Button.Object.parentElement.parentElement.parentElement.GetElementsByTagName("TD")(2).innertext

Tname=Replace(str,"…","")

使用Left 或者Right获取前几个字符

TdName=Left(text,2)

TdName=Right(text,2)

删除段落前空格:

vbCrLf

vbTab

八、选择日期

方式一:

Browser("…").WebEdit(“html tag:=INPUT”,”html id:=startDate”).set “2015-12-02”

方式二:

Browser("…").WebEdit(“html tag:=INPUT”,”html id:=startDate”).Object.value= “2015-12-02”

Browser("Browser_2").Page("预算追加").WebEdit("html id:=txtPStartDate","html tag:=INPUT","html type:=text","html name:=WebEdit").Object.value="2014-10-09"

九、添加图片

Browser("…").Page("…").Frame("…").WebFile("pic_old").Click

Browser("…").Dialog("…").WinEdit("文件名(N):").Set "D:\NewSoftShop\resource\JPG\300x170.jpg"

Browser("…").Dialog("…").WinButton("打开(O)").Click

十、同行控件查找

转换为html方式的脚步无法对点击后或产生对话框的空间进行操作(如”删除”按钮),因为vbs脚本为单线程,弹出对话框后会停止脚本运行

十一、当前页面中的隐藏页面,使用描述性变成时需要先转换为Object,再逐层获得所需的值:

如:

Browser("").Page("").Frame("main").WebElement("html tag:=DIV","html id:=add").Object.style.display

十二、页面隐藏形式界面的检查方法

如:

Str= Browser("…").Page("..").Frame("main").WebElement("html tag:=DIV","html id:=addDiv").Object.style.display

Msgbox Str

If instr(Str,"none")<=0 Then

insertDataBasenew "fseq", fseq,"pass"&time

Else

insertDataBasenew "fseq", fseq,"fail"&time

End If

页面隐藏时display值为none;页面显示时display值为block

十三、翻页查找判断

循环方式实现:

'翻页查询使用循环判断

'找到对象所在页面

Function FindElement(Mname)

Browser("…").Page("..").Link("管理员").Click

Browser("…").Page("…").Link("管理员管理").Click

Mystate="false"

If  Browser("…").Page("…").webelement("html tag:=DIV","class:=pg").Exist(2)Then

Strs=Browser("…").Page("…").webelement("html tag:=DIV","class:=pg").GetROProperty("innertext")

str=Split(Strs," ")

Num=str(1)

Mnum=int(int(Num-1)/10)+1

else

Mnum=1

End If

For i=1 to Mnum

If Browser("…").Page("…").Link("text:=" &Mname,"html tag:=A" ).Exist (2) Then

Mystate="true"

Exit for

else

If Mnum>i Then

j=i+1

Browser("…").Page("…").Link("html tag:=A","text:="&j).click

End If

End If

Next

FindElement=Mystate

End Function

'找到对象所在页面

Function FindElement(Mname)

'Browser("NearMe市场后台 - 搜索词运营管理").Page("NearMe市场后台 - 搜索词运营管理").Link("搜索词运营管理").Click

Mystate="false"

If  Browser("NearMe市场后台 - 活动中心").Page("NearMe市场后台 - 临时活动").WebElement("html tag:=DIV","class:=pg").Exist(2)Then

Strs=Browser("NearMe市场后台 - 活动中心").Page("NearMe市场后台 - 临时活动").WebElement("html tag:=DIV","class:=pg").GetROProperty("innertext")

str=Split(Strs," ")

Num=str(1)

Mnum=int(int(Num-1)/10)+1

else

Mnum=1

End If

For i=1 to Mnum

If Browser("NearMe市场后台 - 活动中心").Page("NearMe市场后台 - 临时活动").WebElement("innertext:="&Mname,"html tag:=TD" ).Exist (2) Then

Mystate="true"

Exit for

else

If Mnum>i Then

j=i+1

Browser("NearMe市场后台 - 活动中心").Page("NearMe市场后台 - 临时活动").Link("html tag:=A","text:="&j).click

End If

End If

Next

FindElement=Mystate

End Function

递归方式实现:

'翻页查询使用递归循环

Function funloop()

Set BrowserObject=Browser("…").Page("…").Frame("main").WebElement("html tag:=table","html id:=table1")

If BrowserObject.WebElement("html tag:=DIV","class:=pg").Exist(2) Then

Str=BrowserObject.WebElement("html tag:=DIV","class:=pg").GetROProperty("innertext")

Msgbox Str

Onum=split(Str," ")

Msgbox Onum(1)

Num=int(Abs(int(Onum(1))-1)/10)+1

Msgbox Num

Else

Num=1

End If

Set trs=BrowserObject.Object.GetElementsByTagName("tr")

Knum=BrowserObject.WebElement("html tag:=DIV","class:=pg").Object.GetElementsByTagName("strong")(0).innertext

Msgbox trs.length

For trindex=1 to trs.length-2

Strs=trs(trindex).innertext

Msgbox Strs

If instr(Strs,"   QTP测试")>0 Then

res=true

Exit For

End If

Next

if(res=True) then

msgbox fseq & ":pass"

elseif instr(Num,Knum)>0 then

msgbox fseq & ":fail"

else

Browser("…").Page("…").Frame("data-rule-gt_2").WebEdit("name:=custompage","html tag:=INPUT").Object.value=Knum+1

Set WshShell =CreateObject("WScript.shell")

WshShell.Sendkeys "{ENTER}"

Msgbox "翻页"

funloop()

End If

End Function

最新提炼方法(查找对象所在界面)

'找到对象所在页面

Function FindElement(Mname,TdName)

Mystate="false"

If Browser(BrowserName).Page(PageName).webelement("html tag:=DIV","class:=pg").Exist(2)Then

Strs=Browser(BrowserName).Page(PageName).webelement("html tag:=DIV","class:=pg").GetROProperty("innertext")

str=Split(Strs," ")

Num=str(1)

Mnum=int(int(Num-1)/10)+1

else

Mnum=1

End If

For i=1 to Mnum

If Browser(BrowserName).Page(PageName).WebElement("innertext:="&Mname,"html tag:="&TdName,"index:=0" ).Exist (2) Then

Mystate="true"

Exit for

else

If Mnum>i Then

j=i+1

Browser(BrowserName).Page(PageName).Link("html tag:=A","text:="&j).click

End If

End If

Next

FindElement=Mystate

End Function

十四、随机选取下拉列表中元素

实现方式:

itemscount = WebList.GetROProperty ("items count") '获得下拉框选项个数

Rn=RandomNumber (0,itemscount-1) 'QTP特有的随机函数

WebList.Select Rn '用序号来选择

示例:

'随机获取下拉列表中元素

Set BrowserObject1=Browser("…").Page("…").Frame("main_5").WebList("select")

itemscount = BrowserObject1.GetROProperty ("items count") '获得下拉框选项个数

Rn=RandomNumber (0,itemscount-1) 'QTP特有的随机函数

BrowserObject1.Select Rn '用序号来选择

十五、随机获取下拉列表中元素后获取对应元素的属性值

  1. 直接定位需要获取元素位置

Set ObjSelect=Browser("NearMe市场后台 - 活动中心").Page("NearMe市场后台 - 活动中心").Frame("main_5").WebElement("html tag:=select","html id:=remain")

  1. 找到所要获取元素的属性值,唯一的属性

selection= int(replace(ObjSelect.GetROProperty("selected item index"),"#",""))

  1. 获取所需元素值

ObjSelect.Object.options(selection).text

十六、Function获取某个位置的值时需要设置返回值才能获取到对应文本

示例:获取表格中某行某列的值

'获取某行某列资源名称

Function GetTdName(IdTag,ID,IdIndex,TrIndex,TdIndex)

Set BrowserObject=Browser("…").Page("…").WebElement("html tag:="&IdTag,"html id:="&ID,"index:="&IdIndex)

Set Trs=BrowserObject.Object.GetElementsByTagName("TR")

GetTdName=Trs(TrIndex).GetElementsByTagName("TD")(TdIndex).innertext

End Function

十七、获取有数字和文本字符串后如果需要对获取的数字进行运行要先使用Cint转换为整形

示例:

Num1=Cint(Replace(Replace( TdName1(1).GetRoProperty("innertext"),"取消","")," ",""))

转换后Num1为整形,此时可进行运算

十八、实现双击使用 FireEvent "ondblclick"

示例:

Set BrowserObject=Browser("NearMe市场后台 - 运营点组合").Page("NearMe市场后台 - 运营点组合").WebElement("html id:=conbination","html tag:=table")

Set Trs2=BrowserObject.Object.GetElementsByTagName("TR")

Trs2(2).GetElementsByTagName("TD")(0).FireEvent "ondblclick"

十九、html 标签A 带有href属性才能被QTP识别,否则需转换为html 对象,QTP才能

示例:

Set BrowserObject=Browser("NearMe市场后台 - 运营点组合").Page("NearMe市场后台 - 首页").WebElement("html tag:=table","html id:=table1")

Set Trs=BrowserObject.Object.GetElementsByTagName("TR")

For i=1 to Trs.length-1

If instr(Trs(i).outerhtml,TdName)>0 Then

Trs(i).GetElementsByTagName("A")(1).Click

Exit For

End If

Next

二十、杀毒软件阻止QTP点击跳转等操作

处理办法:退出杀毒软件

二十一、QTP中出现复制粘贴脚本失败、直接脚本失败,可能原因是脚本出现乱码

处理办法:在对应Action下打开Script.mts文件,将@@及其后乱码删除,重新保存即可完成修改

示例:ZJB_Manage后台,Login模块出现此问题

二十二、QTP获取class属性值是使用classname

示例:

Browser("…").Page("…").WebElement("…").WebElement("…").Object.Classname

二十三、获取列表中某行某列资源

'获取某一行某一列的元素

Function GetElementByPosition(ID,TrIndex,TdIndex)

Dim Oname

Set BrowserObject=Browser("..").Page("..").WebTable("html id:="&ID)

Set trs= BrowserObject.Object.getElementsByTagName("tr")

Set tds= trs(TrIndex)

Oname= trim(trs(trindex).children(TdIndex).innertext)

GetElementByPosition=Oname

End Function

二十四、精确点击某行按钮

'点击编辑、删除等按钮

Function ClickButton(Tag,ID,TdName, ButtonTag, PropertyName,ButtonName)

Set obj=Description.Create()

obj("html tag").value="TR"

Set tobj=Browser("…").Page("…").WebElement("html tag:="&Tag,"html id:="&ID).ChildObjects(obj)

For i=0 to tobj.count-1

TrName=tobj(i).GetRoProperty("innertext")

If instr(TrName,TdName)>0 Then

Set aobj=Description.Create()

aobj("html tag").value=ButtonTag

aobj(PropertyName).value=ButtonName

Set taobj=tobj(i).ChildObjects(aobj)

taobj(0).Click

Exit For

End If

Next

End Function

'点击缺少href属性的编辑、下架等无弹出框按钮

Function ClickButton(Tag,ID,IDIndex,TdName,ButtonTag,ButtonIndex)

Set BrowserObject=Browser(BrowserName).Page(PageName).WebElement("html tag:="&Tag,"html id:="&ID,"index:="&IDIndex)

Set Trs=BrowserObject.Object.GetElementsByTagName("TR")

For i=1 to Trs.length-1

If instr(Trs(i).outerhtml,TdName)>0 Then

Trs(i).GetElementsByTagName(ButtonTag)(ButtonIndex).Click

Exit For

End If

Next

End Function

'点击缺少href属性的删除等有弹出框按钮

Function ClickDel(Tag,ID,IDIndex,TdName,ButtonName,ButtonTag)

Set BrowserObject=Browser(BrowserName).Page(PageName).WebElement("html tag:="&Tag,"html id:="&ID,"index:="&IDIndex)

Set Trs=BrowserObject.Object.GetElementsByTagName("TR")

For i=1 to Trs.length-1

If instr(Trs(i).outerhtml,TdName)>0 Then

IndexNum=i

Browser(BrowserName).Page(PageName).WebElement("innertext:="&ButtonName,"html tag:="&ButtonTag,"index:="&IndexNum-1).Click

Exit For

End If

Next

End Function

二十五、通过一个元素获取同行的某列的元素

示例:

'通过一个元素获取同行另一元素

Function GetElementByAnotherElement(Tag,Ename,TdIndex,Index)

Dim Oname

Set BrowserObject=Browser("…").Page("…").WebElement("html tag:="&Tag,"innertext:="&Ename,"index:="&Index)

Set tr= BrowserObject.Object.parentElement

Oname= trim(tr.children(TdIndex).innertext)

GetElementByAnotherElement=Oname

End Function

 

二十六、点击列表中上移下移操作

 

示例:

'上移下移

Function ClickSpecialButton(Kname,Tname)

Set objs=Description.Create()

objs("html tag").value="TR"

Set tobjs=Browser("…").Page("…").Frame("main").WebElement("html tag:=table","html id:=table2").Object.GetElementsByTagName("TR")

For x=0 to tobjs.length-1

If instr(tobjs(x).innertext,Kname)>0 Then

Set obj=Description.Create()

obj("html tag").value="A"

Set tobj=tobjs(x).GetElementsByTagName("A")

For i=0 to tobj.length-1

If (instr(tobj(i).title,Tname)>0) Then

tobj(i).Click

Exit For

End If

Next

Exit For

End If

Next

End Function

二十七、如何获取下拉列表中的所有值

Dim stcount2,stnum2,rel2,stobj2

set stobj2=Browser(“XXX系统”).Page(“XXX平台”).Frame(“mainFrame_2″).WebList(“repositorySytleID”).Object

stcount2=stobj2.options.length

For x=0 to stcount2-1

stnum2=GetList(stcount2-1)

rel2=stobj2.options.item(stnum2).text

Next

Function
GetList(i)

Randomize

GetList=RandomNumber(x,i)

End
Function

二十八、对比时间大小

If
Cdate(Result)>=Cdate("2012-05-01 09:01:00") and
Cdate(Result)<=Cdate("2014-06-05 22:59:59")   Then

insertDataBasenew "fseq", fseq,"pass" & time

else

insertDataBasenew "fseq",
fseq,"fail" & time

End If

二十九、获取表格TR和TD数量

 

Set
BrowserPage1=Browser("游戏中心后台管理").Page("游戏中心后台管理")

Set
BrowserPageObject1=BrowserPage1.WebElement("html tag:=table","html
id:=gc_026_002")

Set
Tr1=BrowserPageObject1.Object.GetElementsByTagName("TR")

Tr1Index=Cint(Tr1.length)

Set
Td1= Tr1(Tr1Index).GetElementsByTagName(“TD”)

Td1Index=Cint(Td1.length)

三十、网页刷新办法Refresh

Browser("NearMe市场后台 - 活动中心").Refresh

设置:IE浏览器——工具——管理加载项——BHOManager 开启

三十一、Function之间传递参数

Dim
st

st=””

Function sti

st=1

st=st+1

End
Function

Function
sti2

msgbox st

End
Function

sti2

sti

三十二、使用Do
While

Do
While instr(now,Td_TimeN)>0

ClickButton
"table","tblMsgs",Td_TimeN,"A","innertext","删除"

If
Browser("后台管理").Dialog("来自网页的消息").Exist(2)
Then

Browser("后台管理").Dialog("来自网页的消息").WinButton("确定").Click

Else

Exit
Do

End
If

Loop

三十三、检查链接

QTP中,对于网页链接测试可以使用Link对象,例如下面的脚本用于对链接的地址进行检查

  ‘ 对链接的地址进行检查

  Browser("Welcome: Mercury
Tours").Page("Welcome: Mercury Tours"

  ).Link("REGISTER").CheckProperty ("url"

  ,http://newtours.demoaut.com/mercuryregister.php)

  其中使用了CheckProperty方法,用于对比Link对象的URL属性是否等于指定的地址。也可以使用Link对象的

  Object属性中的href属性来进行比较,例如下面的代码所示:

  href = Browser("Welcome: Mercury
Tours").Page("Welcome: Mercury Tours

  ").Link("REGISTER").Object.href

  ‘ 如果地址不正确,则报告错误

  If NOT href
="http://newtours.demoaut.com/mercuryregister.asp" Then

  Reporter.ReportEvent micFail,"Link
Error",href

  ExitAction

End If

三十四、初始化执行用例

在For循环中添加

err.clear

 

三十五、网页执行时某个Action用例不执行

Action名称不能包含与VB启动脚本有相同的关键字(RUN)

三十六、获取下拉列表中某个指定元素(数组中的第几项)

'获取LIST表中的一个选项

Function
getValueFromList(Lid,Index)

Set BrowserObject =
Browser(BrowserName).Page(PageName).WebList("html
id:="&Lid).Object

scount =
BrowserObject.options.length

getValueFromList =
BrowserObject.options.item(Index).text

End
Function

三十七、最大化浏览器-----BrowserOperates
longhwnd,1

QTP实践总结的更多相关文章

  1. 自动化测试调查问卷送《QTP自动化测试最佳实践》

    自动化测试调查问卷送<QTP自动化测试最佳实践> http://automationqa.com/forum.php?mod=viewthread&tid=2308&fro ...

  2. ABAP单元测试最佳实践

    本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...

  3. QTP脚本--应用参数化来测试某个输入框

    以前一直觉得自己没有写代码的资质,太急于求成,以为一天就能写好几个功能,几千行代码,于是就没耐心了,没心情学下去了....但是最近发现其实写代码是一个漫长的过程,都是在修修改改中成长起来的.于是今天试 ...

  4. QTP脚本不能录制怎么办?

    QTP是基于VBS脚本语言的,大部分VBS脚本都能在QTP上运行,只是在一些细节上略有不同,比如说VBS上停止用sleep,QTP上用wait.QTP的强大之处在于对程序窗口的操作,有很多针对窗体的属 ...

  5. 杨学明老师推出全新课程--《敏捷开发&IPD和敏捷开发结合的实践》

    课时:13小时(2天) 敏捷开发&IPD和敏捷开发结合的实践 讲  师:杨学明 [课程背景] 集成产品开发(IPD).集成能力成熟度模型(CMMI).敏捷开发(Agile Developmen ...

  6. loadrunner和QTP视频教程汇总

    小布老师视频: 测试工具概述,兼LoadRunner介绍 -1-4 http://www.boobooke.com/v/bbk1046 http://www.boobooke.com/v/bbk104 ...

  7. 黑盒测试实践--Day6 11.30

    黑盒测试实践--Day6 11.30 今天完成任务情况: 应用设计的场景用例,完成测试用例的编写 完成测试用例在自动化测试工具QTP上的测试 分析测试结果得到缺陷报告 小靳 软件测试 今天主要钻研了q ...

  8. 黑盒测试实践--Day5 11.29

    黑盒测试实践--Day5 11.29 今天完成任务情况: 分析系统需求,完成场景用例设计 小组负责测试的同学学习安装自动测试工具--QTP,并在线学习操作 小黄 今天的任务是完成场景测试用例的设计.在 ...

  9. 黑盒测试实践--Day3 11.27

    黑盒测试实践--Day3 今天完成任务情况: 收到小组紧急通知,作业要求更新了.组长召集大家在下午课后去开个短会,会议信息如下: 时间:11.27 晚上5:30 地点:东九楼501 会议内容: 学习了 ...

随机推荐

  1. hdoj 2544 最短路(最短路+Dijkstrea算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路分析:该问题给定一个无向图,要求求从起始点到终点的最短路径长度:可以使用dijkstra算法 ...

  2. hdoj 1532 Drainage Ditches(最大网络流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 思路分析:问题为最大网络流问题,给定一个有向图,需要求解该有向图的最大网络流,使用Edmonds ...

  3. JAVA面试中的几个重要基础问题

    1.java是否会出现内存溢出?如何解决? 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存.为了解决Java中内存溢出问题,我们首先必 ...

  4. ajenti试用感受

    ajenti试用感受_展现技术动态_百度空间 ajenti试用感受   今天看开源中国介绍一款名为"服务器管理系统"的开源软件发布了,名为ajenti,页面感觉不错,对机器的采集信 ...

  5. [置顶] 使用mongofiles操作GridFS

    使用mongofiles操作GridFS GridFS描述: GridFS,看起来像一种文件系统,其实是一种数据库用法.主要用来在数据库中存储二进制大文件.可以统一用数据库处理数据,而无需借助外部的文 ...

  6. HDU 4725 The Shortest Path in Nya Graph-【SPFA最短路】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题意:有N个点和N层..一层有X个点(0<=X<=N).两邻两层间有一条路花费C.还有M ...

  7. python基础补充

    关于模块导入方式: import  random print random.choice(range(10)) 和 from  random import choice print choice(ra ...

  8. js 模板引擎 jade使用语法

    Jade是一款高性能简洁易懂的模板引擎,Jade是Haml的Javascript实现,在服务端(NodeJS)及客户端均有支持. 功能 · 客户端支持 · 超强的可读性 · 灵活易用的缩进 · 块扩展 ...

  9. Spring源码地址和相关介绍的网址

    Spring源码地址下载: https://github.com/spring-projects/spring-framework/tags >多图详解Spring框架的设计理念与设计模式:ht ...

  10. What is Webhook ( Introduction to Webhook )

    A webhook in web development is a method of augmenting or altering the behavior of a web page, or we ...