qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

电脑开机到操作系统开始启动过程描述

 1、按下电源向电脑主板及其他设备供电;
  2、主板芯片组向CPU发出RESET信号,cpu初始化;
  3、芯片组撤去RESET信号,CPU马上从地址FFFF0H出开始执行指令。//FFFFOH处的指令为跳转指令,跳转到系统BIOS程序存储地址
  注:按下电源时,电源电压尚不稳定,待cpu初始化完成,电源电压稳定后,RESET信息撤去,CPU开始执行指令。
  4、CPU执行系统BIOS程序:
  4.1 硬件检测配置
  a、进行POST(Power On Self Test,加电自检)检测系统中一些关键设备是否存在和能否正常工作,如内存显卡等。
  b、调用显卡BIOS程序,初始化显卡,用于后续信息显示
  c、检测CPU类型和工作频率,并将结果显示在屏幕上(一闪而过,一般看不到)
  d、检测系统中安装的一些标准硬件设备,如:硬盘、CD-ROM、软驱、串行接口和并行接口
  e、检测和配置系统中安装的即插即用的设备,为这些设备分配中断、DMA通道(直接存储器存取,是一种快速传送数据的机制)和I/O端口等资源
  4.2更新ESCD(Extended System Configuration Data,扩展系统配置数据)。
  ESCD是BIOS 保留的以前的设备资源分配表,是BIOS用来与操作系统交换硬件信息的数据,此数据存放在CMOS中。操作系统从ESCD中获得硬件信息,操作系统启动时会与实际的硬件信息相比较,若不符合会影响系统的启动。
  4.3 启动引导程序
  BIOS会根据用户CMOS中设置定义的启动顺序,从软盘、硬盘或光驱中寻找BootSector(引导扇区,记录引导文件的位置)并读取引导程序到内存,此时电脑的控制权交给了 引导程序,若没有发现引导扇区或引导程序系统无法启动。

posted @ 2013-10-14 09:56 顺其自然EVO 阅读(317) | 评论 (0)编辑 收藏

pxe网络安装操作系统 原理与详细过程

 摘要:在实际工作中,我们经常会遇到这样的情况:想要安装Linux但是计算机不带光驱或软驱,或者是笔记本配置的非标准的软驱和光驱,如1394接口,USB接口等,在Linux安装时所引导的Linux内核一般都不会带这些接口的驱动,所以也无法通过本地安装Linux,此外,在一些场合,如机房,IT实验室,工厂生产线,有大量的计算机需要同时安装Linux,如果通过光驱的方式一个个安装,不仅效率低,也不利于维护。这是时候你就需要PXE的强大功能了。本文将就PXE的基本原理和工作方式进行简要介绍。具体的时间过程需要比较丰富的网络知识。
  1.操作系统安装的流程
  通用流程:首先,bios启动,选择操作系统的启动(安装)模式(此时,内存是空白的),然后根据相关的安装模式,寻找操作系统的引导程序(不同的模式,对应不同的引导程序当然也对应着不同的引导程序存在的位置),引导程序加载文件系统初始化(initrd)程序和内核初始镜像(vmlinuz),完成操作系统安装前的初始化;接着,操作系统开始安装相关的系统和应用程序。
  硬盘安装的流程:bios启动——MBR寻找grub——grub程序读取menu.list等配置文件,找到内核启动镜像和相关初始化程序,安装(或者启动)。
  PXE(Pre-boot Execution Environment)是由Intel设计,可以使计算机通过网络启动的协议。协议分为client和server两端,PXE client在网卡的ROM中,当计算机启动时,BIOS把PXE client调入内存执行,并显示出命令菜单,经用户选择后,PXE client将放置在远端的操作系统通过网络下载到本地运行。
  pxe网络安装的流程:bios启动——pxe client中的程序进入内存,显示命令菜单——此程序开始寻找网络引导程序(bootstrap文件,这个文件的名字随着发行版的不同而不同,在centos中,它是pxelinux.0)——引导程序读取配置文件pxelinux.cfg,获得系统初始化的相关文件信息——系统启动,开始进行安装。
  2.pxe模式安装操作系统的原理
  2.1安装流程
  客户机从自己的PXE网卡启动,向本网络中的DHCP服务器索取IP,并搜寻引导文件的位置
  DHCP服务器返回分给客户机IP以及bootstrap文件的放置位置(该文件一般是放在一台TFTP服务器上)
  客户机向本网络中的TFTP服务器索取bootstrap文件
  客户机取得bootstrap文件后之执行该文件
  根据bootstrap的执行结果,通过TFTP服务器加载内核和文件系统
  进入安装画面, 此时可以通过选择FTP,HTTP,NFS方式之一进行安装
  2.2流程小结
  总结就是:
  1)网卡的client              网卡rom                         寻找dhcp服务器,由/etc/dhcp.conf得到ip和引导程序所在地点
  2)有dhcp.conf(引导程序文件名)和tftp的配置(tftp跟路径,里面有引导程序和系统初始化程序),得到引导程序pxelinux启动文件的绝对路径,运行引导程序,读取启动配置文件pxelinux.cfg/default,得到操作系统初始化的两个相关文件
  3)选择安装方式
  客户端广播dhcp请求——服务器相应请求,建立链接——由dhcp和tftp配置得到ip还有引导程序所在地点——客户端下载引导程序并开始运行——引导程序读取
  2.3.相关文件位置与内容:
  dhcp配置文件/etc/dhcpd/dhcp.conf——ip管理与引导程序名称
  tftp配置文件/etc/xinetd.d/tftp——tftp根目录,和上面的引导程序名称组成完整路径
  引导程序读取的配置文件/tftpboot/pxelinux.cfg/default——启动内核其他
  3.实战过程
  实战环境;centos 6.3,kernel 2.6.32
  3.1安装前的准备:
  软硬件配置:网卡要支持pxe启动,操作系统也要支持pxe启动,另外有ftp服务器用于存储操作系统的安装文件,dhcp服务器用于分配ip
