大数跨境
0
0

【测试篇】对于项目的自动化测试经历和踩过的“坑”我有话要说

【测试篇】对于项目的自动化测试经历和踩过的“坑”我有话要说 51Testing软件测试网
2025-12-08
1
点击蓝字,立即关注


01

编写Web测试用例


这里就是思维导图的模式进行编写,小编这里使用的是知悉这个软件,我觉得还不错:

image.png

image.png

当然这里小编设计得比较粗糙,在其实在自动化测试中,有一些接口并没有进行测试,所以为了方便演示,选了几个有代表性的UI接口;


02

自动化测试代码


2.1准备工作


2.1.1驱动的创建

首先我们在common包里进行一个创建驱动的操作:

public class AutoTestUtil {    public static ChromeDriver driver;    private WebDriver createDriver(){        //创建驱动        if(driver == null){            ChromeDriverManager.chromedriver().setup();            //设置前置条件            ChromeOptions options = new ChromeOptions();            options.addArguments("--remote-allow-origins=*");            //创建驱动对象            driver = new ChromeDriver(options);            //设置隐式等待            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));        }        return driver;    }    //设置构造函数    public AutoTestUtil(){        createDriver();    }}


注意:方法的调用中,我们将方法放置构造函数中,就是为了在其他类继承这个类后,可以自动创建驱动;


2.1.2设置截屏

设置截屏的目的是为了观察在每次操作后,界面的展示情况,方便我们对BUG做出修改

代码如下:

