我的页面元素的相关属性是保存在数据库里的,需要在执行测试代码时读取出来,当时考虑用 C# 写 dll,查了查 JNative,只支持 32 位系统下,dll 也需要在 32 位系统下编译生成,所以放弃调用 dll 方式(不知道我查的对不对),所以采用 JDBC 方式。
配置如下
数据库安装就不多说了,我本地 64 位计算机,jdk1.8,Sql Server 2008R2
一、下载 Microsoft JDBC Driver 6.0
二、配置 CLASSPATH
将下载文件解压,我只留下了 sqljdbc4.jar 放在了 C:\sqljdbc4 目录下面(放在那里无所谓,关键是在配置 CLASSPATH 时指定好路径)。
环境变量配置:新建或者修改已有 CLASSPATH,值:C:\sqljdbc4;
三、复制包到相关目录下
sqljdbc4.jar 文件拷到:
E:\Program Files\Java\jdk1.8.0_05\jre\lib\ext
E:\Program Files\Java\jre8\lib\ext
目录下,分别拷贝一份(看你的安装目录了)。
到此,配置已经结束。
使用 JDBC 连接数据库
连接数据库代码:
import java.sql.*;
public class ReadDBslj {
//描述数据库驱动类型
String driverName;
//描述数据库连接地址
String dbURL;
//描述数据库连接用户名
String userName;
//描述数据库连接密码
String userPwd;
Connection dbConn;
public void connect(){
//设置数据库driver,采用数据库是SQL server
driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
//设置数据库连接地址
dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=Selenium_test";
//设置连接数据库用户名和密码
userName="sa";
userPwd="sa";
try
{
//载入驱动
Class.forName(driverName);
//连接数据库
dbConn=DriverManager.getConnection(dbURL,userName,userPwd);
System.out.println("连接数据库成功");
}
catch(Exception e)
{
e.printStackTrace();
System.out.print("连接失败");
}
}
//关闭连接
public void CloseConn()
{
try {
dbConn.close();
dbConn = null;
} catch (Exception ex) {
System.out.println(ex.getMessage());
dbConn=null;
}
}
}
存储页面元素的表结构如下图:
ID:自增长的 int,是主键
Name:页面元素的值(比如:登录名框存成 Login_name,密码存成 Login_password 什么的,自己要能认得)
Value:能定位到元素的具体值(比如://*[@id='pwdtd'])
Type:通过什么方式定位元素(比如:xpath,id 等)
[Desc]:对元素的备注描述
status:状态,锁定或正常使用
createtime:创建时间 getdate(),习惯了,我都爱带上这个字段
建库脚本如下:
USE [master]
GO
CREATE DATABASE [Selenium_test] ON PRIMARY
( NAME = N'Selenium_test', FILENAME = N'G:\temp\Selenium_test.mdf' , SIZE = 6072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'Selenium_test_log', FILENAME = N'G:\temp\Selenium_test_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
use Selenium_test
CREATE TABLE [dbo].[Tb_Locator](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Value] [nvarchar](200) NOT NULL,
[Type] [nvarchar](50) NOT NULL,
[Desc] [nvarchar](50) NOT NULL,
[status] [int] NOT NULL,
[createtime] [datetime] NOT NULL,
CONSTRAINT [PK_Tb_Locator] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'自增编号,主键' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tb_Locator',
@level2type=N'COLUMN',@level2name=N'Id'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'元素标题' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tb_Locator',
@level2type=N'COLUMN',@level2name=N'Name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'查找元素类型' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tb_Locator',
@level2type=N'COLUMN',@level2name=N'Type'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'元素描述' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Tb_Locator',
@level2type=N'COLUMN',@level2name=N'Desc'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'元素状态,0正常,1锁定' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'Tb_Locator', @level2type=N'COLUMN',@level2name=N'status'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间,系统自动生成' , @level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'Tb_Locator', @level2type=N'COLUMN',@level2name=N'createtime'
GO
ALTER TABLE [dbo].[Tb_Locator] ADD CONSTRAINT [DF_Tb_Locator_status] DEFAULT ((0)) FOR [status]
GO
ALTER TABLE [dbo].[Tb_Locator] ADD CONSTRAINT [DF_Tb_Locator_createtime] DEFAULT (getdate()) FOR [createtime]
GO
读取数据库元素代码,也在上面的类里面:
public String[][] Readelements() throws SQLException{
//连接数据库
this.connect();
//将结果存在一个可以自由移动游标的ResultSet中,再处理
Statement st =dbConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
//执行查询语句,结果放在resset中,我只查询了状态是正常的元素
ResultSet resset = st.executeQuery("select * from tb_Locator where [status]=0");
//计算行数
int rowCount = 0;
while(resset.next()){
rowCount++;
}
//用于遍历数组行,便于赋值
int i=0;
//将页面元素存储在elements中,包括:编号,名称,值,类型,描述四个值
String elements[][]=new String[rowCount][5];
//将指针放在第一条数据之前
resset.beforeFirst();
//遍历resset结果集,将对应列中的值,存在元素数组中
while(resset.next()) {
elements[i][0]=resset.getString("id");
elements[i][1]=resset.getString("name");
elements[i][2]=resset.getString("value");
elements[i][3]=resset.getString("type");
elements[i][4]=resset.getString("desc");
i++;
}
//关闭数据库连接
this.CloseConn();
//返回元素数组
return elements;
}
基本上就是在个样,缺点:我现在遍历了两次读取过来的结果集,一次是计算行数 rowCount,用于声明元素数组 elements 中的行,然后又遍历一次,给数组赋值,不知道有没有其他更好的办法