3.2服务器配置
  1)配置dhcp服务器
  由于PXE客户机通常是尚未装系统的裸机,因此为了如服务器取得联系并正确下载相关引导文件,需要预先配置好DHCP服务来自动分配地址并告知引导文件的位置。
[root@localhost /]#yum -y install dhcp
[root@localhost /]#vim /etc/dhcp/dhcp.conf
ddns-update-style none;
default-lease-time 21600;
max-lease-time 43200;
option domain-name         "benet.com";
option domain-name-servers 8.8.8.8;
subnet 192.168.122.0 netmask 255.255.255.0 {
option routers 192.168.122.1;
option subnet-mask 255.255.255.0;
range 192.168.122.100 192.168.122.200;
next-server 192.168.122.1;   #指定TFTP服务器的地址
filename "pxelinux.0";     #指定PXE引导程序的文件名
}
[root@localhost /]#service dhcpd start
  注明:filename这一个选项很重要,它的作用是指明bootstrap所在的位置,一般是指向一个TFTP服务器的某个目录下。这里是相对路径,其中路径的上半部分在的一个配置文件之中。
  2)配置tftp服务器
  TFTP服务的配置文件是/etc/xinetd.d/tftp,RedHat9 默认安装已经生成了该文件
service tftp
{
disable        = no
socket_type                = dgram
protocol                = udp
wait                        = yes
user                        = root
server                        = /usr/sbin/in.tftpd
server_args        = -s /tftpboot
per_source                = 11
cps                                = 100 2
flags                        = IPv4
}
  注明:这个文件基本上不用改动,但是需要注意的的是server_args= -s /tftpboot这一行,它的含义是将/tftpboot作为root目录,这样在dhcpd.conf中的filename一行就应该写bootstrap的相对路径: filename “pxelinux.0”,这是出于安全方面考虑的.如果你去掉了-s这个参数,那幺就要在filename一行指出bootstrap的绝对路径: filename “/tftpboot/pxelinux.0”.注意,这里-s的内容会因为发行版的内容不同而不同,一般不用改动。
  3.3添加引导程序
  Bootstrap对于支持网络安装的操作系统,Bootstrap基本上都可以从安装源文件上找到,对于本例来说,centos的bootstrap就是cdrom:/isolinux/pxelinux.0我们把它们都拷贝到tftpboot下.
  3.4编辑引导配置文件
  把centos第一张安装光盘上images/pxeboot目录下的initr.img和vmlinux也考到tftpboot/目录下。在/tftpboot创建pxelinux.cfg目录,用于放isolinux的配制文件。光盘isolinux/下有一个isolinux.cfg文件,把它拷贝到/tftpboot/pxelinux.cfg/目录下并改名为default.下面为修改后的default文件:
  default linux
  prompt 1
  timeout 30
  label linux
  kernel vmlinuz
  append initrd=initrd.img
  这个Default 文件很容易看懂,就是告诉启动后使用那个内核引导
  3.5开始安装
  1)确保:服务器端刚才配置的几个服务都处于开启状态;关闭防火墙;bios中选择从网络启动
  2)剩下的步骤和从硬盘安装相同

