-
需求分析之数据流图(DFD)
2009-04-14 09:12:13
一、概念它是将提供给用户的业务流程图(“物理模型”)进行功能建模,转化成开发人员能够理解的一系列“逻辑模型”图,即以图形化的方法描绘数据在系统中的流动和处理的过程,这些图都应该用规范的DFD描述。
二、原理
DFD设计过程就是将数据和处理进行逐层分解就形成了若干层次的DFD。DFD分为顶层图(只有一张)、0层图(也只有一张)、子图、子子图等等。
三、包含主要元素
即在DFD中包括哪些主要元素,数据流、加工、数据存储、外部实体。
(1) 数据流:用单箭头表示,如――>。是由一组固定成分的数据组成,表示数据的流向。数据流图中描述的是数据流,而不是控制流。除了流向数据存储或从数据存储流出的数据不必命名外,每个数据流必须要有一个合适的名字,以反映该数据流的含义。
(2) 加工:用圆或椭圆表示,如〇。描述了输入数据流到输出数据之间的变换,也就是输入数据流经过什么处理后变成了输出数据。每个加工都有一个名字和编号。编号能反映该加工位于分层的数据流图的哪个层次和哪张图中,能够看出它是由哪个加工分解出来的子加工。
(3) 数据存储:用双杠(带一边开口,一边闭合)表示。数据存储表示暂时存储的数据。每个数据存储都有一个名字。
(4) 外部实体:用实心长方形表示,如███。外部实体是存在于软件系统之外的人员或组织,他指出数据所需要的发源地或系统所产生的数据的归属地。
四、设计方法
1.画顶层数据流图
即画整个系统的输入输出(画系统也可以将各子系统分开画)。
把整个系统视为一个大的加工(也只能含一个加工),然后根据数据系统从哪些外部实体接收数据流,以及系统发送数据流到那些外部实体,就可以画出输入输出图。这张图称为顶层图。
顶层图的作用在于表明被开发系统的范围以及它和周围环境的数据交换关系。
2.画0层数据流图
即画系统的内部。
把顶层图的加工分解成若干个加工,并用数据流将这些加工连接起来,使得顶层图的输入数据经过若干加工处理后,变成顶层图的输出数据流。这张图称为0层图。从一个加工画出一张数据流图的过程就是对加工的分解。
确定加工的方法:在数据流的组成或值发生变化的地方应该画出一个加工,这个加工的功能就是实现这一变化,也可以根据系统的功能决定加工。
确定数据流的方法:用户把若干数据当作一个单位来处理(这些数据一起到达、一起处理)时,可以把这些数据看成一个数据流。
关于数据存储:对于一些以后某个时间要使用的数据,可以组织成为一个数据存储来表示。
3.画加工的内部
把每个加工看作一个小系统,把加工的输入输出数据流看成小系统的输入输出流。于是可以象画0层图一样画出每个小系统的加工的DFD图。
4.画子加工的分解图
对第三步分解出来的DFD图中的每个加工,重复第三步的分解过程,直到图中尚未分解的加工都是足够简单的(即不可再分解)。至此,得到了一套分层数据流图。
5.对数据流图和加工编号
对于一个软件系统,其数据流图可能有许多层,每一层又有许多张图。为了区分不同的加工和不同的DFD子图,应该对每张图进行编号,以便于管理。
● 顶层图只有一张,图中的加工也只有一个,所以不必为其编号。
● 0层图只有一张,图中的加工号分别是0.1、0.2、…,或者1, 2 。
● 子图就是父图中被分解的加工号。
● 子图中的加工号是由图号、圆点和序号组成,如:1.12,1.3 等等。
五、其它事宜
1.命名。应适当的为数据流、加工、数据存储以及外部实体命名,名字应该反映该成分的实际含义,避免使用空洞的名字。
2.画数据流图,不是画控制流。数据流反映系统“做什么”,不反映“如何做”,因此箭头上的数据流名称只能是名词或名词短语,整个图中不反映加工的执行顺序。
3.一个加工的输出数据流,不应与输入数据流同名,即使他们的组成完全相同。
4.允许一个加工有多条数据流流向另一个加工,也允许一个加工有两条相同的输出数据流流向不同的加工。
5.编号。如果一张数据流图中的某个加工分解成另一张数据流图时,则上层图为父图,直接下层图为子图。子图及其所有的加工都应编号。
6.保持父图与子图的平衡。也就是说,父图中的某加工的输入输出流必须与他的所有子图的输入输出数据流在数量上和名字上相同。值得注意的是,如果父图中的一个输入(输出)数据流对应于子图中的几个输入(输出)数据流,而子图中组成这些数据流的数据项的全体正好是父图中的这一个数据流,那么他们仍然算是平衡的。
7.在自顶向下的分解过程中,若一个数据存储首次出现时,只与一个加工有关系,那么这个数据存储应作为这个加工的内部文件而不必画出。
8.保持数据守恒,也就是,一个加工的所有输出数据流中的数据必须能从该加工的输出流中直接获得,或者通过该加工能产生的数据。
9.每个加工必须既有输入数据流,又有输出数据流。
10.在整套数据流图中,每个数据存储必须既有读的数据流,又有写的数据流。但是在某张子图中,可能只有读没有写,或者只有写没有读。
总结:DFD其实主要是对加工不断分解的过程,在此过程中要重点注意父子图以及数据、数据流的平衡。
-
磁盘访问题
2009-04-14 08:43:53
数据存储在磁盘上的排列方式会影响I/O服务的总时间。假设每磁道划分成10个物理块,每块存放1个逻辑记录。逻辑记录R1,R2,﹍﹍ ,R10存放在同一个磁道上,记录的安排顺序如下表所示:
物理块 1 2 3 4 5 6 7 8 9 10
逻辑记录 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10
假定磁盘的旋转速度为20MS/周,磁头当前处在R1的开始处。若系统顺序处理这些记录,使用单缓冲区,每个记录处理时间为4MS,则处理这10个记录的最长时间为_(15)_;若对信息进行优化分布后,处理这10个记录的最少时间为_(16)_。
(15)A.180ms B.200 ms C.204ms D.220ms
(16)A.40ms B. 60ms C. 100ms D.160ms
分析:
首先我们来回忆一下读磁盘数据的基础知识:首先磁头要移动到要访问的磁道(这个时间是寻道时间 seek time, 在本题中不需要考虑),然后等待要访问的物理块转动到磁头下面(这个时间是潜伏时间 latency time),最后是读物理块,读物理块的时间是该物理块从磁头下经过的时间。对于大容量硬盘来说,读取一小块数据的时间,相对寻道时间和潜伏时间是非常少的,以至于经常被忽略的。但是这里不能忽略,它需要20/10=2ms的时间。
现在我们来分析这道题。首先请大家注意10个物理块是从1到10依次排列的(可能有很多朋友在考虑第15题的时候忽视了这点),磁头就在R1的开始之处。 毫无疑问,必须先用2ms的时间来读出R1(读完后磁头处于R2的开始处),然后处理R1花费4ms。同时缓冲区只有一个,在R1被处理完之前,不能读入其他物理块(虽然在R1处理的过程中,磁头经过了R2物理块,可是无法读入)。但是在R1被处理完时,经过4ms的旋转磁头已经处于R4的开始处,于是不得不要有8*2=16ms的潜伏时间,才能使磁头到达R2的开始处,同样读出R2需要2ms,处理需要4ms,这样在R2上花费的时间是16+2+4=22ms,同理R3-R10也是22ms ,而R1是2+4=6ms , 所以一共需要的时间是 6+9*22=204ms.对应的选项是C
经过上述的分析,第16题就不难得到答案了,如果将R2安排到原R4的位置,R3安排到原R7的位置,依次类推(此时物理块的排列为 R1 R8 R5 R2 R9 R6 R3 R10 R7 R4),这样访问R2-R9的潜伏时间都为0,此时处理10个物理块的时间最少,为6*10=60 , 对应选项 B. -
Linux性能监测工具dstat
2009-03-27 10:06:32
Dstat简介
-
和一些同行交流过程,很多人推荐使用Dstat命令。 听说很好用,于是乎安装试用之。
官方网站:http://dag.wieers.com/rpm/packages/dstat/
Dstat的安装:
wget http://dag.wieers.com/rpm/packages/dstat/dstat-0.6.7-1.rh7.rf.noarch.rpm
rpm -ivh dstat-0.6.7-1.rh7.rf.noarch.rpm
Dstat的使用:
安装完成后,执行 dstat 命令,默认情况它会收集-cpu-、-disk-、-net-、-paging-、-system-的数据,一秒钟收集一次。默认输入 dstat 等于输入了dstat -cdngy 1或dstat -a 1;
推荐使用 date && dstat -tclmdny 60 一分钟监视一次(注意调节显示的宽度,或去掉-t选项)。
于SysStat相比,Dstat拥有一个彩色的界面,在手动观察性能状况时,数据比较显眼容易观察; 而且Dstat支持即时刷新,譬如:输入 dstat 3,即每三秒收集一次,但最新的数据都会每秒刷新显示。 和SysStat相同的是,Dstat也可以收集指定的性能资源。譬如 dstat -c 即显示CPU的使用情况。[higkoo@CentOS5.2 ~]# dstat --help
Usage: dstat [-afv] [options..] [delay [count]]
Versatile tool for generating system resource statistics
Dstat options:
-c, --cpu enable cpu stats
-C 0,3,total include cpu0, cpu3 and total
-d, --disk enable disk stats
-D total,hda include hda and total
-g, --page enable page stats
-i, --int enable interrupt stats
-I 5,eth2 include int5 and interrupt used by eth2
-l, --load enable load stats
-m, --mem enable memory stats
-n, --net enable network stats
-N eth1,total include eth1 and total
-p, --proc enable process stats
-s, --swap enable swap stats
-t, --time enable time counter
-y, --sys enable system stats
--ipc enable ipc stats
--lock enable lock stats
--raw enable raw stats
--tcp enable tcp stats
--udp enable udp stats
--unix enable unix stats
-M stat1,stat2 enable external stats
--mods stat1,stat2
-a, --all equals -cdngy (default)
-f, --full expand -D, -I and -N discovery lists
-v, --vmstat equals -pmgdsc -D total
--integer show integer values
--nocolor disable colors (implies --noupdate)
--noheaders disable repetitive headers
--noupdate disable intermediate updates
--output file write CSV output to file
delay is the delay in seconds between each update
count is the number of updates to display before exiting
The default delay is 1 and count is unspecified (unlimited)Dstat options:
-c, --cpu 显示CPU情况
-C 0,3,total include cpu0, cpu3 and total
-d, --disk 显示磁盘情况
-D total,hda include hda and total
-g, --page enable page stats
-i, --int enable interrupt stats
-I 5,eth2 include int5 and interrupt used by eth2
-l, --load enable load stats
-m, --mem 显示内存情况
-n, --net 显示网络情况
-N eth1,total 可以指定网络接口
-p, --proc enable process stats
-s, --swap 显示swap情况
-S swap1,total 可以指定多个swap
-t, --time enable time counter
-y, --sys enable system stats
--ipc 报告IPC消息队列和信号量的使用情况
--lock enable lock stats
--raw enable raw stats
--tcp enable tcp stats
--udp enable udp stats
--unix enable unix stats
-M stat1,stat2 enable external stats
--mods stat1,stat2
-a, --all 使用-cdngy 缺省的就是这样显示
-f, --full 使用 -C, -D, -I, -N and -S 显示
-v, --vmstat 使用-pmgdsc -D 显示
--integer show integer values
--nocolor disable colors (implies --noupdate)
--noheaders 只显示一次表头以后就不显示了,使用重定向写入文件时很有用
--noupdate disable intermediate updates
--output file 写入到CVS文件中更详细的使用方法请参阅:http://dag.wieers.com/home-made/dstat/
-
-
[转]OATS正交表测试策略
2009-01-09 09:47:25
1 OATS的概念:
次数(Runs):简单的说,就是次数是多少,就有多少个用例。
因素数(Factors):简单的说,就是有多少个变量。
水平数(Levels):比如有三个变量,其中变量取值最多的是四个值,那么水平数就是四。
强度(Strength):即变量间的相互关系,当强度为二时,只考虑变量两两之间的影响,如果强度为三,同考虑三个变量对结果的影响;当强度增加时,用例的个数会急剧增加。
正交表的表现形式: L runs(levels^factors )
介绍混合水平数正交表的知识,混合水平数的正交表中的因素数的水平数是不同的,比如,有5个变量,一个因素数的水平数为4,另外四个因素数的水平数为2,则用正交表表示如下:
L 8(41×24)
2 OATS的好处:
对有些组合测试,我们可选择的一种测试途径是测试所有变量的迪卡尔积(即统计学中的全面搭配法),无疑,这种方式得到的是所有变量、所有取值的完全组合,是最全面的测试。而在变量多的情况下,这无疑也是最不可能实现的方法,所以我们要选择一种方法,即可以测试大部分的BUG,又能极大的缩短我们的时间,正交表是我们的选择:
其特点为:
① 完成测试要求所需的测试用例少。
② 数据点的分布很均匀。
③ 可用其他统计学的方法等对测试结果进行分析。
OATS用来设计测试用例的方法如下的好处:
1,可以组合所有的变量;
2,得到一个最小的测试集,这个集合,包括最少的测试用例,并且,包括了所有变量的组合,
3,得到的变量的组合是均匀的分布的(这一点可以参照上面的正交表的特点);
4,可以测试用一些复杂的组合;
5,它生成的测试用例是有迹可循日,即有规律的,不像手工测试那样会遗漏一些用例的组合。
3 选择OATS的基本原则
一般都是先确定测试的因素、水平和交互作用,后选择适用的正交表。在确定因素的水平数时,主要因素应该多安排几个水平,次要因素可少安排几个水平。
(1)先看水平数。若各因素全是2水平,就选用L(2*)表;若各因素全是3水平,就选L(3*)表。若各因素的水平数不相同,就选择适用的混合水平正交表。
(2)每一个交互作用在正交表中应占一列或二列。要看所选的正交表是否足够大,能否容纳得下所考虑的因素和交互作用。为了对试验结果进行方差分析或回归分析,还必须至少留一个空白列,作为“误差”列,在极差分析中要作为“其他因素”列处理。
(3)要看测试精度的要求。若要求高,则宜取测试次数多的正交表。
(4)若测试费用很昂贵,或测试的经费很有限,或人力和时间都比较紧张,则不宜选实验次数太多的正交表。
(5)按原来考虑的因素、水平和交互作用去选择正交表,若无正好适用的正交表可选,简便且可行的办法是适当修改原定的水平数。
(6)对某因素或某交互作用的影响是否确实存在没有把握的情况下,选择L表时常为该选大表还是选小表而犹豫。若条件许可,应尽量选用大表,让影响存在的可能性较大的因素和交互作用各占适当的列。
4 OATS的步骤:
1,先要知道你有多少个变量,这个不用说了,很简单的就能确定了。它对应到正交表的概念中的因素数。
2,查看每个变量的测试取值个数(这里我用a代替,以方便后面调用),这个取值不是说这个变量的取值范围中包括多少个值,而是用等价类划分出来的。关于等价类的方法,这里就不说了。
3,选择正交表,我们选择正交表时,要满足两点:因素数(即变量个数)和水平数。在选择正交表的时候,要保存:
A、正交表的列不能小于变量的个数;
B、正交表的水平数不能小于a。
4,拿着自己的因素数和水平数,去找对应的正交表,按3中说的原则,现在正交表有一部分已经在网上公布了,在很大程度上已经够设计测试用例用了,如果你的情况太特殊,也可以考虑自己去推算。
5,如果你选择的正交表中某个因素数有剩余的水平数,就拿这个因素数的值从上到下循环代进去。以增加发现缺陷的机会。
6,按次数设计用例,每次数对应一个用例。设计完成后,如果觉得有些组合是可能会有问题的,而正交表中又没有包括,那就增加一些用例。
5 OATS的实例:
5.1 实例
下面介绍一个混合正交表的例子:
变量个数:4个 分别为:A、B、C、D。
取值为:
A->3个值(A1、A2、A3)、
B->4个值(B1、B2、B3、B4)、
C->4个值(C1、C2、C3、C4)、
D->4个值(D1、D2、D3、D4)。
把上述数值对应到正交表的概念中去,如下:
因素数:4
水平数:其中3个变量的水平数为4,1个变量的水平数为3。
对应到正交表中写法如下:
L runs(3^1 + 4^3)
1, 只考虑强度为:2的情况。
A、 其对应的正交表如下:
Runs A B C D
1 | 1 1 1 1
2 | 2 2 2 2
3 | 3 3 3 3
4 | - 4 4 4
5 | 1 2 3 4
6 | 2 1 4 3
7 | 3 4 1 2
8 | - 3 2 1
9 | 1 3 4 2
10 | 2 4 3 1
11 | 3 1 2 4
12 | - 2 1 3
13 | 1 4 2 3
14 | 2 3 1 4
15 | 3 2 4 1
16 | - 1 3 2
即应用到次数为16的正交表,我们可以得到16个用例。
B、把各个变量的代入正交表得到如下正交表:
Runs A B C D
1 | A1 B1 C1 D1
2 | A2 B2 C2 D2
3 | A3 B3 C3 D3
4 | - B4 C4 D4
5 | A1 B2 C3 D4
6 | A2 B1 C4 D3
7 | A3 B4 C1 D2
8 | - B3 C2 D1
9 | A1 B3 C4 D2
10 | A2 B4 C3 D1
11 | A3 B1 C2 D4
12 | - B2 C1 D3
13 | A1 B4 C2 D3
14 | A2 B3 C1 D4
15 | A3 B2 C4 D1
16 | - B1 C3 D2
C、看上面的正交表可以知道变量A有剩余的水平数。下面我们用A的值循环代入:
Runs A B C D
1 | A1 B1 C1 D1
2 | A2 B2 C2 D2
3 | A3 B3 C3 D3
4 | A1 B4 C4 D4
5 | A1 B2 C3 D4
6 | A2 B1 C4 D3
7 | A3 B4 C1 D2
8 | A2 B3 C2 D1
9 | A1 B3 C4 D2
10 | A2 B4 C3 D1
11 | A3 B1 C2 D4
12 | A3 B2 C1 D3
13 | A1 B4 C2 D3
14 | A2 B3 C1 D4
15 | A3 B2 C4 D1
16 | A1 B1 C3 D2
上面我用A的值循环填充了A剩余的水平数(蓝色标记的部分)。
D、接着,我们就可以用上面的正交表来设计用例了。不再多言。
2, 考虑强度为3的情况:
得到对应的正交表如下:
Runs A B C D
1 | 1 1 1 1
2 | 1 1 2 2
3 | 1 1 3 3
4 | 1 1 4 4
5 | 1 2 1 2
6 | 1 2 2 1
7 | 1 2 3 4
8 | 1 2 4 3
9 | 1 3 1 3
10 | 1 3 2 4
11 | 1 3 3 1
12 | 1 3 4 2
13 | 1 4 1 4
14 | 1 4 2 3
15 | 1 4 3 2
16 | 1 4 4 1
17 | 2 1 1 2
18 | 2 1 2 1
19 | 2 1 3 4
20 | 2 1 4 3
21 | 2 2 1 1
22 | 2 2 2 2
23 | 2 2 3 3
24 | 2 2 4 4
25 | 2 3 1 4
26 | 2 3 2 3
27 | 2 3 3 2
28 | 2 3 4 1
29 | 2 4 1 3
30 | 2 4 2 4
31 | 2 4 3 1
32 | 2 4 4 2
33 | 3 1 1 3
34 | 3 1 2 4
35 | 3 1 3 1
36 | 3 1 4 2
37 | 3 2 1 4
38 | 3 2 2 3
39 | 3 2 3 2
40 | 3 2 4 1
41 | 3 3 1 1
42 | 3 3 2 2
43 | 3 3 3 3
44 | 3 3 4 4
45 | 3 4 1 2
46 | 3 4 2 1
47 | 3 4 3 4
48 | 3 4 4 3
49 | - 1 4 1
50 | - 2 3 1
51 | - 3 2 1
52 | - 4 1 1
53 | - 1 3 2
54 | - 2 4 2
55 | - 3 1 2
56 | - 4 2 2
57 | - 1 2 3
58 | - 2 1 3
59 | - 3 4 3
60 | - 4 3 3
61 | - 1 1 4
62 | - 2 2 4
63 | - 3 3 4
64 | - 4 4 4
我们得到一个次数为64的正交表,按照1中的步骤B、C、D可以得到64测试用例。
在这个例子中,如果我们选择强度为4的表的话,也就相当于覆盖整个迪卡尔积了。所以在强度为4的时候,在这个例子中正交已经没有意义。 -
[转载]功能测试用例设计积累(二):错误推测法分析与实践
2009-01-09 09:44:30
一、错误推测法
1。方法定义:
基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法。
2。思路:
分析程序中最易出错的场景和情况,在此基础上有针对性的设计测试用例。需要完成的前提条件如下:
A。深度熟悉被测系统的业务、需求。
B。对被测系统或类似系统之前的缺陷分布情况进行过系统的分析。包括功能缺陷,数据缺陷,接口缺陷和界面缺陷等等。
3。测试用例举例
(一):聊天窗口功能
A。输入特殊字符(全角,半角)后,窗口是否能够正常显示
B。输入空格,是否能够过滤,是否会算入长度计算
C。输入html字符
D。输入脚本语言函数
E。在需要密码验证,或者需要二次输入确认的地方,通过复制粘贴第一次的输入内容是否能够通过
(二):查询功能
A。无条件查询
B。是否支持模糊查询
C。查询的关键字之间是否可用连接符
D。输入正确的查询条件以前加上空格,看是否能正确地查出相应的数据
(三):登录功能
A。输入的数据前存在空格,是否能够正常登录
B。输入的密码是否能够加密显示
C。用户在注销之后是否能够再登录成功
4。优缺点
优点:充分发挥个人的经验和潜能,命中率高
缺点:覆盖率难以保证;过多的依赖于个人的经验 -
[转载]功能测试用例设计积累(一):软件界面
2009-01-09 09:42:51
界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用。同时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成功的感觉,相反由于界面设计的失败,让用户有挫败感,再实用强大的功能都可能在用户的畏惧与放弃中付诸东流。目前界面的设计引起软件设计人员的重视的程度还远远不够,直到最近网页制作的兴起,才受到专家的青睐。而且设计良好的界面由于需要具有艺术美的天赋而遭拒绝。
目前流行的界面风格有三种方式:多窗体、单窗体以及资源管理器风格,无论那种风格,以下规则是应该被重视的。
1:易用性
按钮名称应该易懂,用词准确,屏弃没楞两可的字眼,要与同一界面上的其他按钮易于区分,能望文知意最好。理想的情况是用户不用查阅帮助就能知道该界面的功能并进行相关的正确操作。
易用性细则:
1):完成相同或相近功能的按钮用Frame框起来,常用按钮要支持快捷方式。
2):完成同一功能或任务的元素放在集中位置,减少鼠标移动的距离。
3):按功能将界面划分局域块,用Frame框括起来,并要有功能说明或标题。
4):界面要支持键盘自动浏览按钮功能,即按Tab键的自动切换功能。
5):界面上首先应输入的和重要信息的控件在Tab顺序中应当靠前,位置也应放在窗口上较醒目的位置。
6):同一界面上的控件数最好不要超过10个,多于10个时可以考虑使用分页界面显示。
7):分页界面要支持在页面间的快捷切换,常用组合快捷键Ctrl+Tab
8):默认按钮要支持Enter及选操作,即按Enter后自动执行默认按钮对应操作。
9):可写控件检测到非法输入后应给出说明并能自动获得焦点。
10):Tab键的顺序与控件排列顺序要一直,目前流行总体从上到下,同时行间从左到右的方式。
11):复选框和选项框按选择几率的高底而先后排列。
12):复选框和选项框要有默认选项,并支持Tab选择。
13):选项数相同时多用选项框而不用下拉列表框。
14):界面空间较小时使用下拉框而不用选项框。
15):选项数叫少时使用选项框,相反使用下拉列表框。
16):专业性强的软件要使用相关的专业术语,通用性界面则提倡使用通用性词眼。
2:规范性
通常界面设计都按Windows界面的规范来设计,即包含“菜单条、工具栏、工具厢、状态栏、滚动条、右键快捷菜单”的标准格式,可以说:界面遵循规范化的程度越高,则易用性相应的就越好。小型软件一般不提供工具厢。
规范性细则:
1):常用菜单要有命令快捷方式。
2):完成相同或相近功能的菜单用横线隔开放在同一位置。
3):菜单前的图标能直观的代表要完成的操作。
4):菜单深度一般要求最多控制在三层以内。
5):工具栏要求可以根据用户的要求自己选择定制。
6):相同或相近功能的工具栏放在一起。
7):工具栏中的每一个按钮要有及时提示信息。
8):一条工具栏的长度最长不能超出屏幕宽度。
9): 工具栏的图标能直观的代表要完成的操作。
10):系统常用的工具栏设置默认放置位置。
11):工具栏太多时可以考虑使用工具厢。
12):工具厢要具有可增减性,由用户自己根据需求定制。
13):工具厢的默认总宽度不要超过屏幕宽度的1/5。
14): 状态条要能显示用户切实需要的信息,常用的有:
目前的操作、系统状态、用户位置、用户信息、提示信息、错误信息等,如果某一操作需要的时间较长,还应该显示进度条和进程提示。
15):滚动条的长度要根据显示信息的长度或宽度能及时变换,以利于用户了解显示信息的位置和百分比。
16):状态条的高度以放置五好字为宜,滚动条的宽度比状态条的略窄。
17):菜单和工具条要有清楚的界限;菜单要求凸出显示,这样在移走工具条时仍有立体感。
18):菜单和状态条中通常使用5号字体。工具条一般比菜单要宽,但不要宽的太多,否则看起来很不协调。
19):右键快捷菜单采用与菜单相同的准则。
3:帮助设施
系统应该提供详尽而可靠的帮助文档,在用户使用产生迷惑时可以自己寻求解决方法。
帮助设施细则:
1):帮助文档中的性能介绍与说明要与系统性能配套一致。(我们的系统帮助文档都是系统的祖先时期的说明,让人困惑)。
2):打包新系统时,对作了修改的地方在帮助文档中要做相应的修改。
3):操作时要提供及时调用系统帮助的功能。常用F1。
4):在界面上调用帮助时应该能够及时定位到与该操作相对的帮助位置。也就是说帮助要有即时针对性。
5):最好提供目前流行的联机帮助格式或HTML帮助格式。
6):用户可以用关键词在帮助索引中搜索所要的帮助,当然也应该提供帮助主题词。
7):如果没有提供书面的帮助文档的话,最好有打印帮助的功能。
8 ):在帮助中应该提供我们的技术支持方式,一旦用户难以自己解决可以方便的寻求新的帮助方式。
4:合理性
屏幕对角线相交的位置是用户直视的地方,正上方四分之一处为易吸引用户注意力的位置,在放置窗体时要注意利用这两个位置。
合理性细则:
1):父窗体或主窗体的中心位置应该在对角线焦点附近。
2):子窗体位置应该在主窗体的左上角或正中。
3):多个子窗体弹出时应该依次向右下方偏移,以显示窗体出标题为宜。
4):重要的命令按钮与使用较频繁的按钮要放在界面上注目的位置。
5):错误使用容易引起界面退出或关闭的按钮不应该放在易点位置。横排开头或最后与竖排最后为易点位置。
6):与正在进行的操作无关的按钮应该加以屏蔽(Windows中用灰色显示,没法使用该按钮)。
7):对可能造成数据无法恢复的操作必须提供确认信息,给用户放弃选择的机会。
8):非法的输入或操作应有足够的提示说明。
9): 对运行过程中出现问题而引起错误的地方要有提示,让用户明白错误出处,避免形成无限期的等待。
10):提示、警告、或错误说明应该清楚、明了、恰当。
5:美观与协调性
界面应该大小适合美学观点,感觉协调舒适,能在有效的范围内吸引用户的注意力。
美观与协调性细则:
1): 长宽接近黄金点比例,切忌长宽比例失调、或宽度超过长度。
2): 布局要合理,不宜过于密集,也不能过于空旷,合理的利用空间。
3): 按钮大小基本相近,忌用太长的名称,免得占用过多的界面位置。
4): 按钮的大小要与界面的大小和空间要协调。
5): 避免空旷的界面上放置很大的按钮。
6):放置完控件后界面不应有很大的空缺位置。
7): 字体的大小要与界面的大小比例协调, 通常使用的字体中宋体9-12较为美观,很少使用超过12号的字体。
8): 前景与背景色搭配合理协调,反差不宜太大,最好少用深色,如大红、大绿等。常用色考虑使用Windows界面色调。
9): 如果使用其他颜色,主色要柔和,具有亲和力与磁力,坚决杜绝刺目的颜色。
10): 大型系统常用的主色有"#E1E1E1"、"#EFEFEF"、"#C0C0C0"等。
11): 界面风格要保持一致,字的大小、颜色、字体要相同,除非是需要艺术处理或有特殊要求的地方。
12): 如果窗体支持最小化和最大化或放大时,窗体上的控件也要随着窗体而缩放;切忌只放大窗体而忽略控件的缩放。
13):对于含有按钮的界面一般不应该支持缩放,即右上角只有关闭功能。
14): 通常父窗体支持缩放时,子窗体没有必要缩放。
15):如果能给用户提供自定义界面风格则更好,由用户自己选择颜色、字体等。
6:菜单位置
菜单是界面上最重要的元素,菜单位置按照按功能来组织。
菜单设测试细则:
1):菜单通常采用“常用--主要--次要--工具--帮助”的位置排列,符合流行的Windows风格。
2):常用的有“文件”、“编辑”,“查看”等,几乎每个系统都有这些选项,当然要根据不同的系统有所取舍。
3):下拉菜单要根据菜单选项的含义进行分组,并切按照一定的规则进行排列,用横线隔开。
4): 一组菜单的使用有先后要求或有向导作用时,应该按先后次序排列。
5): 没有顺序要求的菜单项按使用频率和重要性排列,常用的放在开头, 不常用的靠后放置;重要的放在开头,次要的放在后边。
6): 如果菜单选项较多,应该采用加长菜单的长度而减少深度的原则排列。
7): 菜单深度一般要求最多控制在三层以内。
8): 对常用的菜单要有快捷命令方式,组合原则见8。
9):对与进行的操作无关的菜单要用屏蔽的方式加以处理,如果采用动态加载方式——即只有需要的菜单才显示——最好。
10):菜单前的图标不宜太大,与字高保持一直最好。
11):主菜单的宽度要接近,字数不应多于四个,每个菜单的字数能相同最好。
12):主菜单数目不应太多,最好为单排布置。
7:独特性
如果一味的遵循业界的界面标准,则会丧失自己的个性.在框架符合以上规范的情况下,设计具有自己独特风格的界面尤为重要。尤其在商业软件流通中有着很好的迁移默化的广告效用。
独特性细则:
1):安装界面上应有单位介绍或产品介绍,并有自己的图标。
2):主界面,最好是大多数界面上要有公司图标。
3):登录界面上要有本产品的标志,同时包含公司图标。
4):帮助菜单的“关于”中应有版权和产品信息。
5):公司的系列产品要保持一直的界面风格,如背景色、字体、菜单排列方式、图标、安装过程、按钮用语等应该大体一致。
8:快捷方式的组合
在菜单及按钮中使用快捷键可以让喜欢使用键盘的用户操作得更快一些 在西文Windows及其应用软件中快捷键的使用大多是一致的。
细则:
1):面向事务的组合有:
Ctrl-D 删除 ;Ctrl-F 寻找 ;Ctrl –H替换;Ctrl-I 插入 ;Ctrl-N 新记录 ;Ctrl-S 保存 Ctrl-O 打开。
2):列表:
Ctrl-R ,Ctrl-G定位;Ctrl-Tab下一分页窗口或反序浏览同一页面控件;。
3):编辑:
Ctrl-A全选;Ctrl-C 拷贝;Ctrl-V 粘贴;Ctrl-X 剪切;Ctrl-Z撤消操作;Ctrl-Y恢复操作。
4):文件操作:
Ctrl-P 打印;Ctrl-W 关闭。
5):系统菜单
Alt-A文件;Alt-E编辑;Alt-T工具;Alt-W窗口;Alt-H帮助。
6):MS Windows保留键:
Ctrl-Esc 任务列表 ;Ctrl-F4 关闭窗口; Alt-F4 结束应用;Alt-Tab 下一应用 ;Enter 缺省按钮/确认操作 ;Esc 取消按钮/取消操作 ;Shift-F1 上下文相关帮助。
按钮中:
可以根据系统需要而调节,以下只是常用的组合。
Alt-Y确定(是);Alt-C取消;Alt-N 否;Alt-D删除;Alt-Q退出;Alt-A添加;Alt-E编辑;Alt-B浏览;Alt-R读;Alt-W写。
这些快捷键也可以作为开发中文应用软件的标准,但亦可使用汉语拼音的开头字母。
9:安全性考虑
在界面上通过下列方式来控制出错几率,会大大减少系统因用户人为的错误引起的破坏。开发者应当尽量周全地考虑到各种可能发生的问题,使出错的可能降至最小。如应用出现保护性错误而退出系统,这种错误最容易使用户对软件失去信心。因为这意味着用户要中断思路,并费时费力地重新登录,而且已进行的操作也会因没有存盘而全部丢失。
安全性细则:
1):最重要的是排除可能会使应用非正常中止的错误。
2):应当注意尽可能避免用户无意录入无效的数据。
3):采用相关控件限制用户输入值的种类。
4):当用户作出选择的可能性只有两个时,可以采用单选框。
5):当选择的可能再多一些时,可以采用复选框,每一种选择都是有效的,用户不可能输入任何一种无效的选择。
6):当选项特别多时,可以采用列表框,下拉式列表框。
7):在一个应用系统中,开发者应当避免用户作出未经授权或没有意义的操作。
8):对可能引起致命错误或系统出错的输入字符或动作要加限制或屏蔽。
9):对可能发生严重后果的操作要有补救措施。通过补救措施用户可以回到原来的正确状态。
10):对一些特殊符号的输入、与系统使用的符号相冲突的字符等进行判断并阻止用户输入该字符。
11):对错误操作最好支持可逆性处理,如取消系列操作。
12):在输入有效性字符之前应该阻止用户进行只有输入之后才可进行的操作。
13):对可能造成等待时间较长的操作应该提供取消功能。
14):特殊字符常有;;’”><,`‘:“[”{、\|}]+=)-(_*&&^%$#@!~,.。?/还有空格。
15):与系统采用的保留字符冲突的要加以限制。
16):在读入用户所输入的信息时,根据需要选择是否去掉前后空格。
17):有些读入数据库的字段不支持中间有空格,但用户切实需要输入中间空格,这时要在程序中加以处理。
10:多窗口的应用与系统资源
设计良好的软件不仅要有完备的功能,而且要尽可能的占用最底限度的资源。
细则:
1):在多窗口系统中,有些界面要求必须保持在最顶层,避免用户在打开多个窗口时,不停的切换甚至最小化其他窗口来显示该窗口。
2):在主界面载入完毕后自动卸出内存,让出所占用的WINDOWS系统资源。
3):关闭所有窗体,系统退出后要释放所占的所有系统资源 ,除非是需要后台运行的系统。
4):尽量防止对系统的独占使用。 -
QTP如何启动应用程序(转) (添加个人修改部分)
2008-12-31 15:47:56
QTP提供了很多自动启动应用程序的办法,方法如下:
1)SystemUtil.Run 允许启动新的进程
格式:SystemUtil.Run file, [params], [dir], [op], [mode]
下面代码利用SystemUtil对象如何启动进程。'启动IE
SystemUtil.Run "iexplore.exe"
SystemUtil.Run "iexplore.exe", "http://www.51testing.com/?72" '打开pcl blog
SystemUtil.Run "iexplore.exe", "http://www.knowledgeinbox.com", , , 3
打开其他软件:SystemUtil.Run "E:\software\xshell30.exe"
2)InvokeApplication 启动应用程序
格式:InvokeApplication(Command [,StartIn])例子:
'启动ie
InvokeApplication "IEXPLORE.EXE"
'启动计算器
InvokeApplication "calc.exe"3) COM - Wsh
利用Wsh对象进行启动
例子:Dim oShell
set ōShell= CreateObject ("Wscrīpt.shell")
oShell.Run "IEXPLORE.EXE"
Set ōShell = Nothing
oShell.Run "E:\software\xshell30.exe"4)Qtp自动启动应用程序
Qtp打开 Automation-〉Record and Run Settings 下进行设置5)录制启动过程
也可以手动将Dialog:运行的所有对象添加到对象库中,并首先启动dialog:运行
Dialog("运行").WinEdit("打开(O):").Set "calc"
Dialog("运行").WinButton("确定").Click
-
[转载]揭秘QTP的DeviceReplay对象
2008-12-31 14:52:47
原文:The Undocumented DeviceReplay(http://www.advancedqtp.com/2008/03/undocumented-devicereplay/www.advancedqtp.com)
不知道为什么HP的帮助文档中没有提供关于DeviceReplay的强大功能的信息描述。你可以在Java插件中却可以找到DeviceReplay的属性,但是对于那些不使用Java插件的人可能会觉得这个对象仅在Java程序的测试中可用。
为什么要用DeviceReplay?
有些时候我们需要针对界面做一些指定的动作,例如右键单击一个对象,使用功能键(Fx)来激活某些热键的功能,这时候就可以使用DeviceReplay对象,或者在Object.Set和Object.Type方法不生效时使用DeviceReplay。并且DeviceReplay在输入特殊符号以及不同语言的文字时会很有用,因为不需要安装指定的字体或改变键盘布局,这对于测试多语言环境的应用程序会非常有用。
在鼠标操作方面,我发现DragDrop方法非常有用,可以使用它来执行拖拽的操作,把一个Item从一个Frame拖动到另外一个Frame,或者在应用程序之间拖动。
Mercury.DeviceReplay对象
Mercury.DeviceReplay对象用于模拟鼠标单击和移动,还有键盘输入等操作。要使用DeviceReplay,你必须确保被测试的应用程序(AUT)是处于激活状态的窗口。如果你想对某个对象执行一项操作,则该对象必须拥有焦点(focus)。对于Windows应用程序,可以使用Activate方法:Window( "W" ).Activate micLeftBtn
如果想把焦点设置到某个指定的对象上,通常使用Click方法可以完成。
对于Web环境的应用程序,Activate方法不被支持,因此可以使用下面的技巧来完成:
hwnd = Browser( "B" ).GetROProperty( "hwnd" )
Window( "hwnd:=" & hwnd ).Activate micLeftBtn
通常可以使用FireEvent “onfocusin”或object.focus,例如WebEdit(“WE”).Object.focus或WebEdit(“WE”)。FireEvent “onfocusin”。
在调用DeviceReplay对象的方法之前,你需要首先创建DeviceReplay对象:
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
Microsoft.VisualBasic.Devices.Keyboard类
为什么我要在介绍DeviceReplay对象之前介绍这个.NET的类呢?DeviceReplay是一个强大的未被文档化的对象,但是有一定的局限性。其中一个局限就是不能判断一个Control键是否已经被按下。在输入一个大写字母之前,我们需要知道CAPS-LOCK键是否已经按下。在使用数字键盘之前我们需要检查NUM-LOCK键是否已经被按下。否则我们在切换键盘输入状态时可能得到的并不是我们想要的状态。Devices.Keyboard类提供了属性,可用于获取当前的键盘状态,例如当前什么键被按下了,并且提供一个方法用于向激活的窗口发送键盘敲击事件。
几个有用的属性包括:
AltKeyDown - 判断ALT键是否处于按下状态。
CapsLock - 判断CAPS LOCK键是否处于打开状态。
CtrlKeyDown - 判断CTRL 键是否处于按下状态。
NumLock - 判断NUM LOCK键是否处于打开状态。
ScrollLock - 判断SCROLL LOCK键是否处于打开状态。
ShiftKeyDown - 判断SHIFT键是否处于按下状态。
Set Keyboard = DotNetFactory.CreateInstance(
"Microsoft.VisualBasic.Devices.Keyboard", "Microsoft.VisualBasic" )
Print CBool( Keyboard.AltKeyDown )
Print CBool( Keyboard.CapsLock )
Print CBool( Keyboard.CtrlKeyDown )
Print CBool( Keyboard.NumLock )
Print CBool( Keyboard.ScrollLock )
Print CBool( Keyboard.ShiftKeyDown )
注意:在使用DotNetFactory时数据类型必须被转换
System.Windows.Forms.Control 类
DeviceReplay的另外一个局限是不能获取当前鼠标(光标)在屏幕的位置。而System.Windows.Forms.Control这个类定义了那些拥有视觉表现的控件的基类。通过MousePosition属性可以获取当前鼠标光标在屏幕坐标的位置。访问MousePosition属性时,可以返回代表鼠标光标位置的Point数据。
我的鼠标在哪?
Set ctlr = DotNetFactory.CreateInstance("System.Windows.Forms.Control")For i = 1 To 10
Wait 2
Print "1. X=" & ctlr.MousePosition.X & "; Y=" & ctlr.MousePosition.Y
Next
Mercury.DeviceReplay的方法
SendString方法
描述向激活的窗口发送一个或多个键盘按键,就像敲击键盘一样。
语法
object.SendString( str )
参数
object : Mercury.DeviceReplay对象。
str : 敲击的字符串。
返回值
无。
例子
下面的例子会激活记事本(notepad)并输入一段字符:
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
SystemUtil.Run "notepad.exe", "", "", "open"
' ** this line always identifies the notepad window.
Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn
deviceReplay.SendString( "DeviceReplay" )
Set deviceReplay = Nothing
KeyDown方法
描述模拟一个按键的按下并保持(相当于Win32的KEY_DOWN事件)。
语法
object.KeyDown( key )
参数
object : Mercury.DeviceReplay对象。
key : 按键的数值码。可查阅后面的“Key Codes 参考”。
返回值
无。
例子
下面的例子会激活记事本(notepad)程序并使用大写和小写的方式输入字符串。注意在发送第一个字符串时,SHIFT键保持被按下的状态:
Const VK_SHIFT = 42
Const VK_RETURN = 28
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
SystemUtil.Run "notepad.exe", "", "", "open"
Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn
' ** Typing uppercase
deviceReplay.KeyDown VK_SHIFT
deviceReplay.SendString( "devicereplay" )
deviceReplay.PressKey VK_RETURN
deviceReplay.KeyUp VK_SHIFT
' ** Typing in lower case
deviceReplay.SendString( "devicereplay" )
Set deviceReplay = Nothing
提示
在KeyDown后应该有相应的KeyUp方法的调用。
KeyDown方法就像人工按下一个按键并保持按下的状态。
KeyUp方法
描述模拟通过键盘释放某个按下的按键。
语法
object.KeyUp( key )
参数
object : Mercury.DeviceReplay对象。
key : 按键的数值码。可查阅后面的“Key Codes 参考”。
返回值
无。
例子
下面的例子会激活并并使用热键CTRL+O来打开记事本(notepad)的菜单,然后用ESC键关闭对话框。
Const VK_O = 24
Const VK_CONTROL = 29
Const VK_ESCAPE = 1
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
SystemUtil.Run "notepad.exe", "", "", "open"
Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn
' ** Typing uppercase
Wait 1
' ** Opening the menu Ctrl + O
deviceReplay.KeyDown VK_CONTROL
deviceReplay.PressKey VK_O
deviceReplay.KeyUp VK_CONTROL
Wait 2
' ** Closing the menu
deviceReplay.PressKey VK_ESCAPE
deviceReplay.SendString "Menu Open, was closed."
Set deviceReplay = Nothing
提示
KeyUp方法应该与KeyDown方法配对使用。
多个KeyUp不会对应用程序造成影响。
如果需要组合热键,仅需要像人工执行的方式一样即可。
PressKey方法
描述模拟通过键盘按下一个按键并立即释放。
语法
object.PressKey( key )
参数
object : Mercury.DeviceReplay对象。
key : 按键的数值码。可查阅后面的“Key Codes 参考”。
返回值
无。
例子
下面的例子会激活记事本并使用热键CTRL+O来模拟选择文件打开菜单,然后用ESCAPE按键关闭对话框。
Const VK_O = 24 : Const VK_F = 33
Const VK_CONTROL = 29 : Const VK_ESCAPE = 1 : Const VK_MENU = 56
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
SystemUtil.Run "notepad.exe", "", "", "open"
Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn
Wait 1
' ** Opening the menu Alt + F + O
deviceReplay.PressKey VK_MENU
deviceReplay.PressKey VK_F
deviceReplay.PressKey VK_O
Wait 2
' ** Closing the menu
deviceReplay.PressKey VK_ESCAPE
deviceReplay.SendString "Open menu was closed."
Set deviceReplay = Nothing
PressNKeys方法
描述模拟通过键盘多次按下一个按键并立即释放。
语法
object.PressNKey( key, N )
参数
object : Mercury.DeviceReplay对象。
key : 按键的数值码。可查阅后面的“Key Codes 参考”。
N:重复的次数。
返回值
无。
例子
例1 – 美国的州
Option Explicit
Const VK_RETURN = 28 : Const VK_F = 33 : Const VK_O = 24
Const VK_TAB = 15 : Const VK_F5 = 63
Const VK_CAPITAL = 58 : Const VK_NUMLOCK = 69
Const VK_SUBTRACT = 74 : Const VK_MULTIPLY = 55
Const VK_MENU = 56
Dim deviceReplay
Private Sub SetupKeyboard()
Const CLASS_NAME = "Microsoft.VisualBasic.Devices.Keyboard"
Const ASSEMBLY = "Microsoft.VisualBasic"
Dim Keyboard
Set Keyboard = DotNetFactory.CreateInstance( CLASS_NAME, ASSEMBLY )
If CBool( Keyboard.CapsLock ) Then
deviceReplay.PressKey VK_CAPITAL
End If
If CBool( Keyboard.NumLock ) = False Then
deviceReplay.PressKey VK_NUMLOCK
End If
Set Keyboard = Nothing
End Sub
Private Sub SetupNotepad()
deviceReplay.PressKey VK_MENU
deviceReplay.PressKey VK_O
deviceReplay.PressKey VK_F
deviceReplay.SendString "Courier New"
deviceReplay.PressKey VK_TAB
deviceReplay.PressKey VK_TAB
deviceReplay.SendString "14"
deviceReplay.PressKey VK_RETURN
Wait 1
End Sub
Private Sub PrintRow( ByVal state, ByVal usps, byVal capital )
deviceReplay.SendString state
-
[转载]鼠标点击桌面任意坐标的问题,顺便介绍下Mercury.DeviceReplay这个对象
2008-12-31 10:25:53
一朋友问到如何实现鼠标点击桌面上任意指定的坐标的问题,呵呵不复杂,呵呵
可以两种方法实现:
1、QTP采用低级别录制,然后坐标用随机数替代
2、创建一个DeviceReplay对象进行操作
Function Mouse_Click(x , y)
Dim device
Set device = CreateObject("Mercury.DeviceReplay")
device.MouseMove x , ydevice.MouseClick x , y , LEFT_MOUSE_BUTTON
End Function既然写了这个方法,顺便就介绍下Mercury.DeviceReplay这个对象,呵呵
很实用的一个对象,不知道为啥QTP的帮助几乎就没有它的介绍
这个对象用来模拟鼠标的单击和移动、键盘输入等,但有个前提,实用该对象前,需要保证键盘状态正确
如NUMLOCK是否打开等,因为DeviceReplay不能检测键盘状态
Mercury.DeviceReplay包括如下方法:
1、SendString方法
向激活的窗口发送一个或多个键盘按键:object.SendString( str )
2、KeyDown方法
模拟一个按键的按下并保持:object.KeyDown( key ) key : 按键的数值码
3、KeyUp方法
模拟通过键盘释放某个按下的按键:object.KeyUp( key )
4、PressKey方法
模拟通过键盘按下一个按键并立即释放:object.PressKey( key )
5、PressNKeys方法
模拟通过键盘多次按下一个按键并立即释放:object.PressNKey( key, N ) N:重复次数
6、DragAndDrop方法
用于执行从一点拖动到另外一点的操作:object.DragAndDrop( dragX, dragY, dropX, dropY, Button )
Button 的值包括
LEFT_MOUSE_BUTTON = 0
MIDDLE_MOUSE_BUTTON = 1
RIGHT_MOUSE_BUTTON = 2
7、MouseClick方法
在指定的屏幕位置执行鼠标左键或右键的单击操作:object.MouseClick( x, y, Button )
8、MouseDbClick方法
在指定的屏幕位置中执行鼠标左键或右键的双击事件:object.MouseDblClick( x, y, Button )
9、MouseDown方法
在屏幕指定位置按下鼠标左键或右键,并保持按下状态:object.MouseDown( x, y, Button )
10、MouseUp方法
用于释放之前执行的MouseDown方法所按下的鼠标按键:object.MouseDown( x, y, Button )
11、MouseMove方法
用于模拟鼠标移动:object.MouseMove( x, y)
12、SetSynchronizationTimeout方法
设置一个新的同步超时的时间值:object. SetSynchronizationTimeout(nSyncTimeout , is_sec)
nSyncTimeout : 同步超时的时间值。
is_sec : 指定设置的时间值是否以秒为单位