自动化测试-终章

这篇具有很好参考价值的文章主要介绍了自动化测试-终章。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

自动化测试-终章

前沿

如果想做不需要人去点击使用程序做到真正的自动化测试思想,以下是我的思想,需要跟着我的思路来,我们做一个可以测试所有页面的增删改查功能是否好使

思想一

我使用的是Java 做自动化测试,我们现做一个简单的自动化
pom 需要引入 selenium-java
然后需要搭建一下环境,需要下载 chromedriver 详情网上搜
写个测试类,以下代码就是简单的使用一下Selenium打开页面

private static final String url = "https://www.baidu.com/";
 public static void main(String[] args) {

        System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe");
       // System.setProperty("webdriver.http.factory", "jdk-http-client");

        ChromeOptions options = new ChromeOptions();
        //options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        driver.get(url);
      }

这时候我们需要点击一个按钮,但是我们不管点击还是干什么都是需要给xpath,id,class 等,有很多的步骤就需要写很多的代码特别麻烦,那我们可不可以直接获取页面所有的xpath

 //点击新能源
    driver.findElement(By.xpath("//*[@id=\"js-typenav\"]/ul/li[1]")).click();

思想二

如何获取页面所有 xpath
就用到了新的技术 jsoup 不了解可以去百度一下
jsoup 是可以获取页面所有dom 元素
获取所有dom,如何拼接成xpath
首先创建一个类 存储dom的

package com.selenium.demo.domain;

import lombok.Data;
import org.jsoup.nodes.Element;

import java.util.List;

@Data
public class Dom {

    private String id;

    //Xpath
    private String xpath;

    //当前节点
    private Element element;

    //当前其他节点
    private List<Dom> list;

    //当前子节点
    private List<Dom> childrenList;

    //当前父节点
    private Dom parentDom;

}

如何我们去递归遍历

package com.selenium.demo.Util;

import com.selenium.demo.domain.Dom;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/*
*
*
*
*
* */

public class JsoupUtil {


    /**
     * @Param WebDriver
     * @Param className  该 必须唯一 Class属性
     * @Param beginXpath 开始到该标签的Class属性
     * retrun List<Dom> 返回该标签下所有 Dom 节点
     */
    public static List<Dom> getUModalDialog(WebDriver driver, String className, String beginXpath) throws InterruptedException {
        Thread.sleep(1000);
        Document parse = Jsoup.parse(driver.getPageSource());
        //获取所有节点
        Elements uModalDialog = parse.getElementsByClass(className);
        //当前 父类 节点
        String xPath = beginXpath;
        return getAllDom(uModalDialog.get(0).children(),xPath,driver);
    }

    /**
     *
     * @param driver
     * @return 获取所有节点
     * @throws InterruptedException
     * 此方法用来刷新数据
     */
    public static List<Dom> getPushDom(WebDriver driver) throws InterruptedException {
        Thread.sleep(1000);
        String xPath = "/html/body";
        Document parse = Jsoup.parse(driver.getPageSource());
        Elements uModalDialog = parse.body().children();
        return getAllDom(uModalDialog,xPath,driver);
    }

    /**
     *
     * @param elements
     * @param xPath
     * @return List<Dom> 该节点下所有节点
     */
    public static List<Dom> getAllDom(Elements elements,String xPath,WebDriver driver){
        // 获取所有节点
        List<Dom> list = new ArrayList<>();
        // 循环所有节点
        for (Element element : elements) {
            //创建节点存放类
            Dom dom = new Dom();
            //赋值当前节点
            dom.setElement(element);
            // 赋值当前节点xpath
            getCurrentOtherXpath(elements, dom, xPath,driver);
            //赋值当前其他节点
            getCurrentOtherNodes(elements, dom, xPath,driver);
            //赋值父节点 初始无父节点
            dom.setParentDom(null);
            getElementsDoms(dom,driver);
            list.add(dom);
        }
        return list;
    }

    /**
     * @Param Dom 父节点
     * */
    public static void getElementsDoms(Dom dom,WebDriver driver){
        if(dom.getElement().children().size() > 0){
            //获取当前所有节点
            List<Dom> doms = listDom(dom.getElement().children(),dom.getXpath(),driver);
            //获取了子节点的Dom
            dom.setChildrenList(doms);
            for (Dom childrens : doms) {
                childrens.setParentDom(dom);
                getElementsDoms(childrens,driver);
            }
        }else{
            //获取当前所有节点
            List<Dom> doms = listDom(dom.getElement().children(),dom.getXpath(),driver);
            //获取了子节点的Dom
            dom.setChildrenList(doms);
        }
    }