posted @ 2013-10-14 09:44 顺其自然EVO 阅读(25625) | 评论 (0)编辑 收藏

Selenium2.0功能测试之forward与back

 这两个API的主要用途就是在几个页面之间来回跳转,也就是节省了driver.get的使用数量,用处不多直接上代码:
package org.coderinfo.demo;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class ForwardAndBack {
private static final String GOOGLEURL = "http://www.google.com.hk";
private static final String BAIDUURL = "http://www.baidu.com";
public static void main(String[] args) throws InterruptedException {
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize(); //最大化浏览器界面
driver.get(GOOGLEURL); //访问谷哥的首页 ,此处放弃度娘。
Thread.sleep(2000); //Wait for page load
driver.navigate().to(BAIDUURL); //访问度娘的首页 ,此处放弃谷哥。
Thread.sleep(2000); //Wait for page load
driver.navigate().back(); //使用API:back 反回谷哥首页
Thread.sleep(2000); //Wait for page load
driver.navigate().forward(); //使用API:forward 再次前往度娘首页
Thread.sleep(5000);
driver.quit();  //彻底退出WebDriver
}
}
相关文章
Selenium2.0功能测试之唯一元素的定位
Selenium2.0功能测试之访问站点及获取页面信息

posted @ 2013-10-11 10:17 顺其自然EVO 阅读(327) | 评论 (0)编辑 收藏

testdao简单qtp登录描述性编程

实验环境:
  QTP10+ie6+testdao网站登录
  目的:
  尝试简单的描述性编程
  实验内容:
  ====================录制代码================
  1、运行qtp,直接录制打开的页面,以下为录制代码:
  With Browser("测试之道 - TestDao").Page("测试之道 - TestDao")
  .webEdit("username").Set "001"
  .WebEdit("password").SetSecure "50efa30bb712b83c14d2d01bae7f31d73eef82a6"
  .WebButton("登录").Click
  End With
  ===============打开对象库,查看对象属性信息======
  2、查看对象
  ==============根据属性进行修改==============
  3、进行对象描述
  With Browser("name:=测试之道 - TestDao").Page("title:=测试之道 - TestDao")
  .WebEdit("name:=username").Set "001"
  .WebEdit("name:=password").SetSecure "50efa30bb712b83c14d2d01bae7f31d73eef82a6"
  .WebButton("name:=登录").Click
  End With
  ===========验证是否描述性可以不需要对象库的支撑,可以回放成功========
  4、删除对象库
  ===============回放查看结果================

posted @ 2013-10-11 10:15 顺其自然EVO 阅读(248) | 评论 (0)编辑 收藏

数据库基准测试工具 LinkBench

 LinkBench 是一个数据库基准测试工具,用来模拟 Facebook 产品 MySQL 数据库的性能和工作负载。LinkBench 高度可配置和可扩展,可配置用于不同的工作负载,并可编写插件来对其他数据库系统进行测试。
  作为一个用于基准测试和调整数据库系统的开发人员工具,LinkBench是设计来重制(replicate)混合了数据模型、图状结构(graph structure),以及Facebook的MySQL社交图谱的请求量负荷的。

