java - 必须从 Selenium 创建 Runnable JAR(TestNG/Maven 项目)
问题描述
我已经使用 POM 方法创建了混合框架,现在我必须从 Selenium 创建可运行的 JAR,客户端将能够从其机器上执行。我创建了 TestRunner:
package gov.gao.qa.testcases;
import org.testng.TestNG;
import gov.gao.qa.listeners.ExtentReportListener;
public class TestRunner {
static TestNG testNG;
public static void main(String[] args) {
ExtentReportListener ext = new ExtentReportListener();
testNG = new TestNG();
testNG.setTestClasses(new Class[] {NewBluePTest.class});
testNG.addListener(ext);
testNG.run();
}
}
This is my Report.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="New Blue Publishing Regression Suite" verbose="2" thread-count="2" parallel="tests">
<listeners>
<listener
class-name="gov.gao.qa.listeners.ExtentReportListener" />
</listeners>
<test name="NBP Regression Test_chrome">
<parameter name="browser" value="chrome" />
<classes>
<class name="gov.gao.qa.testcases.NewBluePTest" />
</classes>
</test>
<test name="NBP Regression Test_firefox">
<parameter name="browser" value="firefox" />
<classes>
<class name="gov.gao.qa.testcases.NewBluePTest" />
</classes>
</test>
</suite>
***Extent Report Listener class:***
public class ExtentReportListener extends BasePage implements ITestListener {
private static final String OUTPUT_FOLDER = "./REPOSRTS/";
private static final String FILE_NAME = "TestExecutionReport.html";
private static ExtentReports extent = init();
public static ThreadLocal<ExtentTest> test = new ThreadLocal<ExtentTest>();
private static ExtentReports init() {
Path path = Paths.get(OUTPUT_FOLDER);
if (!Files.exists(path)) {
try {
Files.createDirectories(path);
} catch (IOException e) {
e.printStackTrace();
}
}
ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(OUTPUT_FOLDER + FILE_NAME);
htmlReporter.config().setDocumentTitle("New Blue Publishing Automation Test Results");
htmlReporter.config().setReportName("Automation Test Results");
htmlReporter.config().setTestViewChartLocation(ChartLocation.TOP);
htmlReporter.config().setTheme(Theme.STANDARD);
extent = new ExtentReports();
extent.attachReporter(htmlReporter);
extent.setReportUsesManualConfiguration(true);
return extent;
}
public synchronized void onStart(ITestContext context) {
System.out.println("Test Suite started!");
}
public synchronized void onFinish(ITestContext context) {
System.out.println(("Test Suite is ending!"));
extent.flush();
test.remove();
}
public synchronized void onTestStart(ITestResult result) {
String methodName = result.getMethod().getMethodName();
String qualifiedName = result.getMethod().getQualifiedName();
int last = qualifiedName.lastIndexOf(".");
int mid = qualifiedName.substring(0, last).lastIndexOf(".");
String className = qualifiedName.substring(mid + 1, last);
System.out.println(methodName + " started!");
ExtentTest extentTest = extent.createTest(result.getMethod().getMethodName(),
result.getMethod().getDescription());
extentTest.assignCategory(result.getTestContext().getSuite().getName());
extentTest.assignCategory(className);
test.set(extentTest);
test.get().getModel().setStartTime(getTime(result.getStartMillis()));
}
public synchronized void onTestSuccess(ITestResult result) {
System.out.println((result.getMethod().getMethodName() + " passed!"));
test.get().pass("Test passed");
test.get().getModel().setEndTime(getTime(result.getEndMillis()));
}
******FAILES******
public synchronized void onTestFailure(ITestResult result) {
System.out.println((result.getMethod().getMethodName() + " failed!"));
try {
test.get().fail(result.getThrowable(),
--fail---------> MediaEntityBuilder.createScreenCaptureFromPath(getScreenshot()).build());
} catch (IOException e) {
System.err
.println("Exception thrown while updating test fail status " + Arrays.toString(e.getStackTrace()));
}
test.get().getModel().setEndTime(getTime(result.getEndMillis()));
}
public synchronized void onTestSkipped(ITestResult result) {
System.out.println((result.getMethod().getMethodName() + " skipped!"));
try {
test.get().skip(result.getThrowable(),
MediaEntityBuilder.createScreenCaptureFromPath(getScreenshot()).build());
} catch (IOException e) {
System.err
.println("Exception thrown while updating test skip status " + Arrays.toString(e.getStackTrace()));
}
test.get().getModel().setEndTime(getTime(result.getEndMillis()));
}
public synchronized void onTestFailedButWithinSuccessPercentage(ITestResult result) {
System.out.println(("onTestFailedButWithinSuccessPercentage for " + result.getMethod().getMethodName()));
}
private Date getTime(long millis) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(millis);
return calendar.getTime();
}
}
****Base page****
public WebDriver driver;
public Properties prop;
public static boolean highlightElement;
public OptionsManager optionsManager;
By OpenForm = By.xpath("//button[@class='open-button']");
By JobcodeField = By.id("jobCode");
By DraftHTML = By.xpath("//input[@value='Draft HTML']");
By HideForm = By.xpath("//button[contains(text(),'Hide Form')]");
public static ThreadLocal<WebDriver> tldriver = new ThreadLocal<WebDriver>();
public static synchronized WebDriver getDriver() {
return tldriver.get();
}
public WebDriver init_driver(Properties prop) {
String browserName = null;
if (System.getProperty("browser") == null) {
browserName = prop.getProperty("browser");
} else {
browserName = System.getProperty("browser");
}
highlightElement = prop.getProperty("highlight").equals("yes") ? true : false;
System.out.println("Browser Launched:" + " " + browserName);
optionsManager = new OptionsManager(prop);
// public WebDriver init_driver(String browserName) {
// highlightElement = prop.getProperty("highlight").equals("yes") ? true : false;
// System.out.println("Browser Launched:" + " " + browserName);
// optionsManager = new OptionsManager(prop);
if (browserName.equals("chrome")) {
WebDriverManager.chromedriver().setup();
tldriver.set(new ChromeDriver(optionsManager.getChromeOptions()));
} else if (browserName.equals("firefox")) {
WebDriverManager.firefoxdriver().setup();
tldriver.set(new FirefoxDriver(optionsManager.getFirefoxOptions()));
} else if (browserName.equals("internetexplorer")) {
WebDriverManager.iedriver().setup();
tldriver.set(new InternetExplorerDriver(optionsManager.io));
} else {
System.out.println("Browser Name" + " " + browserName + "is not found");
}
getDriver().manage().deleteAllCookies();
getDriver().manage().window().maximize();
if(System.getProperty("url") == null) {
getDriver().get(prop.getProperty("url"));
}else {
getDriver().get(System.getProperty("url"));
}
return getDriver();
}
public Properties init_properties() {
prop = new Properties();
String path = null;
String env = null;
try {
env = System.getProperty("env");
if (env.equals("qa")) {
path = "./src/main/java/gov/gao/qa/config/qa.config.properties";
} else if (env.equals("dev")) {
path = "./src/main/java/gov/gao/qa/config/dev.config.properties";
} else if (env.equals("demo")) {
path = "./src/main/java/gov/gao/qa/config/demo.config.properties";
}
} catch (Exception e) {
path = "./src/main/java/gov/gao/qa/config/config.properties";
}
try {
FileInputStream ip = new FileInputStream(path);
prop.load(ip);
} catch (FileNotFoundException e) {
System.out.println("Configuration Propoeries Issue... correct config.properties file");
} catch (IOException e) {
e.printStackTrace();
}
return prop;
}
public String getScreenshot() {
File src = ((TakesScreenshot) getDriver()).getScreenshotAs(OutputType.FILE); <-----failes
String path = System.getProperty("user.dir") + "/screenshots/" + System.currentTimeMillis() +".png";
File destination = new File(path);
try {
FileUtils.copyFile(src, destination);
} catch (IOException e) {
System.out.println("screenshot captured failed...");
}
return path;
}
}
当我执行 testRunner 时,它给了我: gov.gao.qa.listeners.ExtentReportListener 的 gov.gao.qa.base.BasePage.getScreenshot(BasePage.java:284) 的线程“main”java.lang.NullPointerException 中的异常。 onTestFailure(ExtentReportListener.java:89)
ExtentReport 是从网站复制的,我对此很陌生。请帮忙。
解决方案
推荐阅读
- visual-studio-2010 - 只有在数据仓库系统中修改过的历史数据,如何才能将其保存?
- python - 比较不同数据帧中的两个时间列并找到/保留最相似的值(不相似)
- python - 如何使用 Beam Python SDK 在 GCP Dataflow 中正确加载非 PyPi 依赖项?
- json - Perl从数组中获取最小的数字
- graph - 如何计算图表中的平均感染数?
- sparql - SPARQLWrapper - EndPointInternalError:端点返回代码 500 和响应
- angular - 订阅:位置 0 处 JSON 中的意外令牌
- reactjs - 如何将 ref 传递给邻居组件
- node.js - Angular-TS 设计模型类
- javascript - 如何使用reduce将字符串分成2个字符的块