    //获取当前节点 xpath
    public static void getCurrentOtherXpath(Elements elements, Dom dom, String xPath,WebDriver driver){
        //获取当前所有节点
        List<Dom> doms = listDom(elements,xPath,driver);
        for (Dom haveXpathDom : doms) {
            if(haveXpathDom.getElement() == dom.getElement()){
                dom.setXpath(haveXpathDom.getXpath());

            }
        }
    }

    //@Param 当前节点
    //@Param 当前Dom
    public static void getCurrentOtherNodes(Elements elements,Dom dom,String xPath,WebDriver driver){
        //获取当前其他所有节点
        List<Dom> doms = listDom(elements,xPath,driver);
        for (int i = 0 ; i < doms.size() ; i++) {
            Dom haveXpathDom = doms.get(i);
            if(haveXpathDom.getElement() == dom.getElement()){
                doms.remove(i);
            }
        }
        dom.setList(doms);
    }

    // 获取当前所有节点
    public static List<Dom> listDom(Elements elements, String xPath,WebDriver driver){
        //当前节点用了几个
        Map<String , Integer> useDomSubscript = getDomMax(elements);

        List<Dom> list = new ArrayList<>();
        for (Element element : elements) {
            Dom dom = new Dom();
            String tagName = element.tagName();

            //如果 存在 当前节点超过2个 赋值Xpath
            if(useDomSubscript.containsKey(tagName)){
                dom.setXpath(xPath+"/"+tagName+"["+useDomSubscript.get(tagName)+"]");
                useDomSubscript.put(tagName,useDomSubscript.get(tagName)+1);
            }else{
                dom.setXpath(xPath+"/"+tagName);
            }
            //赋值当前 element
            dom.setElement(element);
            list.add(dom);
        }
        return list;
    }


    public static void setXpathId(WebDriver driver, String xPath,String id){
        WebElement webElement = driver.findElement(new By.ByXPath(xPath));
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("arguments[0].setAttribute(arguments[1],arguments[2])",webElement, "id", id);
    }


    //获取超出2个以上的节点
    public static Map<String , Integer> getDomMax(Elements elements){
        Map<String , Integer> useDomSubscript = new HashMap<>();

        Map<String, Integer> domSubscript = getDomSubscript(elements);

        for (Map.Entry<String,Integer> entry : domSubscript.entrySet()) {
            //当前节点超过2个
            if(entry.getValue() > 1){
                useDomSubscript.put(entry.getKey(),1);
            }
        }
        return useDomSubscript;
    }

    //获取所有相同节点数量
    public static Map<String , Integer> getDomSubscript(Elements elements){
        Map<String , Integer> map = new HashMap();
        for (Element domSubscript : elements) {
            //存在 数量+1
            if(map.containsKey(domSubscript.tagName())){
                map.put(domSubscript.tagName(),map.get(domSubscript.tagName())+1);
            }else{
                //不存在 默认1
                map.put(domSubscript.tagName(),1);
            }
        }
        return map;
    }
}

getPushDom 调用 getPushDom 就会获取到所有的dom节点的xpath了

思想三

比如我想做一个对后台管理增加做一个表单检查
自动化测试-终章
调用到getPushDom 获取到所有dom再去递归,先获取到组件表单找到class=“el-form”
自动化测试-终章
然后获取class=“el-form-item” 是不是就获取到了所有输入框
进行逻辑检查比如是否禁用 disabled=“disabled”
自动化测试-终章
那我们怎么找到想要的输入框
可以根据label 在找
自动化测试-终章
以上就是大概的思路
如果自己封装组件可以自己封装class id 等其他规范一些
我已经开发到可以检查普通的crud的页面了
还有许多的问题要解决
比如复杂的需要怎么办
1.可以先从需求文档下手,先提交需求文档,然后代码读取需求文档
根据需求文档进行每一步的操作.反正真正的开发也要写需求文档,
写完是不是就省下了测试,让程序帮你.
2.页面dom是动态的怎么办
就是可能其中一个隐藏的input,点击一个按钮才出来,这时候我们获取的dom是死数据不刷新,所以我们要仿照前端的动态刷新方法,每一步的操作我们都要重新获取页面元素
3.程序运行的慢怎么办
我觉得慢没啥问题,让程序全自动跑放后台挂着呗,而且可以一下跑多个用例,10几个用例一起跑,不比你人去一个一个用例去点快文章来源地址https://www.toymoban.com/news/detail-472926.html