posted @ 2013-10-11 10:12 顺其自然EVO 阅读(395) | 评论 (0)编辑 收藏

黑马程序员:java基础之装饰设计模式

一、什么是装饰设计模式
  当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的类成为装饰类。
  装饰类通常会通过构造方法,传递进来一个需要装饰的对象,然后基于这个对象,提供更强大的方法。
  下面是装饰设计模式的一个例子,自己写的MyBufferedReader,并提供了myReadLine方法,IO包中类BufferedReader采用原理也是类似的。
/*
装饰设计模式:MyBufferedReader
*/
importjava.io.*;
classMyBufferedReader
{
privateFileReaderfr;
MyBufferedReader(FileReaderfr)
{
this.fr=fr;
}
publicStringmyReadLine()throwsIOException
{
StringBuildersb=newStringBuilder();
intch;
while((ch=fr.read())!=-1)
{
if(ch=='\r')
continue;
elseif(ch=='\n')
returnsb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
returnsb.toString();
returnnull;
}
publicvoidmyClose()throwsIOException
{
fr.close();
}
}
classMyBufferedReaderDemo
{
publicstaticvoidmain(String[]args)throwsIOException
{
FileReaderfr=newFileReader("test.txt");
MyBufferedReaderbr=newMyBufferedReader(fr);
Stringline=null;
while((line=br.myReadLine())!=null)
{
System.out.println(line);
}
br.myClose();
}
}
  二、装饰和继承的区别
  装饰设计模式比继承要灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。
  装饰类因为增强已有对象,具备的功能与已有对象是相同的,只不过提供了更强的功能。所以装饰类和被装饰类通常
  是属于同一个体系的。
  如下所示:
MyReaderMyReader
|--MyTextReader|--MyTextReader
|--MyBufferedTextReader|--MyMediaReader
|--MyMediaReader|--MyBufferedReader
|--MyBufferedMediaReader
  如果为了改进一些功能而继承,就可能导致整个继承树过于臃肿,同时要考虑事物之间是否是父类和子类的关系。
  在IO包中,还有一个LineNumberReader,继承了BufferedReader,复用了其中功能(readLine),同时是FileReader的装饰类。如果想要获取所读文件中的行数,可以用这个装饰类,其中主要提供了了setLineNumber(),getLineNumber()方法。

posted @ 2013-10-11 10:01 顺其自然EVO 阅读(236) | 评论 (0)编辑 收藏

android sqlite使用之模糊查询数据库数据的三种方式

 android应用开发中常常需要记录一下数据,而在查询的时候如何实现模糊查询呢?很少有文章来做这样的介绍,所以这里简单的介绍下三种sqlite的模糊查询方式,直接上代码把:
package com.example.utils;
import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBManage extends SQLiteOpenHelper {
static int init_version = 1;
static String database_name = "android_sqlite_test.db";
static String tab_name = "uer_log";
static String tab_field01 = "_id";
static String tab_field02 = "log_name";
SQLiteDatabase mDatabase;
public DBManage(Context context) {
super(context, database_name, null, init_version);
// TODO Auto-generated constructor stub
mDatabase = getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql = "create table " + tab_name + " ( " + tab_field01
+ " integer primary key , " + tab_field02 + " text  not null) ";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
/**
* 插入记录
*
* @param u
* @return
*/
public boolean insertData(String... str) {
int request_int = 0;
for (int i = 0; i < str.length; i++) {
// 实例化一个ContentValues 对象 ,作用,收集数据,方便于SQLite执行增,删,改,查
ContentValues contentValues = new ContentValues();
contentValues.put(tab_field02, str[i]);
mDatabase.insert(tab_name, null, contentValues);
request_int++;
}
return str.length == request_int;
}
// 根据条件模糊查询数据库数据
public ArrayList<String> query(int top_int, String... str) {
ArrayList<String> result_list = new ArrayList<String>();
mDatabase = getReadableDatabase();
//模糊查询的三种方式:
/*
* 全部查询
String current_sql_sel = "SELECT  * FROM " + tab_name;
Cursor c = mDatabase.rawQuery(current_sql_sel, null);*/
//1.使用这种query方法%号前不能加' ;
Cursor c_test = mDatabase.query(tab_name, new String[]{tab_field02}, tab_field02+"  LIKE ? ",
new String[] { "%" + str[0] + "%" }, null, null, null);
//2.使用这种query方法%号前必须加'  ;
//  Cursor  c_test=mDatabase.query(tab_name, new String[]{tab_field02},tab_field02+"  like '%" + str[0] + "%'", null, null, null, null);
//3.使用这种方式必须在%号前加'  ;
String current_sql_sel = "SELECT  * FROM "+tab_name +" where "+tab_field02+" like '%"+str[0]+"%'";
//Cursor c_test = mDatabase.rawQuery(current_sql_sel, null);
Log.e("tag", "查询完成...");
while (c_test.moveToNext()) {
String name = c_test.getString(c_test.getColumnIndex(tab_field02));
//name.contains(str[0]);
// 让集合中的数据不重复;
if (!result_list.contains(name)) {
result_list.add(name);
Log.e("tag", name);
}
}
c_test.close();
return result_list;
}
}

 SQL模糊查询语句
  SQL模糊查询,使用like比较字,加上SQL里的通配符,请参考以下:
  1、LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
  2、LIKE'%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。
  3、LIKE'%en%' 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。
  4、LIKE'_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。
  5、LIKE'[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
  6、LIKE'[M-Z]inger' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。
  7、LIKE'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。
  下面这句查询字符串,根据变量 zipcode_key 在邮政编码表 zipcode 中查询对应的数据,这句是判断变量 zipcode_key 为非数字时的查询语句,用 % 来匹配任意长度的字符串,从表中地址、市、省三列中查询包含关键字的所有数据项,并按省、市、地址排序。这个例子比较简单,只要你理解了方法就可以写出更复杂的查询语句。
  sql = "select * from zipcode where (address like'%" & zipcode_key & "%') or (city like'%" & zipcode_key & "%') or (province like'%" & zipcode_key & "%') order by province,city,address

posted @ 2013-10-11 09:56 顺其自然EVO 阅读(15741) | 评论 (1)编辑 收藏

性能测试之:一次线程不安全导致的死循环

 性能测试场景:
  发送3条HTTP请求给服务器,服务器响应请求有2条是同步响应,有1条是异步响应。3个请求分别为3个事务。
  测试过程中的现象:
  1、第一个场景做性能测试时,场景运行为15分钟,运行正常,各项指标也正常。做了3次同场景测试之后,确定性能测试通过。
  2、第二个场景做疲劳测试,场景运行半个小时之后,服务器CPU突然升高到100%,load average持续很高。而且在压力停止之后很长一段时间,CPU利用率仍然100%,load average仍然很高。
  分析问题,解决:
  1、分析问题:
  通过上述现象,使用VisualVM工具,查看线程dump,发现里面有大量线程block。但是通过线程无法具体定位到那段代码。
  为了精确定位引起线程block的代码,将3条Http请求进行分解,并分别测试,发现是第2条http请求引起的线程block。就下来的事情相对测试就简单了,主要是我们的开发人员进行代码分析,如果导致线程block了。
  2、最终定位问题和解决:
  开发同事定位问题:HashMap 对象不是线程安全的,在并发调用的时候容易造成程序死循环。从而导致CPU100%,且压力停止之后,CPU仍然100%,也非常符合上述场景测试结果。
  解决方案:
  (1)、HashMap不是线程安全的。
  (2)、在并发的场合需要使用ConcurrentHashMap对象(读多写少)。

posted @ 2013-10-10 11:17 顺其自然EVO 阅读(239) | 评论 (0)编辑 收藏

Selenium2.0功能测试之唯一元素的定位

 页面元素的定位可以说是WebDriver中最核心的内容了,我们定位一个元素的目的主要有:操作元素,获取该元素的属性,获取元素的text以及获取元素的数量,WebDriver 为我们提供了以下几种方法来帮我们定位一个web元素:
  通过元素的id获取
  通过元素的name获取
  通过元素的tag name 获取
  通过css xpath 获取
  通过xpath 获取
  通过class name  获取
  通过一部分的link text 获取元素
  通过全部的link text 获取元素
package org.coderinfo.demo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class FindSingleElements {
private static final String URL = "file:///C:/Desktop/Selenium/login.html"; // 需要更改这个URL到你自己的login.html 的文件路径
public static void main(String[] args) throws InterruptedException {
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize(); //最大化浏览器界面
driver.get(URL); //访问谷哥的首页 ,此处放弃度娘。
Thread.sleep(2000); //Wait for page load
driver.findElement(By.id("inputEmail")).sendKeys("coderinfo@163.com"); // use id to find a web element
Thread.sleep(2000);
driver.findElement(By.name("password")).sendKeys("#####");    // use name to find a web element
Thread.sleep(2000);
driver.findElement(By.cssSelector("#inputEmail")).clear();   // use css selector to find a web element
Thread.sleep(2000);
driver.findElement(By.linkText("UseLink")).click();  // use link text to find a web element
Thread.sleep(2000);
driver.findElement(By.partialLinkText("Use")).click(); // use partial link text to find a web element
Thread.sleep(2000);
String formClassName = driver.findElement(By.tagName("form")).getAttribute("class");  //use tag name to find a web element
System.out.println(formClassName);
Thread.sleep(2000);
String text = driver.findElement(By.xpath("/html/body/form/div[1]/div")).getText();  // use xpath to find a web element
System.out.println(text);
String inputText = driver.findElement(By.className("inputClass")).getAttribute("placeholder");  // use class name to find a web element
System.out.println(inputText);
Thread.sleep(5000);
driver.quit();  //彻底退出WebDriver
}
}
相关文章
Selenium2.0功能测试之forward与back

posted @ 2013-10-10 11:17 顺其自然EVO 阅读(817) | 评论 (0)编辑 收藏

通过set和get来封装代码和传递参数

 我们可以通过set和get来对参数进行封装,这样既能提高代码的安全性,也能在不同的类中进行传参
  下面举一个例子:
import java.io.File;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
/*
*设置变量的set和get方法;用于传值和取值;其中set是传值,get是取值
*/
public class LoginCenter {
//设置打开浏览器的默认方式
private FirefoxProfile profile = new FirefoxProfile(new File("C:\\Users\\qinfei\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\sdk"));
private WebDriver driver=new FirefoxDriver(profile);
private String baseUrl;
//传递打开浏览器的方式,如果传入空值,那么设置成默认值
public void setWebDriver(WebDriver dri){
if(dri!=null){
driver=dri;
}
}
// 获取打开浏览器的方式
public WebDriver getWebDriver(){
return driver;
}
//设置变量url,用于存放浏览器地址
public void setbaseUrl(String url){
if(url!=null){
baseUrl=url;
}
}
//获取浏览器地址
public String getbaseUrl(){
return baseUrl;
}
}
  再新建一个类,调用LoginCenter类中的变量
import org.openqa.selenium.WebDriver;
public class Test101 {
public static void main(String[] args){
WebDriver dri=null;
String url;
//调用封装的类,这里需要实例化
LoginCenter lo=new LoginCenter();
//调用LoginCenter类中的setbaseUrl方法,用于传值
lo.setbaseUrl("http://www.baidu.com");
//传值之后,再来取值
url=lo.getbaseUrl();
//这里没有调用LoginCenter类中的setWebDriver方法,那么以默认方式打开浏览器
dri=lo.getWebDriver();
//实例化Test101类
Test101 t1=new Test101();
//调用Test101类中的test方法,传入打开浏览器的方式和浏览器的地址
t1.test(dri, url);
}
public void test(WebDriver dri,String url){
//通过get方法来设置浏览器地址
dri.get(url);
}
}


  以java application的方法运行,如图:
  最终运行的效果为:



posted @ 2013-10-10 10:57 顺其自然EVO 阅读(323) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 197 198 199 200 201 202 203 204 205 下一页 Last 
<2025年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