 public void getScreen(String str) throws IOException {        //格式操作        SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");        SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");        //获取时间操作        String dirName = sim1.format(System.currentTimeMillis());        String comName = sim2.format(System.currentTimeMillis());        //拼接字符串.src/test/image/dirName/str/comName.png        String fileName = "src/test/image/" + dirName + "/" + str + "/" + comName + ".png";        //调用截图接口        File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);        FileUtils.copyFile(srcFile,new File(fileName));    }


注意:设置这里的时间,以及路径主要是为了在截屏的时候,防止出现同名的情况下,进行覆盖,当然也是为了方便我们进行寻找我们需要的截图; 


2.2未登录情况


这里为什么要先编写未登录的情况呢?

首先未登录情况就是在没有cookie的情况下,进行路由的访问,但是如果我们在每一个页面进行测试的话,不仅要测试登录情况,还要测试未登录情况;这不是难为自己吗?未登录情况,只需要进行路由访问即可;所以可以统一放在一个类里;


2.2.1登录失败情况

这里涉及到登录失败的情况,所以我们顺便把他给完成了:

public class PageNoLogin extends AutoTestUtil {    /**     * 登录失败测试     * @throws NoSuchMethodException     * @throws IOException     */    public void failLogin() throws NoSuchMethodException, IOException {        driver.get("http://47.97.70.52:8081/sign-in.html");        //获取这里的用户名与密码两个元素        //错误的用户名        driver.findElement(By.cssSelector("#username")).sendKeys("张三");        driver.findElement(By.cssSelector("#password")).sendKeys("zhy19150690517");        driver.findElement(By.cssSelector("#submit")).click();        //进行截图操作        String src = this.getClass().getMethod("failLogin").getName();        getScreen(src);        //清空输入框        driver.findElement(By.cssSelector("#username")).clear();        driver.findElement(By.cssSelector("#password")).clear();        //错误的密码        driver.findElement(By.cssSelector("#username")).sendKeys("海洋");        driver.findElement(By.cssSelector("#password")).sendKeys("zhy");        driver.findElement(By.cssSelector("#submit")).click();        getScreen(src);    }}


注意:在进行错误的示范测试的时候,要考虑一下几个方面:

用户名为错误,密码错误;

用户名为错误,密码正确;

用户名为正确,密码错误;

用户名为空,密码为空;

用户名为空,密码不为空;

用户名不为空,密码为空;


小编这里只演示了几个情况,后序可以进行补补~~~当然哈在每次进行输入的时候别忘了clear文本输入框;


2.2.2直接访问网址

在没有登录的时候,直接进行url访问即可:

/**     * index列表页,未登录状态     * @throws IOException     * @throws NoSuchMethodException     */    public void indexNoLogin() throws IOException, NoSuchMethodException {        driver.get("http://47.97.70.52:8081/index.html");        String src = this.getClass().getMethod("indexNoLogin").getName();        getScreen(src);        //此时会进行跳转,判断登录元素是否存在,设置了隐式等待,所以进行异常捕获        try {            driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2"));        }catch (Exception e){            System.out.println("在indexNoLogin方法里出现异常:" + e);        }    }


注意:在进行访问后,由于没有cookie那么就会直接跳转到我们的登录页面,所以在进行是否成功进行拦截后,我们可以查找登录页面的元素,若找到了那么就说明拦截成功了~~~


2.3成功登录


这里没有什么可说的,即输入正确的用户名以及密码,然后点击进入首页:

public class PageLogin extends AutoTestUtil {    /**     * 成功登录操作     * @throws IOException     * @throws NoSuchMethodException     */    public void successLogin() throws IOException, NoSuchMethodException {        driver.get("http://47.97.70.52:8081/sign-in.html");        //在进行操作之前,清空填写栏        driver.findElement(By.cssSelector("#username")).clear();        driver.findElement(By.cssSelector("#password")).clear();        //输入正确的用户名与密码        driver.findElement(By.cssSelector("#username")).sendKeys("海洋");        driver.findElement(By.cssSelector("#password")).sendKeys("hy19150690517");        //进行点击操作        driver.findElement(By.cssSelector("#submit")).click();        String src = this.getClass().getMethod("successLogin").getName();        getScreen(src);        //判断是否登录成功        try {            //首页标志            driver.findElement(By.cssSelector("#article_list_board_title"));            //导航栏            driver.findElement(By.cssSelector("#topBoardList > li:nth-child(2) > a > span.nav-link-title"));        }catch (Exception e){            System.out.println("successLogin方法出现异常:" + e);        }        getScreen(src);    }}


注意:在登录成功后,我们可以查找首页的元素,来进行判断是否登录成功;


2.4退出测试


代码如下:

public class PageExit extends AutoTestUtil {    /**     * 用户点击退出测试     */    public void successExit(){        //进行刷新的操作        driver.navigate().refresh();        //然后进行查找        driver.findElement(By.cssSelector("#index_nav_name_sub")).click();        driver.findElement(By.cssSelector("#index_user_logout > span")).click();        //进行判断是否退出成功        try {            String targetName = driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2")).getText();            if(targetName.equals("用户登录")){                System.out.println("用户退出成功");            }            getScreen(this.getClass().getMethod("successExit").getName());        }catch (Exception e){            System.out.println("successExit方法出现异常:" + e);        }        //driver.quit();    }}


这里就是点击找到元素,然后在退后跳转后,通过登录页面元素的查找进行判断是否退出成功;


注意:在开始之前我们进行刷新的操作是为了将界面跳转至首页,因为首页才存在我们的退出元素。


2.5文章详细页面回复测试


这里点击进入以及判断是否跳转成功,小编这里就不再进行演示了,直接进行回复测试;


我们使用的markdown进行回复的,所以通过浏览器界面元素直接输入是不能够达到模拟输入文本的操作,所以得另辟蹊径:

 public void successDetail() throws NoSuchMethodException, IOException, InterruptedException {        //进行回复操作测试        //直接回复,绕过前端检查,直接进行点击操作        element = driver.findElement(By.cssSelector("#details_btn_article_reply"));        JavascriptExecutor executor = (JavascriptExecutor) driver;        executor.executeScript("arguments[0].click();", element);        element = driver.findElement(By.cssSelector("#article_details_reply > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre"));        //模拟鼠标        Actions actions = new Actions(driver);        actions.doubleClick(element).perform();        actions.moveToElement(element).sendKeys("这是一篇好文章").perform();        getScreen(this.getClass().getMethod("successDetail").getName());        //这里可能会出现没有输入就进行点击回复的情况,所以需要进行强制等待        Thread.sleep(1000);        //再次进行提交操作        element = driver.findElement(By.cssSelector("#details_btn_article_reply"));        executor.executeScript("arguments[0].click();", element);        getScreen(this.getClass().getMethod("successDetail").getName());    }


解释:

在第一步我们找到点击按钮,直接提交进行输入为空的测试; 

第二步我们就是直接输入内容,然后再次进行点击提交操作;


注意:

1. 在浏览器界面中,若元素存在,但是出现元素不存在BUG可能是因为元素在界面之外,所以必须滑动滚轮;所以我们可以直接通过javascript进行直接点击操作,绕过前端检查,直接点击操作;

2. 由于我们不能直接操作markdown元素进行sendkeys赋值操作,但是我们可以模仿人为通过鼠标进行输入文本的操作。

image.png

这就是当时的情况~~~;

那么在发布文章中,大致也就是上述的两种情况,所以小编不再演示;


2.6用户中心修改


小编就不进行如何点击进行用户中心页面,以及判断是否登录成功的判断演示了;

 /**     * 用户中心的测试操作     */    public void successUserDetail() throws NoSuchMethodExceptionIOExceptionInterruptedException {        //最后找到电话栏直接进行修改(较为粗糙)        WebElement element = driver.findElement(By.cssSelector("#setting_input_phoneNum"));        //模拟鼠标滑动操作,找到元素位置        Actions actions = new Actions(driver);        actions.moveToElement(element).perform();        element.sendKeys("191508762893");        //点击修改        driver.findElement(By.cssSelector("#setting_submit_phoneNum")).click();        getScreen(this.getClass().getMethod("successUserDetail").getName());        //TODO(头像的修改操作)        element = driver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > div.row.align-items-center > div:nth-child(2) > a"));        element.sendKeys("\"C:\\Users\\Administrator\\Pictures\\Saved Pictures\\微信图片_20240322153345.jpg\"");        getScreen(this.getClass().getMethod("successUserDetail").getName());    }


解释:

1. 在这里也是出现了,元素在界面之外,所以这里要使用模拟鼠标的操作,滚动到我们需要修改的元素位置,然后浏览器就可以发现并修改了;

2.对于头像等文件的传输中,我们首先找到提交文件的位置,然后直接通过sendkeys操作,将我们要传递的照片路径复制上去就可以了;


2.7对象调用先后顺序


在这里我们要讨论一下,各个界面的依赖关系,比如我们在进行入用户中心后,下一次就是对于中心的操作,但是如果后面对象操作的是首页,那么我就要从用户中心进行回退操作;


当然还有我们点击登录过后,直接进进入首页,那么接下来对于的首页的元素点击等操作,就不必操作进行回退,刷新等操作了~~~


03

总结


本期小编主要讲解了关于在编写自动化测试中遇到的一些问题,以及各个情况的代码演示和代码讲解,当然在之前还要进行测试用例的编写;最后希望与诸君共勉,共同进步!!!



图片
END


链接:

https://blog.csdn.net/GGBond778/article/details/146540608

本文为51Testing经授权转载,转载文章所包含的文字来源于作者。如因内容或版权等问题,请联系51Testing进行删除




图片
点点赞
图片
点分享
图片
点推荐

【声明】内容源于网络
0
0
51Testing软件测试网
博为峰51Testing软件测试网提供各种线上招聘、线上课程等网络服务,出版软件测试系列丛书及电子杂志,组织线上技术交流活动;同时还举办多种线下公益活动,如软件测试沙龙、软件测试专场招聘会等。
内容 3878
粉丝 0
51Testing软件测试网 博为峰51Testing软件测试网提供各种线上招聘、线上课程等网络服务,出版软件测试系列丛书及电子杂志,组织线上技术交流活动;同时还举办多种线下公益活动,如软件测试沙龙、软件测试专场招聘会等。
总阅读100
粉丝0
内容3.9k