霍格沃兹测试学院 北京 线下三期 selenium 进阶课 0722

Carol.Fu · July 22, 2018 · Last by 左岸 replied at August 04, 2018 · Last modified by admin 思寒_seveniruby · 1289 hits

POM添加TestNG

 <dependency>            
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.0</version>
</dependency>

创建XML-TEST PLAN

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="myPlan" >
<test name="Test">
<classes>
<class name="test.BeforeClass1"/>
<class name="test.BeforeClass2"/>
</classes>
</test> <!-- Test -->
</suite>

脚本添加读取csv代码

public Iterator<Object[]> readDataFromCSV(String path){
List<Object[]> list = new ArrayList<Object[]>();
try {
FileReader is = new FileReader(new File(path));
BufferedReader br = new BufferedReader(is);
while(br.ready()){
list.add(br.readLine().split(","));
}
return list.iterator();
}catch(Exception ex){
throw new SkipException(ex.getMessage());
}
}

POM添加读取Excel依赖

 <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>

脚本添加读取excel代码

public Object[][] getDataFromExcel(String excelPath) {
Workbook workbook;
try {
FileInputStream excelInputStream = new FileInputStream(excelPath);
workbook = new XSSFWorkbook(excelInputStream);
Sheet sheet = workbook.getSheetAt(0);
int rowInExcel = sheet.getPhysicalNumberOfRows();
int columnInExcel = sheet.getRow(0).getPhysicalNumberOfCells();
String[][] obj = new String[rowInExcel-1][columnInExcel];
for(int row = 1; row < rowInExcel; row++){
for(int col = 0; col < columnInExcel; col++){
sheet.getRow(row).getCell(col).setCellType(Cell.CELL_TYPE_STRING);
obj[row - 1][col] = sheet.getRow(row).getCell(col).getStringCellValue();
System.out.println(obj[row - 1][col]);
}
}
return obj;
}catch(Exception e){
throw new SkipException(e.getMessage());
}

}

POM添加AUTOIT依赖

<dependency>
<groupId>AutoIt</groupId>
<artifactId>AutoItX4Java</artifactId>
<version>1.0</version>
</dependency>

POM添加apache依赖

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>

AutoIT下载
https://www.autoitscript.com/site/autoit/downloads/

作业
登录失败流程,要求
1、使用PO模式
2、使用TESTNG框架
3、加入验证点
4、尽量使用数据驱动的方式,讲几种登录失败的情况都覆盖到。数据放在CSV文件中。
5、尽量使用CSS/XPATH的定位方式来定位

共收到 3 条回复 时间 点赞

TestNG的流程图,JUnit与Pytest类似

阿廉 北京测试开发全天班 (三期) 汇总贴 中提及了此贴 24 Jul 16:55
测试点:
1.po模式测试登录失败
2.使用testNG
3.用户名和密码存储使用csv
4.对登录失败进行断言

1.SetDataProvider.java
提供读取用户名和密码存储csv文件

/**
* 数据驱动-读取login测试数据
* csv返回的可迭代对象
* 逐行读取
*/

@DataProvider(name = "getLoginData_csv")
public static Iterator<Object[]> getLoginData_csv(){
Iterator<Object[]> o = readDataFromCSV(logindatacsv_path);
return o;
}

2.HomePage.java
封装首页登录点击操作
@FindBy(partialLinkText = "登录")
public WebElement HomeLogin;
/**
* 初始化页面
* 用于页面构造器
* @return
*/

public HomePage(WebDriver webDriver){
PageFactory.initElements(webDriver,this);
}
/**
点击首页登录
*/

public void Cilck_HomeLogin(){
HomeLogin.click();
}

3.LoginPage.java
封装登录页面点击操作
在点击登录以后,进行了登录断言,如果还在登录页面,说明断言成功

@FindBy(css = "#user_login")
public WebElement UserLogin;

@FindBy(xpath = "//*[@id='user_password']")
public WebElement UserPassword;

@FindBy(css = "#new_user > div.form-actions > input")
public WebElement ClickLogin;

/**
* 初始化页面
* 用于页面构造器
* @return
*/


public LoginPage(WebDriver webDriver){
PageFactory.initElements(webDriver,this);
}

/**
* 登录方法,可参数化
* @return
*/

public void DoLogin(String username,String pwd) throws InterruptedException {
System.out.println("DoLogin:"+ username + ","+ pwd);
if ( ! String.valueOf(username).equals("None")){
UserLogin.click();
UserLogin.clear();
UserLogin.sendKeys(username);
Thread.sleep(1000);
}
else {
System.out.println("username为空");
}
if ( ! String.valueOf(pwd).equals("None")){
UserPassword.click();
UserPassword.clear();
UserPassword.sendKeys(pwd);
Thread.sleep(1000);
}else {
System.out.println("pwd为空");
}
ClickLogin.click();
Thread.sleep(1000);
Assertunits.is_exist(ClickLogin);

}

4.TestCase_Login.java
登录测试用例
case中调用homepageloginpage具体实现方法

private String url;
private HomePage homePage;
private LoginPage loginPage;

/**
* 重写父类的setup方法
* @return
*/

@BeforeClass
@Override
public void setup() {
super.setup();
url = "http://testerhome.com/";
geturl(url,3);
homePage = new HomePage(webDriver);
loginPage = new LoginPage(webDriver);
homePage.Cilck_HomeLogin();
}

/**
* @testpoint 用户名错误,密码正常
* @return
*/

@Test(groups = "loginTest",dataProvider = "getLoginData_csv",dataProviderClass = SetDataProvider.class)
public void test_loginfail(String username,String pwd) throws InterruptedException {
System.out.println("data:"+ username + ":" + pwd);
loginPage.DoLogin(username,pwd);

}

@AfterClass()
@Override
public void teardown() {
super.teardown();
System.out.println(String.format("关闭网站%s,并退出浏览器", url));

}

5.testNGLogin.xml
testNG可执行文件

<classes>
<class name="TestCase.TestCase_Login"/>
</classes>

https://github.com/zhangting151/hgwz2018

实际工作中测试此场景的话,至少还需要解决如下问题:
1、登录失败的次数限制
2、登录状态的清除,即如果先执行的是登录成功再执行登录失败,则登录成功后需要退出登录
3、貌似登录失败的提示信息不是每次都一样?

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up