美文网首页selenium
(一)JAVA+selenium+testNG+poi实现exc

(一)JAVA+selenium+testNG+poi实现exc

作者: 阿阿潇 | 来源:发表于2018-11-28 14:26 被阅读0次

    准备:

    • java环境
    • 下载与浏览器版本符合的Driver
    • eclipse
    • excel

    准备好了就可以开干了

    • 先建一个maven工程
      在pom.xml引入我们所需要的一系列框架:
      selenium+testNG+poi
    <!-- https://mvnrepository.com/artifact/org.testng/testng -->
    <dependency>
                <groupId>org.testng</groupId>
                <artifactId>testng</artifactId>
                <version>6.14.2</version>
                <scope>test</scope>
    </dependency>
    <!-- POI EXCEL 文件读写 -->
    <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-excelant</artifactId>
                <version>3.14</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
    <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-java</artifactId>
                <version>3.14.0</version>
    </dependency>
    
    

    还是先来看看excel用例吧

    用例一般包括:标题、前置条件、测试步骤、测试数据、预期结果、实际结果
    这次实现用例模板如下:


    image.png

    excel表中第一页作为公共用例(多次会用到的前置条件),第二页作为普通用例。
    每一条用例与用例之间以一行空行作为标识
    这里建了两个model一个casemodel、一个stepmodel

    public class CaseModel {
        String caseName;
        List<StepModel> stepModels;
        
        
        public List<StepModel> getStepModels() {
            return stepModels;
        }
    
        public void setStepModels(List<StepModel> stepModels) {
            this.stepModels = stepModels;
        }
    
        public String getCaseName() {
            return caseName;
        }
    
        public void setCaseName(String caseName) {
            this.caseName = caseName;
        }
    }
    
    public class StepModel {
        String step;
        String Element;
        String precondition;
        String type;
        String action;
        String value;
        String expect;
        String object;
    
        public String getObject() {
            return object;
        }
    
        public String getPrecondition() {
            return precondition;
        }
    
        public void setPrecondition(String precondition) {
            this.precondition = precondition;
        }
    
        public void setObject(String object) {
            this.object = object;
        }
    
        public String getExpect() {
            return expect;
        }
    
        public void setExpect(String expect) {
            this.expect = expect;
        }
    
        public String getStep() {
            return step;
        }
    
        public void setStep(String step) {
            this.step = step;
        }
    
        public String getElement() {
            return Element;
        }
    
        public void setElement(String element) {
            Element = element;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        public String getAction() {
            return action;
        }
    
        public void setAction(String action) {
            this.action = action;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        @Override
        public String toString() {
            return "StepModel [step=" + step + ", Element=" + Element + ", type=" + type + ", action=" + action +"\n"+ ", value="
                    + value + ", expect=" + expect + ", object=" + object + "]"+"\n";
        }
    }
    

    下面是获取excel表中的数据,并创建一个case的list返回(caseType创建的一个枚举,根据这个来决定获取excel中那一页的数据)

    @SuppressWarnings("resource")
        public static List<CaseModel> getCaseList(String path, CaseType caseType) {
            String fileType = path.substring(path.lastIndexOf(".") + 1);
            List<CaseModel> caseModels = new ArrayList<CaseModel>();
            // 读取excel文件
            InputStream is = null;
            try {
                is = new FileInputStream(path);
                // 获取工作薄
                Workbook wb = null;
                if (fileType.equals("xls")) {
                    wb = new HSSFWorkbook(is);
                } else if (fileType.equals("xlsx")) {
                    wb = new XSSFWorkbook(is);
                } else {
                    return null;
                }
    
                CaseModel caseModel = new CaseModel();
                // 设定第一页未公共用例,第二页未普通用例
                int sheetIndex = 0;
                switch (caseType) {
                case publicCase:
                    sheetIndex = 0;
                    break;
                case ordinaryCase:
                    sheetIndex = 1;
                default:
                    break;
                }
                Sheet sheet = wb.getSheetAt(sheetIndex);
                // 获取行数;因已空行作为记号所以+1
                int lastRow = sheet.getLastRowNum() + 1;
                // 获取列数
                int lastcell = sheet.getRow(0).getLastCellNum();
                // System.out.println(lastRow);
                for (int i = 0; i <= lastRow; i++) {
                    Row row = sheet.getRow(i);
                    if (i == 0) {
                        // 第一行是标题
                        continue;
                    }
                    if (row == null) {
                        // 到了空行,list添加case,并初始化casemodel
                        caseModels.add(caseModel);
                        caseModel = new CaseModel();
                        continue;
                    }
                    StepModel stepModel = new StepModel();
                    for (int j = 0; j < lastcell; j++) {
                        String valueStr = "";
                        Cell cell = row.getCell(j);
                        if (cell == null) {
                            valueStr = null;
                        } else {
                            // 将cell中的内容转化为字符串
                                                 cell.setCellType(Cell.CELL_TYPE_STRING);
                            valueStr = cell.getStringCellValue();
                            // System.out.println(valueStr);
                        }
                        // 根据cellIndex添加对应的参数
                        switch (j) {
                        case 0:
                            if (valueStr != null) {
    //                          System.out.println("到了这里:");
    //                          System.out.println(valueStr);
                                if (valueStr.length() > 0) {
                                caseModel.setCaseName(valueStr);
                                }
    
                            }
                            break;
                        case 1:
                            stepModel.setPrecondition(valueStr);
                            break;
                        case 2:
                            stepModel.setStep(valueStr);
                            break;
                        case 3:
                            stepModel.setElement(valueStr);
                            break;
                        case 4:
                            stepModel.setType(valueStr);
                            break;
                        case 5:
                            stepModel.setObject(valueStr);
                            break;
                        case 6:
                            stepModel.setAction(valueStr);
                            break;
                        case 7:
                            stepModel.setValue(valueStr);
                            break;
                        case 8:
                            stepModel.setExpect(valueStr);
                        default:
                            break;
                        }
                    }
                    caseModel.stepModels.add(stepModel);
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (is != null)
                        is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return caseModels;
        }
    

    到这里实现了将excel变成了我们想要的数据形式

    接下来,将获取到的数据翻译,告诉代码应该去做什么

    用例表中有一个元素、方式字段是用来定位元素的信息
    于是就有了下面的方法

    public static WebElement getWebElement(String type, String element) {
            WebElement webElement = null;
            WebDriverWait wait = new WebDriverWait(Driver.getChromeDriver(), 10);
            if (type.equals("XPath")) {
                webElement = Driver.getChromeDriver().findElementByXPath(element);
            } else if (type.equals("ClassName")) {
                webElement = Driver.getChromeDriver().findElementByClassName(element);
            } else if (type.equals("CssSelector")) {
                webElement = Driver.getChromeDriver().findElementByCssSelector(element);
            } else if (type.equals("TagName")) {
                webElement = Driver.getChromeDriver().findElementByTagName(element);
            } else if (type.equals("PartialLinkText")) {
                webElement = Driver.getChromeDriver().findElementByPartialLinkText(element);
            } else if (type.equals("Name")) {
                webElement = Driver.getChromeDriver().findElementByName(element);
            } else if (type.equals("LinkText")) {
                webElement = Driver.getChromeDriver().findElementByLinkText(element);
            } else if (type.equals("Id")) {
                webElement = Driver.getChromeDriver().findElementById(element);
            } else {
                try {
    //              System.out.println(type);
                    System.err.println("寻找元素方法除了问题type:"+type+" element: "+element);
                    throw new RemoteException();
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            //等待元素出现
            wait.until(ExpectedConditions.visibilityOf(webElement));
            return webElement;
        }
    

    还有三个字段是对象、动作和参数(测试数据)
    如果对象为element那么执行的动作对象为element:则执行下面的方法

    public static String ElementAction(StepModel step) {
            WebDriverWait wait = new WebDriverWait(Driver.getChromeDriver(), 10);
            String action = step.getAction();
            String element = step.getElement();
            String type = step.getType();
            if (action.equals("click")) {
            getWebElement(type, element).click();
            } else if (action.equals("sendkeys")) {
                String value = step.getValue() == null ? "" : step.getValue();
                getWebElement(type, element).clear();
                getWebElement(type, element).sendKeys("a");
                getWebElement(type, element).sendKeys(Keys.BACK_SPACE);
                getWebElement(type, element).sendKeys(value);
            } else if (action.equals("submit")) {
                getWebElement(type, element).submit();
            } else if (action.equals("gettext")) {
                String actual = getWebElement(type, element).getText();
                           //目前默认gettext方法时为校验阶段;需改
                assertEquals(step.expect, actual);
            } else if (action.equals("movetoelement")) {
                Actions actions = new Actions(Driver.getChromeDriver());
                actions.moveToElement(getWebElement(type, element)).perform();
            }else if (action.equals("movetoelementclick")) {
                Actions actions = new Actions(Driver.getChromeDriver());
                actions.moveToElement(getWebElement(type, element)).build().perform();
    //          try {
    //              Thread.sleep(1000);
    //          } catch (InterruptedException e) {
    //              // TODO Auto-generated catch block
    //              e.printStackTrace();
    //          }
    //      System.out.println("在这里输出了状态:"+wait.until(ExpectedConditions.cl));  
    //      wait.until(ExpectedConditions.elementToBeClickable(getWebElement(type, element)));
                actions.click(getWebElement(type, element)).perform();
                
            }
            return type;//目前没有用,预留返回字段
        }
    

    如果对象为driver,则执行以下方法

      public static void get(String url) {
            getChromeDriver().get(url);
        }
        
        public static void refresh() {
            getChromeDriver().navigate().refresh();
        }
        
        public static void action(StepModel step) {
            String action = step.getAction();
            if (action.equals("get")) {
                get(step.getElement());
            }else if (action.equals("refresh")) {
                refresh();
            }else {
                System.err.println("不是写错了,就是还没写");
            }
        }
    

    理论上可对以上两个动作方法,根据所需扩充完善所需要的动作

    漏了个东西关于webdriver
    这里做了一个获取driver的单例
    并为它加了锁(防止线程安全问题)

        static  ChromeDriver chromeDriver;
        public static synchronized ChromeDriver getChromeDriver() {
            if (null==chromeDriver) {
             System.setProperty("webdriver.chrome.driver", "D:\\TEST\\chromedriver.exe");
             chromeDriver = new ChromeDriver();
             chromeDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    //       System.out.println("初始化");
        }
            return chromeDriver;
        }
    

    最最最后就是执行用例了

    理论上应重写testng相关方法(根据获取到的excel表自动生成相应Test)
    先走出第一步吧

    public class NewTest {
        static List<CaseModel> publicCaseList;
        @Test(dataProvider = "dp")
        public void f(CaseModel caseModel) {
            System.out.println("执行了用例" + caseModel);
             doCase(caseModel);
        }
    
        @AfterClass
        public void AfterClass() {
             Driver.getChromeDriver().quit();
        }
    
        @BeforeClass
        public void BeforeClass() {
            //获取公共用例
            publicCaseList = CaseModel.getCaseList("C:\\Users\\Administrator\\Desktop\\3.xlsx", CaseType.publicCase);
        }
        
        @DataProvider
        public Object[] dp() {
            //获取用例
            List<CaseModel> caseModels = CaseModel.getCaseList("C:\\Users\\Administrator\\Desktop\\3.xlsx",
                    CaseType.ordinaryCase);
            int size = caseModels.size();
            Object[] objects = new Object[size];
            for (int i = 0; i < objects.length; i++) {
                objects[i] = caseModels.get(i);
            }
           //System.out.println(objects.length + " " + size);
            return objects;
        }
        
        //根据casel模型执行用例
        public void doCase(CaseModel caseModel) {
            for (int i = 0; i < caseModel.stepModels.size(); i++) {
                StepModel stepModel = caseModel.stepModels.get(i);
                String object = stepModel.getObject();
                if (stepModel.precondition != null) {
                    //执行前置条件
                    for (CaseModel caseModel2 : publicCaseList) {
                        if (stepModel.precondition.equals(caseModel2.caseName)) {
                            //根据casename查找到说要执行的公共用例
                            doCase(caseModel2);
                            break;
                        }
                    }
                }
                if (object.equals("driver")) {
                    Driver.action(stepModel);
                } else {
                    //懒得写elseif。这里假装判断了是element
                    WebElementZ.ElementAction(stepModel);
                }
            }
        }
    }
    

    待完善

    • 根据获取到的excel表自动生成相应Test
    • 增加配置项(如:可选择浏览器、配置浏览器选项等)
    • 完善动作方法(这理论上是个无底洞)

    总结一下三点

    ...

    相关文章

      网友评论

        本文标题:(一)JAVA+selenium+testNG+poi实现exc

        本文链接:https://www.haomeiwen.com/subject/ncpaqqtx.html