我的页面元素的相关属性是保存在数据库里的,需要在执行测试代码时读取出来,当时考虑用 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 中的行,然后又遍历一次,给数组赋值,不知道有没有其他更好的办法


↙↙↙阅读原文可查看相关链接,并与作者交流