到了这里,关于自动化测试-终章的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自动化测试 - Web自动化测试原理

    目前市面上有很多Web UI自动化测试框架,比如WatiN, Selinimu,WebDriver,还有VS2010中的Coded UI等等. 这些框架都可以操作Web中的控件,模拟用户输入,点击等操作,实现Web自动化测试。其实这些工具的原理都一样,都是通过调用IE COM接口和HTML DOM 对IE浏览器以及WEB测试对象的操作。

    2024年01月16日
    浏览(35)
  • Selenium+python怎么搭建自动化测试框架、执行自动化测试用例、生成自动化测试报告、发送测试报告邮件

    本人在网上查找了很多做自动化的教程和实例,偶然的一个机会接触到了selenium,觉得非常好用。后来就在网上查阅各种selenium的教程,但是网上的东西真的是太多了,以至于很多东西参考完后无法系统的学习和应用。 以下整理的只是书中自动化项目的知识内容,介绍怎么搭

    2024年02月05日
    浏览(49)
  • 【自动化测试】几种常见的自动化测试框架

    在软件测试领域,自动化测试框架有很多,这里主要介绍几种常用的自动化测试框架。 pytest 是 Python 的一种单元测试框架,与 Python 自带的 unittest 测试框架类似,但是比 unittest 框架使用起来更简洁,效率更高。主要有以下几个特点: 简单灵活,容易上手。 支持参数化。 能

    2024年02月07日
    浏览(34)
  • selenium 自动化测试—如何搭建自动化测试环境?

    🍅 视频学习: 文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 最近也有很多人私下问我,selenium学习难吗,基础入门的学习内容很多是3以前的版本资料,对于有基础的人来说,3到4的差别虽然有,但是不足以影响自己,

    2024年02月19日
    浏览(48)
  • 自动化测试(三):接口自动化pytest测试框架

    API:Application Programming Interface 接口自动化按照自动化的工具可分为 基于 接口测试工具 的接口自动化 eg1:Postman+Newman+git/Svn+Jenkins(基于Javascript语言)接口自动化 Postman :创建和发送 API 请求,并对响应进行断言和验证。 Newman : Postman 的命令行工具,它允许测试人员在没有界

    2024年02月10日
    浏览(42)
  • Selenium自动化测试实战之自动化测试基础

    自动化测试概念 是把以人为驱动的测试转化为机器执行的一种过程,它是一种以程序测试程序的过程。 自动化只是测试方式,跟测试阶段无关。 可以把任何测试工作写一个程序自动化实现都可以称为自动化测试。 selenium自动化测试: 2023最新的Selenium自动化测试实战,没有比

    2024年02月13日
    浏览(54)
  • 字节跳动开源!超好用的视频抠图工具;GitHub开源项目维护协作指南;自动化数据清洗工具包;强化学习入门教程;前沿论文 | ShowMeAI资讯日报

    👀 日报合辑 | 📆 电子月刊 | 🔔 公众号下载资料 | 🍩 @韩信子 https://github.com/HelixNGC7293/DeforumStableDiffusionLocal https://space.bilibili.com/176003 文本提示作画工具。本代码库实现是本地版本的Deforum Stable Diffusion V0.4,支持txt设置文件输入和动画功能! https://github.com/PeterL1n/RobustVideoMat

    2023年04月08日
    浏览(44)
  • 自动化测试及典型开源的自动化测试工具

    目录 前言: 自动化测试 自动化测试的意义 手工测试的局限性 自动化测试带来的好处 自动化测试的前提条件 自动化测试的方法 自动化测试的不足 自动化测试的应用方向 典型开源的自动化测试工具 自动化测试是一种使用软件工具和脚本来执行测试任务的方法,以取代手动

    2024年02月13日
    浏览(46)
  • 【自动化测试】Java+Selenium自动化测试环境搭建

    本主要介绍以Java为基础,搭建Selenium自动化测试环境,并且实现代码编写的过程。 1.Selenium介绍 Selenium 1.0 包含 core、IDE、RC、grid 四部分,selenium 2.0 则是在两位大牛偶遇相互沟通决定把面向对象结构化(OOPP)和便于编写代码的各自思想予以整合后形成的新工具,也就是我们所

    2024年02月11日
    浏览(35)
  • 【二、自动化测试】为什么要做自动化测试?哪种项目适合做自动化?

    自动化测试是一种软件测试方法,通过编写和使用自动化脚本和工具,以自动执行测试用例并生成结果。 自动化旨在替代手动测试过程,提高测试效率和准确性。 自动化测试可以覆盖多种测试类型,包括功能测试、性能测试、安全测试等,以确保软件系统在各个方面的质量

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包