自动化测试-终章

news/2024/10/30 23:20:42/

自动化测试-终章

前沿

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

思想一

我使用的是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;//Xpathprivate 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);// 赋值当前节点xpathgetCurrentOtherXpath(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);//获取了子节点的Domdom.setChildrenList(doms);for (Dom childrens : doms) {childrens.setParentDom(dom);getElementsDoms(childrens,driver);}}else{//获取当前所有节点List<Dom> doms = listDom(dom.getElement().children(),dom.getXpath(),driver);//获取了子节点的Domdom.setChildrenList(doms);}}//获取当前节点 xpathpublic 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 当前Dompublic 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个 赋值Xpathif(useDomSubscript.containsKey(tagName)){dom.setXpath(xPath+"/"+tagName+"["+useDomSubscript.get(tagName)+"]");useDomSubscript.put(tagName,useDomSubscript.get(tagName)+1);}else{dom.setXpath(xPath+"/"+tagName);}//赋值当前 elementdom.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) {//存在 数量+1if(map.containsKey(domSubscript.tagName())){map.put(domSubscript.tagName(),map.get(domSubscript.tagName())+1);}else{//不存在 默认1map.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几个用例一起跑,不比你人去一个一个用例去点快


http://www.ppmy.cn/news/163606.html

相关文章

【漏洞复现】海康威视iVMS综合安防系统任意文件上传漏洞复现 (在野0day)

文章目录 前言声明一、产品简介二、漏洞概述三、影响范围四、漏洞验证五、漏洞利用六、修复建议 前言 海康威视iVMS综合安防系统存在任意文件上传漏洞 &#xff0c;攻击者可通过构造特定Payload实施对目标的攻击。 声明 本篇文章仅用于漏洞复现与技术研究&#xff0c;请勿利用…

leetcode 每日一题统计范围内的元音字符串数

2559. 统计范围内的元音字符串数 提示 中等 32 相关企业 给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。 每个查询 queries[i] [li, ri] 会要求我们统计在 words 中下标在 li 到 ri 范围内&#xff08;包含 这两个值&#xff09;并且以元音开…

[详细的微信授权登陆 demo]

目录 前言: Java实现微信授权登录的步骤如下&#xff1a; 生成授权链接&#xff0c;让用户点击该链接进行授权。可以使用WeixinService的getAuthorizeUrl方法来生成授权链接&#xff1a; 其中&#xff0c;redirectUrl是用户授权后跳转的链接&#xff0c;snsapi_userinfo表…

下周计划:封阳台、配电脑、补手机

8月8日&#xff0c;同老婆来长沙趁着奥运之夜倒长沙出差、租房中发生一起严重的民事案件、犯罪嫌疑人估计知道家中没人、破门而入——盗走了我的PSP2000&#xff0c;还有老婆的家用电脑Acer 4310笔记本电脑。 10月18日&#xff0c;独自一人坐车从宜昌再到长沙&#xff0c;该路…

喜讯丨计讯物联5G物联网数据网关TG463荣登2022年度中国物联网行业创新产品榜

近日&#xff0c;备受瞩目的2022‘物联之星’中国物联网产业年度榜单颁奖典礼在上海世博展览馆会场隆重举行。经由申报筛选、网络人气投票、专家评委投票等多重环节&#xff0c;计讯物联旗下5G物联网数据网关TG463荣登2022年度中国物联网行业创新产品榜。 作为中国物联网行业…

【嵌入式烧录/刷写文件】-2.8-Hex文件转换为S19文件

案例背景(共5页精讲)&#xff1a; 有如下一段Hex文件&#xff0c;将其转换为Motorola S-record(S19/SREC/mot/SX)文件。 :2091000058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775F :2091200078797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939…

235款鼠标样式免费下载

235款鼠标样式免费下载 样式预览 1-12 13-24 25-36 37-48 49-60 61-72 73-84 85-96 97-108 109-120 121-132 133-144 145-156 157-168 169-180 181-192 193-204 205-216 217-216 229-235 下载方式 码云下载: WangSong1111/cursor Github下载&#xff1a;UniqueYou/cursor …

买富勒鼠标的请注意了

1月前买的A08G无线鼠标&#xff0c;最近出现了左键单击一下成了双击的现象&#xff0c;上网搜了一下&#xff0c;出现这种情况的人不少。问了一下客服&#xff0c;态度很好&#xff0c;拿鼠标到销售商去换即可。但我是从网上买的呀。只能自认倒霉&#xff0c;自己换个微动开关了…