这是我在 SO 中的第一篇文章;我是一名新手 Selenium 用户,具有 Java 初学者技能。
向您介绍我们的工作背景;我们正在使用页面对象模型。我们所有的测试都使用单个DataProvider方法,该方法根据调用/使用 DataProvider 的测试用例名称从“.xlsx”文件中获取其数据。
但是,我们不确定我们是否已经按照应有的方式声明了ThreadLocal 。而且,我们不确定我们的getDriver()方法的声明是否正确。另一个问题是我们不确定是否应该在我们的setup和tearDown方法中使用“@BeforeTest”/“@AfterTest”或“@BeforeClass”/“@AfterClass” 。
遇到以下问题:
- 一项测试失败,随后的测试也失败。
- 有时获取的测试数据不准确(抛出的列数据多于预期)。
这是我们的 CONFIGTESTBASE 类:
public class ConfigTestBase {
private static ThreadLocal<RemoteWebDriver> threadedDriver = null;
private static XSSFSheet ExcelWSheet;
private static XSSFWorkbook ExcelWBook;
private static XSSFCell Cell;
private static XSSFRow Row;
private static final String Path_TestData = GlobalConstants.testDataFilePath;
private static final String File_TestData = GlobalConstants.testDataFileName;
@Parameters({"objectMapperFile"})
@BeforeSuite
public void setupSuite(String objectMapperFile) throws Exception {
GlobalConstants.objectMapperDefPath = new File(objectMapperFile).getAbsolutePath();
new Common().OverrideSSLHandshakeException();
}
@Parameters({"browserName"})
@BeforeClass
public void setup(String browserName) throws Exception {
threadedDriver = new ThreadLocal<>();
DesiredCapabilities capabilities = new DesiredCapabilities();
if (browserName.toLowerCase().contains("firefox")) {
capabilities = DesiredCapabilities.firefox();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
capabilities.setBrowserName("firefox");
capabilities.setPlatform(Platform.WINDOWS);
}
if (browserName.toLowerCase().contains("ie")) {
System.setProperty("webdriver.ie.driver","C:\\selenium\\IEDriverServer.exe");
capabilities = DesiredCapabilities.internetExplorer();
capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
capabilities.setCapability(InternetExplorerDriver.FORCE_CREATE_PROCESS, false);
capabilities.setBrowserName("internet explorer");
capabilities.setPlatform(Platform.WINDOWS);
}
if (browserName.toLowerCase().contains("chrome")) {
System.setProperty("webdriver.chrome.driver","C:\\selenium\\chromedriver.exe");
capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
capabilities.setBrowserName("chrome");
capabilities.setPlatform(Platform.WINDOWS);
}
if (browserName.toLowerCase().contains("safari")) {
SafariOptions options = new SafariOptions();
options.setUseCleanSession(true);
capabilities = DesiredCapabilities.safari();
capabilities.setCapability(SafariOptions.CAPABILITY, options);
capabilities.setBrowserName("safari");
capabilities.setPlatform(Platform.WINDOWS);
}
threadedDriver.set(new RemoteWebDriver(new URL(GlobalConstants.GRIDHUB), capabilities));
}
protected static RemoteWebDriver getDriver(){
RemoteWebDriver driver = null;
try {
driver = threadedDriver.get();
} catch (Exception e) {
e.printStackTrace();
}
return driver;
}
@AfterClass
public void tearDown() throws Exception {
getDriver().quit();
}
//This method is to set the File path and to open the Excel file, Pass Excel Path and Sheetname as Arguments to this method
public void setExcelFile(String Path,String SheetName) throws Exception {
try {
// Open the Excel file
FileInputStream ExcelFile = new FileInputStream(Path);
// Access the required test data sheet
ExcelWBook = new XSSFWorkbook(ExcelFile);
ExcelWSheet = ExcelWBook.getSheet(SheetName);
} catch (Exception e) {
throw (e);
}
}
//This method is to read the test data from the Excel cell, in this we are passing parameters as Row num and Col num
@SuppressWarnings("static-access")
public String getCellData(int RowNum, int ColNum) throws Exception{
try{
Cell = null;
Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum);
Cell.setCellType(Cell.CELL_TYPE_STRING);
return Cell.getStringCellValue();
} catch (Exception e) {
return "";
}
}
//This method is to write in the Excel cell, Row num and Col num are the parameters
@SuppressWarnings("static-access")
public void setCellData(String textValue, int RowNum, int ColNum) throws Exception {
try{
Row = ExcelWSheet.getRow(RowNum);
Cell = Row.getCell(ColNum, Row.RETURN_BLANK_AS_NULL);
if (Cell == null) {
Cell = Row.createCell(ColNum);
Cell.setCellValue(textValue);
} else {
Cell.setCellValue(textValue);
}
// Constant variables Test Data path and Test Data file name
FileOutputStream fileOut = new FileOutputStream(Path_TestData + File_TestData);
ExcelWBook.write(fileOut);
fileOut.flush();
fileOut.close();
} catch (Exception e) {
throw (e);
}
}
@DataProvider(name="getDataFromFile")
public Object[][] getDataFromFile(Method testMethod, ITestContext context) throws Exception {
String[][] tabArray;
int intCounter;
int intRowCount = 0;
int intRowCounter = 0;
int intColCount = 0;
int intColCounter;
int intColDataCount = 0;
int intColDataCounter = 0;
String temp;
String testName = testMethod.getName();
String banner = context.getCurrentXmlTest().getParameter("banner");
setExcelFile(Path_TestData + File_TestData, banner);
//get number of data to be returned
for(intCounter=0;intCounter<ExcelWSheet.getLastRowNum()+1;intCounter++){
if(getCellData(intCounter, 1).equals(testName)) {
if (intColCount == 0) {
intColCount = ExcelWSheet.getRow(intCounter).getLastCellNum() - 2;
}
intRowCount++;
}
}
if(intRowCount == 0){
System.out.println("\n*** Data for '" + testName + "' was not found.");
throw new AssertionError("Data for '" + testName + "' was not found.");
}
for(intCounter=0;intCounter<ExcelWSheet.getLastRowNum()+1;intCounter++){
if(getCellData(intCounter, 1).equals(testName)) {
for(intColCounter=2;intColCounter<intColCount+2;intColCounter++) {
temp = getCellData(intCounter,intColCounter);
if(temp != null && !temp.isEmpty()){
intColDataCount++;
}
}
//to exit FOR loop
intCounter = ExcelWSheet.getLastRowNum()+1;
}
}
//set data array dimension
tabArray = new String[intRowCount][intColDataCount];
for(intCounter=0;intCounter<ExcelWSheet.getLastRowNum()+1;intCounter++){
if(getCellData(intCounter, 1).equals(testName)) {
intRowCounter++;
for(intColCounter=2;intColCounter<intColCount+2;intColCounter++) {
temp = getCellData(intCounter,intColCounter);
if(temp != null && !temp.isEmpty()){
tabArray[intRowCounter-1][intColDataCounter] = getCellData(intCounter,intColCounter);
intColDataCounter++;
}
}
}
}
return tabArray;
}
}
这是我们拥有的示例测试类;扩展 CONFIGTESTBASE 类...每个测试一个类:
public class Google6 extends ConfigTestBase {
private Generic generic = null;
private HomePage homePage = null;
@BeforeMethod
public void MethodInit(ITestResult result) throws Exception {
generic = new Generic(getDriver());
homePage = new HomePage(getDriver());
}
@Test(dataProvider="getDataFromFile")
public void Google6(String execute, String url, String searchString) throws Exception {
if(execute.toUpperCase().equals("YES")) {
//navigate to application page
generic.navigateToURL(url);
//search
homePage.search(searchString);
} else {
generic.log("Execute variable <> 'YES'. Skipping execution...");
throw new SkipException("Execute variable <> 'YES'. Skipping execution...");
}
}
}
这是我们的套件文件;'banner' 参数用于在“.xlsx”文件中查找特定工作表:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Full Test Suite - Firefox" parallel="classes" thread-count="5" verbose="1">
<parameter name="objectMapperFile" value="mom.objectdef.properties" />
<test name="Regression - Firefox">
<parameter name="browserName" value="firefox" />
<parameter name="banner" value="SAMPLE" />
<classes>
<class name="com.company.automation.web.app.testsuites.Google1" />
<class name="com.company.automation.web.app.testsuites.Google2" />
<class name="com.company.automation.web.app.testsuites.Google3" />
<class name="com.company.automation.web.app.testsuites.Google4" />
<class name="com.company.automation.web.app.testsuites.Google5" />
<class name="com.company.automation.web.app.testsuites.Google6" />
</classes>
</test>
</suite>
关于我们如何使它工作的任何建议?