注意:1、当在 测试类 中直接单击运行的时候则会用默认的.xml来运行该测试方法;必须在.xml中点击运行的时候则该TestNG.xml才有效
2、在创建TestNG测试类时可以自动生成对应的TestNG.xml文件,在创建类时生成xml文件和手动自己创建的xml文件都有效
testng说明文档:http://testng.org/doc/documentation-main.html
1、基本的testng.xml文档:
2、TestNG按照顺序执行Case
方法一:不同的类及类中所包含的方法都分别在xml中配置,然后按顺序执行Case,这样可以让不同类中的多个方法都可以按照顺序执行Case
java代码:
public class TestPlan1 extends BrowserOption{ WebDriver dr=null; String url=Demo.getprop("url"); String fcurl=Demo.getprop("fcurl"); String frameid="right_iframe"; MenuJump mj=new MenuJump(); int index=1;//index为sheet页,从0开始 @BeforeMethod public void beforeMethod(){ dr=Init.initchrome(dr); System.out.println("1111111111111111111111111111111111111111111111"); Login.LoginChrom(dr, fcurl); Demo.slp(3000); } @AfterMethod public void afterMethod(){ dr.quit(); //dr.close(); } /** * 添加计划 */ @Test(enabled=true) public void addPlan(){ mj.jumpfinancePlan(dr); mj.jumpfinancePlanT_1(dr); Demo.slp(1000); mj.toFram(dr, frameid); int colNum=2;//第二列 String js="document.getElementById(\'addFinancePlan\').click()"; exeJS(dr, js); Demo.slp(3000); //计划模板名称 Select s_tp=fSelect(dr, By.id("templateSelect")); s_tp.selectByIndex(1); /** * 取参数时可以用多种方式,可以从excel中读取,可以从.properties文件中读取,也可以直接赋值 */ //计划名称 WebElement w_p_name=fFind(dr, By.name("financePlan.name")); w_p_name.clear(); w_p_name.sendKeys(Demo.getExcel(index, 2, colNum));}}
/** * 更新草稿 */ @Test(enabled=true)public void updatePlanC(){ mj.jumpfinancePlan(dr); Demo.slp(1000); mj.jumpfinancePlanT_1(dr); Demo.slp(1000); toFram(dr, frameid); /** * 进入到修改计划界面(草稿) */ if(!isExist(dr,By.className("datagrid-cell-check "))){//根据第一行的复选框 addPlan(); }else {//有记录时执行修改操作(循环翻看每一页来获得需要修改的产品) //获取显示总页数的那串字符 String Lnum=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[3]")).findElement(By.xpath("//*[@id='planlist']/div[1]/div/div[3]/table/tbody/tr/td[8]/span")).getText();// System.out.println(Lnum); String number=Demo.getNUm(Lnum).get(0);//获取总页数 int number1=Integer.parseInt(number);//转换成int类型 //外层循环的是是否要翻页,某一页是否又符合的项,里面再调用对比是否有符合项的循环 for (int i = 0; i < number1; i++) { //获取每一页所有的tr对象 Listtrs=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[2]/div[2]/div[2]/table")).findElements(By.tagName("tr"));// System.out.println("aaaaaaa"+trs.size()); WebElement wbtr=Demo.getpoduct(trs, dr, By.className("datagrid-cell "));//获得具体的tr对象 if(wbtr!=null){ if(!wbtr.isSelected()){ wbtr.click();//返回对应的对象并点击选中 }else { System.err.println("选中计划时出错!!"); } break; }else {//执行翻页操作 WebElement btn_next=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[3]/table/tbody/tr/td[10]/a/span/span")); btn_next.click(); Demo.slp(3000); continue; } } //点击修改计划按钮 String js="document.getElementById(\"updateFinancePlan\").click()"; exeJS(dr, js); Demo.slp(5000); /** * 修改计划界面 */
java代码说明:以上用的是 @BeforeMethod、@AfterMethod这两个注解,指的是在执行每一个测试方法前/后 都执行公共方法,这样的缺点是每当执行一个测试方法时都要重新的登陆,造成反复登陆的缺陷
TestNG.xml中配置:在testng.xml中,可以控制测试用例按顺序执行。 当preserve-order="true"是,可以保证节点下面的方法是按顺序执行的
方法二:用TestNG的组合测试
注意:组合测试时,例如计划修改和更新,更新界面和修改界面的标签的name等属性一般都是保持一致的,所以当用组合测试时,很容易报找不到标签的问题,因为新增界面和修改界面都可以找到该属性值元素,但程序无法正确判断要调用哪一个,所以会出现非组合测试时程序可以正常运行,当组合测试时就会报错误,所以当想用组合测试时在更新界面需要获取上一级的元素对象(这也是分层获取元素对象的好处)然后再获该界面的对应的元素就可以避免该问题出现(参照例子:修改计划和更新计划)
java代码:
public class TestPlan1 extends BrowserOption{ WebDriver dr=null; String url=Demo.getprop("url"); String fcurl=Demo.getprop("fcurl"); String frameid="right_iframe"; MenuJump mj=new MenuJump(); int index=1;//index为sheet页,从0开始 // @BeforeMethod @BeforeGroups(groups={"grps"}) public void beforeMethod(){ dr=Init.initchrome(dr); System.out.println("1111111111111111111111111111111111111111111111"); Login.LoginChrom(dr, fcurl); Demo.slp(3000); mj.jumpfinancePlan(dr); Demo.slp(1000); mj.jumpfinancePlanT_1(dr); Demo.slp(1000); toFram(dr, frameid); } // @AfterMethod @AfterGroups(groups={"grps"}) public void afterMethod(){ dr.quit(); //dr.close(); } /** * 添加计划 */ @Test(enabled=true,groups={"grps"}) public void addPlan(){// mj.jumpfinancePlan(dr);// mj.jumpfinancePlanT_1(dr);// Demo.slp(1000);// // mj.toFram(dr, frameid); int colNum=2;//第二列 String js="document.getElementById(\'addFinancePlan\').click()"; exeJS(dr, js); Demo.slp(3000); //计划模板名称 Select s_tp=fSelect(dr, By.id("templateSelect")); s_tp.selectByIndex(1); /** * 取参数时可以用多种方式,可以从excel中读取,可以从.properties文件中读取,也可以直接赋值 */ //计划名称 WebElement w_p_name=fFind(dr, By.name("financePlan.name")); w_p_name.clear(); w_p_name.sendKeys(Demo.getExcel(index, 2, colNum));}}
/** * 更新草稿 */ @Test(enabled=true,groups={"grps"})public void updatePlanC(){// mj.jumpfinancePlan(dr);// Demo.slp(1000);// mj.jumpfinancePlanT_1(dr);// Demo.slp(1000);// toFram(dr, frameid); /** * 进入到修改计划界面(草稿) */ if(!isExist(dr,By.className("datagrid-cell-check "))){//根据第一行的复选框 addPlan(); }else {//有记录时执行修改操作(循环翻看每一页来获得需要修改的产品) //获取显示总页数的那串字符 String Lnum=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[3]")).findElement(By.xpath("//*[@id='planlist']/div[1]/div/div[3]/table/tbody/tr/td[8]/span")).getText();// System.out.println(Lnum); String number=Demo.getNUm(Lnum).get(0);//获取总页数 int number1=Integer.parseInt(number);//转换成int类型 //外层循环的是是否要翻页,某一页是否又符合的项,里面再调用对比是否有符合项的循环 for (int i = 0; i < number1; i++) { //获取每一页所有的tr对象 Listtrs=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[2]/div[2]/div[2]/table")).findElements(By.tagName("tr"));// System.out.println("aaaaaaa"+trs.size()); WebElement wbtr=Demo.getpoduct(trs, dr, By.className("datagrid-cell "));//获得具体的tr对象 if(wbtr!=null){ if(!wbtr.isSelected()){ wbtr.click();//返回对应的对象并点击选中 }else { System.err.println("选中计划时出错!!"); } break; }else {//执行翻页操作 WebElement btn_next=fFind(dr, By.xpath("//*[@id='planlist']/div[1]/div/div[3]/table/tbody/tr/td[10]/a/span/span")); btn_next.click(); Demo.slp(3000); continue; } } //点击修改计划按钮 String js="document.getElementById(\"updateFinancePlan\").click()"; exeJS(dr, js); Demo.slp(5000);
java代码说明:以上用的是 @BeforeGroups、 @AfterGroups这两个注解,@BeforeGroups指的是 被配置的方法将在列表中的gourp前运行。这个方法保证在第一个属于这些组的测试方法调用前立即执行。
@AfterGroups指的是 被配置的方法将在列表中的gourp后运行。这个方法保证在最后一个属于这些组的测试方法调用后立即执行。该方法 的好处是当执行完该组内所有的测试方法后才会退出操作,避免反复登陆的缺陷
TestNG.xml中配置:在testng.xml中,可以控制测试用例按顺序执行。 可以保证节点下面的方法是按顺序执行的