如何确定登录成功或者失败的弹出框提示信息(toast内容)是前端写的还是接口返回的:
(1)fiddler抓包
(2) F12->network->XHR
弹出框提示信息停留时间短,很快消失了,这要怎么定位呢?
(1)提示信息出来后
F12->source 点击右边的暂停建
(2)调整网速
F12-->network->online->slow 3g
image.png
自动化测试用例设计原则:
1 .用例相互之间没有干扰,任何一条用例
都可以单独执行,不依赖与其他用例
设计思路:每去执行一条用例,就重新打开浏览器
2.用例重复的操作/断言
设计思路:通过dataProvider数据提供者,驱动测试用例执行
3.自动化测试用例是由手工测试用例转化而来的
选择用例的原则--重要的且比较适合自动化
基础重复的功能---登录
业务核心---投资理财
测试用例优先级---优先级高
历史Bug比较多的模块
BeforeTest和BeforeMethod的区别
BeforeTest:是测试suit执行之前执行的----是suit套件里面所有的测试方法执行之前执行---针对所有的测试方法---只执行一次
BeforeMethod:是在@Test注解中的测试方法执行之前执行---针对单个测试方法,如果有多个测试方法都要执行,那么每执行完一个测试方法,会从BeforeMethod处再执行一次(BeforeMethod中的代码会执行多次)
AfterTest和AfterMethod的区别:?
AfterTest:是在所有测试方法执行结束之后再执行----只会执行一次
AfterMethod:是针对单个测试方法执行结束之后再执行,如果有多个测试方法,每个测试方法都会执行一遍AfterMethod中的代码(会执行多次)
上节写了成功登录正向case,下面写反向case:
演示如下:
package com.lemon.testcases;
import static org.testng.Assert.assertTrue;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class Logincases {
public static WebDriver driver;
@BeforeTest
public void setUp() {
// 前置
// 打开浏览器
openBrowser("chrome");
driver.get("http://120.78.128.25:8765/Index/login.html");
}
/**
* 成功登录
*/
@Test
public void Login_success() throws InterruptedException {
// 找到手机号输入框 输入手机号
WebElement phone = driver.findElement(By.name("phone"));
phone.sendKeys("13323234545");
// 找到到密码输入框 输入密码
WebElement password = driver.findElement(By.name("password"));
password.sendKeys("lemon123456");
// 找到登录按钮 点击登录
WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
login.click();
//断言
// 显示等待----我的账户元素可见且存在
WebDriverWait wait = new WebDriverWait(driver, 6);
WebElement until = wait
.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(text(),'我的帐户')]")));
// 断言--我的账户 元素可见 until.isDisplayed()==true 说明断言成功
Assert.assertTrue(until.isDisplayed());
}
/**
* 未注册
*/
@Test
public void unregister() {
// 找到手机号输入框 输入 未注册的手机号
WebElement phone = driver.findElement(By.name("phone"));
phone.sendKeys("13333333331");
// 找到到密码输入框 输入密码
WebElement password = driver.findElement(By.name("password"));
password.sendKeys("lemon123456");
// 找到登录按钮 点击登录
WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
login.click();
//断言
WebDriverWait wait = new WebDriverWait(driver,5);
WebElement until = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class=\\\"layui-layer-content\\\"]")));
Assert.assertTrue(until.isDisplayed());
}
@AfterTest
public void teardown() {
// 退出浏览器
driver.quit();
}
public static void openBrowser(String browser) {
if (browser.equals("chrome")) {
// 1.设置chromedriver驱动文件的路径
System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
// 2.打开浏览器
driver = new ChromeDriver();
// 4.退出浏览器即关闭浏览器
// quit是退出浏览器,close是只关闭当前打开的窗口,不等于关闭整个浏览器
// driver.quit();
}
}
}
执行上面代码:
PASSED: Login_success
FAILED: unregister
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"*[name='phone']"}
(Session info: chrome=79.0.3945.88)
For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'DESKTOP-T8FJLOJ', ip: '192.168.101.17', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_65'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 79.0.3945.88, chrome: {chromedriverVersion: 79.0.3945.36 (3582db32b3389..., userDataDir: C:\Users\TF\AppData\Local\T...}, goog:chromeOptions: {debuggerAddress: localhost:49348}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify}
Session ID: 436fe9bb55f354ebc6c627911f008c0e
从上面报错可以发现:未注册的case执行报错了,这是为什么呢?
这是因为:登录case执行ok,就进入到首页了,首页是没有登录界面的,所有就报找不到元素的错误,那么如何解决呢?
解决方法:先执行未注册的case,再执行登录case
@Test(priority=1) @Test(priority=2) 设置优先级 值越高,执行顺序就越靠后
代码设置优先级ok,再次执行:
未注册case可以执行,但是登录case又执行失败:如下图
这是因为,执行 未注册case,输入手机号,没有清空
image.png
上面问题如何解决?
解决方式:每执行一次case,就重新打开一个新的浏览器(没有缓存)
代码优化如下:
package com.lemon.testcases;
import static org.testng.Assert.assertTrue;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class Logincases {
public static WebDriver driver;
@BeforeMethod
public void setUp() {
// 前置
// 打开浏览器
openBrowser("chrome");
driver.get("http://120.78.128.25:8765/Index/login.html");
}
/**
* 成功登录
*/
@Test(priority = 2)
public void Login_success() throws InterruptedException {
// 找到手机号输入框 输入手机号
WebElement phone = driver.findElement(By.name("phone"));
phone.sendKeys("13323234545");
// 找到到密码输入框 输入密码
WebElement password = driver.findElement(By.name("password"));
password.sendKeys("lemon123456");
// 找到登录按钮 点击登录
WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
login.click();
// 断言
// 显示等待----我的账户元素可见且存在
WebDriverWait wait = new WebDriverWait(driver, 6);
WebElement until = wait
.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(text(),'我的帐户')]")));
// 断言--我的账户 元素可见 until.isDisplayed()==true 说明断言成功
Assert.assertTrue(until.isDisplayed());
}
/**
* 未注册
*/
@Test(priority = 1)
public void unregister() {
// 找到手机号输入框 输入 未注册的手机号
WebElement phone = driver.findElement(By.name("phone"));
phone.sendKeys("13333333331");
// 找到到密码输入框 输入密码
WebElement password = driver.findElement(By.name("password"));
password.sendKeys("lemon123456");
// 找到登录按钮 点击登录
WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
login.click();
// 断言
WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement until = wait
.until(ExpectedConditions.visibilityOfElementLocated(By.className("layui-layer-content")));
String actualValue = "此账号没有经过授权,请联系管理员!";
String expectedValue = until.getText();// 获取元素的文本的值
Assert.assertEquals(actualValue, expectedValue);
}
@AfterMethod
public void teardown() {
// 退出浏览器
driver.quit();
}
public static void openBrowser(String browser) {
if (browser.equals("chrome")) {
// 1.设置chromedriver驱动文件的路径
System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
// 2.打开浏览器
driver = new ChromeDriver();
// 4.退出浏览器即关闭浏览器
// quit是退出浏览器,close是只关闭当前打开的窗口,不等于关闭整个浏览器
// driver.quit();
}
}
}
疑问:反向case 有很多,要全面覆盖,每个case写一个测试方法吗?
答案:肯定不是。如果反向用例元素定位方式是一样的,可以通过数据驱动,传参实现,使用同一个测试方法
package com.lemon.testcases;
import static org.testng.Assert.assertTrue;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class Logincases {
public static WebDriver driver;
@BeforeMethod
public void setUp() {
// 前置
// 打开浏览器
openBrowser("chrome");
driver.get("http://120.78.128.25:8765/Index/login.html");
}
/**
* 反向case数据提供源
*
* @return
*/
@DataProvider
public Object[][] loginDatas() {
Object[][] datas = { { "13333333331", "lemon123456", "此账号没有经过授权,请联系管理员!" },
{ "13323234545", "123456", "帐号或密码错误!" }
};
return datas;
}
/**
* 成功登录
*/
@Test(priority = 2)
public void Login_success() throws InterruptedException {
// 找到手机号输入框 输入手机号
WebElement phone = driver.findElement(By.name("phone"));
phone.sendKeys("13323234545");
// 找到到密码输入框 输入密码
WebElement password = driver.findElement(By.name("password"));
password.sendKeys("lemon123456");
// 找到登录按钮 点击登录
WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
login.click();
// 断言
// 显示等待----我的账户元素可见且存在
WebDriverWait wait = new WebDriverWait(driver, 6);
WebElement until = wait
.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(text(),'我的帐户')]")));
// 断言--我的账户 元素可见 until.isDisplayed()==true 说明断言成功
Assert.assertTrue(until.isDisplayed());
}
/**
* 未注册
*/
@Test(priority = 1, dataProvider = "loginDatas")
public void login_failure(String mobilephone, String pwd, String msg) {
// 找到手机号输入框 输入 未注册的手机号
WebElement phone = driver.findElement(By.name("phone"));
phone.sendKeys(mobilephone);
// 找到到密码输入框 输入密码
WebElement password = driver.findElement(By.name("password"));
password.sendKeys(pwd);
// 找到登录按钮 点击登录
WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
login.click();
// 断言
WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement until = wait
.until(ExpectedConditions.visibilityOfElementLocated(By.className("layui-layer-content")));
String actualValue = msg;
String expectedValue = until.getText();// 获取元素的文本的值
Assert.assertEquals(actualValue, expectedValue);
}
@AfterMethod
public void teardown() {
// 退出浏览器
driver.quit();
}
public static void openBrowser(String browser) {
if (browser.equals("chrome")) {
// 1.设置chromedriver驱动文件的路径
System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
// 2.打开浏览器
driver = new ChromeDriver();
// 4.退出浏览器即关闭浏览器
// quit是退出浏览器,close是只关闭当前打开的窗口,不等于关闭整个浏览器
// driver.quit();
}
}
}
执行结果:
PASSED: login_failure("13333333331", "lemon123456", "此账号没有经过授权,请联系管理员!")
PASSED: login_failure("13323234545", "123456", "帐号或密码错误!")
PASSED: Login_success
===============================================
Default test
Tests run: 3, Failures: 0, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 4 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@7c30a502: 21 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@1d251891: 15 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@b684286: 4 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@511baa65: 3 ms
[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@5b464ce8: 2 ms
网友评论