这里就是思维导图的模式进行编写,小编这里使用的是知悉这个软件,我觉得还不错:
当然这里小编设计得比较粗糙,在其实在自动化测试中,有一些接口并没有进行测试,所以为了方便演示,选了几个有代表性的UI接口;
首先我们在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();
}
}
注意:方法的调用中,我们将方法放置构造函数中,就是为了在其他类继承这个类后,可以自动创建驱动;
设置截屏的目的是为了观察在每次操作后,界面的展示情况,方便我们对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));
}
注意:设置这里的时间,以及路径主要是为了在截屏的时候,防止出现同名的情况下,进行覆盖,当然也是为了方便我们进行寻找我们需要的截图;
这里为什么要先编写未登录的情况呢?
首先未登录情况就是在没有cookie的情况下,进行路由的访问,但是如果我们在每一个页面进行测试的话,不仅要测试登录情况,还要测试未登录情况;这不是难为自己吗?未登录情况,只需要进行路由访问即可;所以可以统一放在一个类里;
这里涉及到登录失败的情况,所以我们顺便把他给完成了:
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文本输入框;
在没有登录的时候,直接进行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那么就会直接跳转到我们的登录页面,所以在进行是否成功进行拦截后,我们可以查找登录页面的元素,若找到了那么就说明拦截成功了~~~
这里没有什么可说的,即输入正确的用户名以及密码,然后点击进入首页:
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);
}
}
注意:在登录成功后,我们可以查找首页的元素,来进行判断是否登录成功;
代码如下:
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();
}
}
这里就是点击找到元素,然后在退后跳转后,通过登录页面元素的查找进行判断是否退出成功;
注意:在开始之前我们进行刷新的操作是为了将界面跳转至首页,因为首页才存在我们的退出元素
这里点击进入以及判断是否跳转成功,小编这里就不再进行演示了,直接进行回复测试;
我们使用的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赋值操作,但是我们可以模仿人为通过鼠标进行输入文本的操作
这就是当时的情况~~~;
那么在发布文章中,大致也就是上述的两种情况,所以小编不再演示;
小编就不进行如何点击进行用户中心页面,以及判断是否登录成功的判断演示了;
/**
* 用户中心的测试操作
*/
public void successUserDetail() throws NoSuchMethodException, IOException, InterruptedException {
//最后找到电话栏直接进行修改(较为粗糙)
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操作,将我们要传递的照片路径复制上去就可以了;
在这里我们要讨论一下,各个界面的依赖关系,比如我们在进行入用户中心后,下一次就是对于中心的操作,但是如果后面对象操作的是首页,那么我就要从用户中心进行回退操作;
当然还有我们点击登录过后,直接进进入首页,那么接下来对于的首页的元素点击等操作,就不必操作进行回退,刷新等操作了~~~
本期小编主要讲解了关于在编写自动化测试中遇到的一些问题,以及各个情况的代码演示和代码讲解,当然在之前还要进行测试用例的编;
🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!