一、selenium
1.1 Maven依赖包
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.3.0</version>
<!-- <scope>test</scope> -->
</dependency>
1.2 Driver 封装代码
略
1.3 页面元素操作
package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class BaiduSearchPages {
WebDriver webDriver;
By inputId = By.id("kw");
By searchButtonId = By.id("su");
public BaiduSearchPages(WebDriver webDriver) {
this.webDriver = webDriver;
}
public void toUrl(String url){
webDriver.get(url);
}
public void inputKey(String key){
webDriver.findElement(inputId).sendKeys(key);
}
public void clickSearchButton(){
webDriver.findElement(searchButtonId).click();
}
}
二、testNg 测试
2.1 .1可以自己创建测试文件夹(这里 不演示步骤)
2.1.2 在需要测试的class 右键
按步骤选择creatnew test
选择testng ,要测试的method
testNG测试代码
package pages;
import managers.BrowserDiverManager;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class BaiduSearchPagesTest {
WebDriver driver = BrowserDiverManager.getWebdriverInstance();
BaiduSearchPages baiduSearchPages;
@BeforeTest
public void setUp(){
baiduSearchPages = new BaiduSearchPages(driver);
baiduSearchPages.toUrl("https://www.baidu.com/");
}
@Test
public void testInputKey() {
baiduSearchPages.inputKey("测试");
}
@Test
public void testClickSearchButton() {
baiduSearchPages.clickSearchButton();
}
@AfterTest
public void tearDown(){
driver.close();
}
}
没有加入testNG.xml 控制,直接run 就行
三、生成报告
3.1 testNg 自带report 生成
个人觉得有点不好看,所以不展开说了,后续会用ExtentReport
四、使用extentReport
4.1 maven 包 ,extentReport 不同版本会有点不同
<dependency>
<groupId>com.aventstack</groupId>
<artifactId>extentreports</artifactId>
<version>5.0.8</version>
</dependency>
4.2 创建ExtentReport 类
public class ExtentReportsCreateHelper {
private static final String OUTPUT_FOLDER = "test-output/";
private static final String FILE_NAME = "baidutest.html";
private static ExtentReports extent;
public static ExtentReports getInstance(){
if (extent == null)
createInstance();
return extent;
}
private static void createInstance(){
File reportDir = new File(OUTPUT_FOLDER);
if (!reportDir.exists() && reportDir.isDirectory()){
reportDir.mkdir();
}
extent = new ExtentReports();
extent.attachReporter(createSparkReporter(OUTPUT_FOLDER+FILE_NAME));
extent.setReportUsesManualConfiguration(true);
}
private static ExtentSparkReporter createSparkReporter(String filePath){
ExtentSparkReporter extentSparkReporter = new ExtentSparkReporter(filePath);
extentSparkReporter.config(ExtentSparkReporterConfig.builder()
.theme(Theme.DARK)
.reportName("搜索测试")
.documentTitle("搜索测试")
.build());
return extentSparkReporter;
}
}
4.3 实现TestNg IReport 接口,报告不完善,可以根据自己的需要调整
public class ExtentTestNgListenerHelper implements IReporter {
private static ExtentReports extent = ExtentReportsCreateHelper.getInstance();
@Override
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
System.out.println("开始创建report==========");
if (suites.size()>0){
System.out.println("suites size:" + suites.size());
for (ISuite suite:suites) {
Map<String, ISuiteResult> results = suite.getResults();
for (ISuiteResult r: results.values()) {
ITestContext testContext = r.getTestContext();
IResultMap failedTests = testContext.getFailedTests();
IResultMap skippedTests = testContext.getSkippedTests();
IResultMap passedTests = testContext.getPassedTests();
Iterator<ITestResult> iteratorF = failedTests.getAllResults().iterator();
Iterator<ITestResult> iteratorS = skippedTests.getAllResults().iterator();
Iterator<ITestResult> iteratorP = passedTests.getAllResults().iterator();
//失败用例写入
createTestModle(iteratorF,"fail");
//成功用例写入
createTestModle(iteratorP,"pass");
//Skip 用例写入
createTestModle(iteratorS,"skip");
}
}
extent.flush();
System.out.println("-=========创建报告成功");
}
}
private void createTestModle(Iterator<ITestResult> iterator,String testResult){
while (iterator.hasNext()){
ITestResult next = iterator.next();
ExtentTest test = extent.createTest(next.getName());
test.getModel().setStartTime(getTime(next.getStartMillis()));
test.getModel().setEndTime(getTime(next.getEndMillis()));
switch (testResult){
case "pass":
test.createNode(next.getName()).assignCategory(next.getName()).pass(next.getThrowable());
break;
case "fail":
test.createNode(next.getName()).assignCategory(next.getName()).fail(next.getThrowable());
break;
case "skip":
test.createNode(next.getName()).assignCategory(next.getName()).skip(next.getSkipCausedBy().stream().findFirst().toString());
}
}
}
private Date getTime(long millis){
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(millis);
return calendar.getTime();
}
}
在testNg 测试类上加上@ Listener
@Listeners(ExtentTestNgListenerHelper.class)
public class BaiduSearchPagesTest {
WebDriver driver = BrowserDiverManager.getWebdriverInstance();
BaiduSearchPages baiduSearchPages;
@BeforeTest
public void setUp(){
baiduSearchPages = new BaiduSearchPages(driver);
baiduSearchPages.toUrl("https://www.baidu.com/");
}
@Test
public void testInputKey() {
baiduSearchPages.inputKey("测试");
}
@Test
public void testClickSearchButton() {
baiduSearchPages.clickSearchButton();
}
@AfterTest
public void tearDown(){
driver.close();
}
}
附录
troubleScreen
1、运行 testNg 报错
org.testng.TestNGException:
TestNG by default disables loading DTD from unsecured Urls. If you need to explicitly load the DTD from a http url, please do so by using the JVM argument [-Dtestng.dtd.http=true]
solution:
按提示在testng 运行文件加上 :-Dtestng.dtd.http=true