2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.ci.tests.utilities;
23 import com.aventstack.extentreports.Status;
24 import org.apache.commons.io.FileUtils;
25 import org.openecomp.sdc.ci.tests.datatypes.DataTestIdEnum;
26 import org.openecomp.sdc.ci.tests.execute.setup.DriverFactory;
27 import org.openecomp.sdc.ci.tests.execute.setup.SetupCDTest;
28 import org.openecomp.sdc.ci.tests.utils.Utils;
29 import org.openqa.selenium.*;
30 import org.openqa.selenium.firefox.FirefoxDriver;
31 import org.openqa.selenium.interactions.Actions;
32 import org.openqa.selenium.support.ui.ExpectedConditions;
33 import org.openqa.selenium.support.ui.Select;
34 import org.openqa.selenium.support.ui.WebDriverWait;
37 import java.awt.datatransfer.Clipboard;
38 import java.awt.datatransfer.StringSelection;
40 import java.io.IOException;
41 import java.util.ArrayList;
42 import java.util.List;
43 import java.util.UUID;
44 import java.util.concurrent.TimeUnit;
45 import java.util.function.Supplier;
47 import static org.testng.AssertJUnit.assertTrue;
50 public final class GeneralUIUtils {
52 private static final String DATA_TESTS_ID = "//*[@data-tests-id='";
53 private static final String COLOR_YELLOW_BORDER_4PX_SOLID_YELLOW = "color: yellow; border: 4px solid yellow;";
55 private static int timeOut = (int) (60 * 1.5);
57 public static int getTimeOut() {
61 /**************** DRIVER ****************/
63 public static WebDriver getDriver() {
65 return DriverFactory.getDriver();
66 } catch (Exception e) {
72 /****************************************/
74 public static List<WebElement> getElemenetsFromTable(By by) {
75 return getDriver().findElements(by);
78 public static File takeScreenshot(String screenshotFilename, String dir, String testName) throws IOException {
79 if (screenshotFilename == null) {
80 if (testName != null) {
81 screenshotFilename = testName;
83 screenshotFilename = UUID.randomUUID().toString();
87 File scrFile = ((TakesScreenshot) getDriver()).getScreenshotAs(OutputType.FILE);
88 File filePath = new File(String.format("%s/%s.png", dir, screenshotFilename));
89 new File(dir).mkdirs();
90 FileUtils.copyFile(scrFile, filePath);
92 } catch (IOException e1) {
98 public static File takeScreenshot(String screenshotFilename, String dir) throws IOException {
99 return takeScreenshot(screenshotFilename, dir, null);
102 public static WebElement getWebElementByTestID(String dataTestId) {
103 return getWebElementByTestID(dataTestId, timeOut);
106 public static WebElement getWebElementByTestID(String dataTestId, int timeout) {
107 WebDriverWait wait = new WebDriverWait(getDriver(), timeout);
108 return wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(DATA_TESTS_ID + dataTestId + "']")));
111 public static boolean isWebElementExistByTestId(String dataTestId) {
112 return getDriver().findElements(By.xpath(DATA_TESTS_ID + dataTestId + "']")).size() != 0;
115 public static boolean isWebElementExistByClass(String className) {
116 return getDriver().findElements(By.className(className)).size() != 0;
119 public static WebElement getInputElement(String dataTestId) {
122 return getDriver().findElement(By.xpath(DATA_TESTS_ID + dataTestId + "']"));
123 } catch (Exception e) {
128 public static List<WebElement> getInputElements(String dataTestId) {
130 return getDriver().findElements(By.xpath(DATA_TESTS_ID + dataTestId + "']"));
134 public static WebElement getWebElementBy(By by) {
135 return getWebElementBy(by, timeOut);
138 public static WebElement getWebElementBy(By by, int timeOut) {
139 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
140 return wait.until(ExpectedConditions.visibilityOfElementLocated(by));
143 public static WebElement getWebElementByPresence(By by, int timeOut) {
144 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
145 return wait.until(ExpectedConditions.presenceOfElementLocated(by));
148 public static List<String> getWebElementListText(List<WebElement> elements) {
149 List<String> Text = new ArrayList<>();
150 for (WebElement webElement : elements) {
151 Text.add(webElement.getText());
156 public static List<WebElement> getWebElementsListBy(By by) {
157 return getWebElementsListBy(by, timeOut);
160 public static List<WebElement> getWebElementsListBy(By by, int timeOut) {
161 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
162 return wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(by));
165 public static List<WebElement> getWebElementsListByContainTestID(String dataTestId) {
167 WebDriverWait wait = new WebDriverWait(getDriver(), 10);
168 return wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath("//*[contains(@data-tests-id, '" + dataTestId + "')]")));
169 } catch (Exception e) {
170 return new ArrayList<WebElement>();
174 public static List<WebElement> getWebElementsListByContainsClassName(String containedText) {
175 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
176 return wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath("//*[contains(@class, '" + containedText + "')]")));
179 public static WebElement getWebElementByContainsClassName(String containedText) {
180 return getWebElementBy(By.xpath("//*[contains(@class, '" + containedText + "')]"));
183 public static WebElement getWebElementByClassName(String className) {
184 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
185 return wait.until(ExpectedConditions.visibilityOfElementLocated(By.className(className)));
188 public static List<WebElement> getWebElementsListByTestID(String dataTestId) {
189 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
190 return wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath(DATA_TESTS_ID + dataTestId + "']")));
193 public static List<WebElement> getWebElementsListByClassName(String className) {
194 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
195 return wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.className(className)));
199 public static Boolean isElementInvisibleByTestId(String dataTestId) {
200 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
202 ExpectedConditions.invisibilityOfElementLocated(By.xpath(DATA_TESTS_ID + dataTestId + "']")));
205 public static Boolean isElementVisibleByTestId(String dataTestId) {
207 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
208 return wait.until(ExpectedConditions.visibilityOfElementLocated((By.xpath(DATA_TESTS_ID + dataTestId + "']")))).isDisplayed();
209 } catch (Exception e) {
214 public static void clickOnElementByTestId(String dataTestId) {
215 clickOnElementByTestIdWithoutWait(dataTestId);
219 public static void clickOnElementByTestIdWithoutWait(String dataTestId) {
220 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
221 wait.until(ExpectedConditions.elementToBeClickable(By.xpath(DATA_TESTS_ID + dataTestId + "']"))).click();
224 public static void clickOnElementByInputTestIdWithoutWait(String dataTestId) {
225 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
226 wait.until(ExpectedConditions.elementToBeClickable(By.xpath(DATA_TESTS_ID + dataTestId + "']//*"))).click();
229 public static void clickOnElementByTestId(String dataTestId, int customTimeout) {
230 WebDriverWait wait = new WebDriverWait(getDriver(), customTimeout);
231 wait.until(ExpectedConditions.elementToBeClickable(By.xpath(DATA_TESTS_ID + dataTestId + "']"))).click();
234 public static WebElement waitForElementVisibilityByTestId(String dataTestId) {
235 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
236 return wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(DATA_TESTS_ID + dataTestId + "']")));
239 public static Boolean waitForElementInVisibilityByTestId(String dataTestId) {
240 return waitForElementInVisibilityByTestId(dataTestId, timeOut);
243 public static Boolean waitForElementInVisibilityByTestId(String dataTestId, int timeOut) {
244 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
245 boolean displayed = getDriver().findElements(By.xpath(DATA_TESTS_ID + dataTestId + "']")).isEmpty();
247 Boolean until = wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath(DATA_TESTS_ID + dataTestId + "'])")));
254 public static Boolean waitForElementInVisibilityByTestId(By by) {
255 return waitForElementInVisibilityBy(by, timeOut);
259 public static Boolean waitForElementInVisibilityBy(By by, int timeOut) {
260 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
261 boolean displayed = getDriver().findElements(by).isEmpty();
263 Boolean until = wait.until(ExpectedConditions.invisibilityOfElementLocated(by));
271 public static void setWebElementByTestId(String elemetID, String value) {
272 WebElement resourceDescriptionTextbox = GeneralUIUtils.getWebElementByTestID(elemetID);
273 resourceDescriptionTextbox.clear();
274 resourceDescriptionTextbox.sendKeys(value);
278 public static WebElement hoverOnAreaByTestId(String areaId) {
279 Actions actions = new Actions(getDriver());
280 WebElement area = getWebElementByTestID(areaId);
281 actions.moveToElement(area).perform();
286 public static WebElement hoverOnAreaByClassName(String className) {
287 Actions actions = new Actions(getDriver());
288 WebElement area = getWebElementByClassName(className);
289 actions.moveToElement(area).perform();
290 GeneralUIUtils.ultimateWait();
294 public static void waitForLoader() {
295 waitForLoader(timeOut);
298 public static void waitForLoader(int timeOut) {
300 waitForElementInVisibilityBy(By.className("tlv-loader"), timeOut);
303 public static void findComponentAndClick(String resourceName) throws Exception {
304 SetupCDTest.getExtendTest().log(Status.INFO, "Searching for " + resourceName + " in homepage");
305 WebElement searchTextbox = GeneralUIUtils.getWebElementByTestID(DataTestIdEnum.MainMenuButtons.SEARCH_BOX.getValue());
307 searchTextbox.clear();
308 searchTextbox.sendKeys(resourceName);
310 } catch (Exception e) {
311 SetupCDTest.getExtendTest().log(Status.INFO, "Can't interact with search bar");
316 SetupCDTest.getExtendTest().log(Status.INFO, String.format("Clicking on the %s component from home screen", resourceName));
317 clickOnElementByTestId(resourceName);
318 getWebElementByTestID(DataTestIdEnum.GeneralElementsEnum.LIFECYCLE_STATE.getValue());
319 } catch (Exception e) {
320 SetupCDTest.getExtendTest().log(Status.INFO, "Can't click on component named " + resourceName);
325 public static void windowZoomOut() {
326 final int zoomOutFactor = 3;
327 for (int i = 0; i < zoomOutFactor; i++) {
328 if (getDriver() instanceof FirefoxDriver) {
329 getDriver().findElement(By.tagName("html")).sendKeys(Keys.chord(Keys.CONTROL, Keys.SUBTRACT));
334 public static void resetZoom() {
335 getDriver().findElement(By.tagName("html")).sendKeys(Keys.chord(Keys.CONTROL, "0"));
338 public static void windowZoomOutUltimate() {
343 public static void sleep(int duration) {
345 Thread.sleep(duration);
346 } catch (InterruptedException e) {
347 throw new RuntimeException(e);
351 public static void moveToStep(DataTestIdEnum.StepsEnum stepName) {
352 SetupCDTest.getExtendTest().log(Status.INFO, String.format("Going to %s page ", stepName.toString()));
353 moveToStep(stepName.getValue());
356 public static void moveToStep(String dataTestId) {
357 clickOnElementByTestId(dataTestId);
361 public static Select getSelectList(String item, String datatestsid) {
362 Select selectList = new Select(getWebElementByTestID(datatestsid));
364 selectList.selectByVisibleText(item);
369 public static List<WebElement> getElementsByCSS(String cssString) /*throws InterruptedException*/ {
370 GeneralUIUtils.waitForLoader();
371 return getDriver().findElements(By.cssSelector(cssString));
374 public static WebElement getElementfromElementByCSS(WebElement parentElement, String cssString) {
375 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
376 GeneralUIUtils.waitForLoader();
377 return parentElement.findElement(By.cssSelector(cssString));
380 public static WebElement HighlightMyElement(WebElement element) {
381 JavascriptExecutor javascript = (JavascriptExecutor) getDriver();
382 javascript.executeScript("arguments[0].setAttribute('style', arguments[1]);", element, COLOR_YELLOW_BORDER_4PX_SOLID_YELLOW);
386 public static WebElement getSelectedElementFromDropDown(String dataTestId) {
387 GeneralUIUtils.ultimateWait();
388 return new Select(getDriver().findElement(By.xpath(DATA_TESTS_ID + dataTestId + "']"))).getFirstSelectedOption();
391 public static boolean checkElementsCountInTable(int expectedElementsCount, Supplier<List<WebElement>> func) {
392 int maxWaitingPeriodMS = 10 * 1000;
393 int napPeriodMS = 100;
394 int sumOfWaiting = 0;
395 List<WebElement> elements = null;
396 boolean isKeepWaiting = false;
397 while (!isKeepWaiting) {
398 elements = func.get();
399 isKeepWaiting = (expectedElementsCount == elements.size());
401 sumOfWaiting += napPeriodMS;
402 if (sumOfWaiting > maxWaitingPeriodMS)
408 public static String getActionDuration(Runnable func) throws Exception {
409 long startTime = System.nanoTime();
411 long estimateTime = System.nanoTime();
412 long duration = TimeUnit.NANOSECONDS.toSeconds(estimateTime - startTime);
413 String durationString = String.format("%02d:%02d", duration / 60, duration % 60);
414 return durationString;
417 public static WebElement clickOnAreaJS(String areaId) {
418 return clickOnAreaJS(areaId, timeOut);
422 public static WebElement clickOnAreaJS(String areaId, int timeout) {
425 WebElement area = getWebElementByTestID(areaId);
426 JavascriptExecutor javascript = (JavascriptExecutor) getDriver();
427 //HighlightMyElement(area);
428 Object executeScript = javascript.executeScript("arguments[0].click();", area, COLOR_YELLOW_BORDER_4PX_SOLID_YELLOW);
429 waitForLoader(timeout);
432 } catch (Exception e) {
439 public static WebElement clickOnAreaJS(WebElement areaId) throws InterruptedException {
440 JavascriptExecutor javascript = (JavascriptExecutor) getDriver();
441 //HighlightMyElement(area);
442 javascript.executeScript("arguments[0].click();", areaId, COLOR_YELLOW_BORDER_4PX_SOLID_YELLOW);
447 public static void clickSomewhereOnPage() {
448 getDriver().findElement(By.cssSelector(".asdc-app-title")).click();
451 public static void clickOnElementByText(String textInElement) {
452 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
453 HighlightMyElement(wait.until(
454 ExpectedConditions.elementToBeClickable(findByText(textInElement)))).click();
457 public static void clickOnElementByText(String textInElement, int customTimeout) {
458 WebDriverWait wait = new WebDriverWait(getDriver(), customTimeout);
459 HighlightMyElement(wait.until(
460 ExpectedConditions.elementToBeClickable(findByText(textInElement)))).click();
463 public static void clickJSOnElementByText(String textInElement) throws Exception {
464 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
465 clickOnAreaJS(wait.until(
466 ExpectedConditions.elementToBeClickable(findByText(textInElement))));
469 public static void waitForAngular() {
470 WebDriverWait wait = new WebDriverWait(getDriver(), 90, 100);
471 wait.until(AdditionalConditions.pageLoadWait());
472 wait.until(AdditionalConditions.angularHasFinishedProcessing());
475 public static Object getAllElementAttributes(WebElement element) {
476 return ((JavascriptExecutor) getDriver()).executeScript("var s = []; var attrs = arguments[0].attributes; for (var l = 0; l < attrs.length; ++l) { var a = attrs[l]; s.push(a.name + ':' + a.value); } ; return s;", element);
479 public static boolean isElementReadOnly(WebElement element) {
481 HighlightMyElement(element).clear();
483 } catch (Exception e) {
488 public static boolean isElementReadOnly(String dataTestId) {
489 return isElementReadOnly(
490 waitForElementVisibilityByTestId(dataTestId));
493 public static boolean isElementDisabled(WebElement element) {
494 return HighlightMyElement(element).getAttribute("class").contains("view-mode") ||
495 element.getAttribute("class").contains("disabled");
498 public static boolean isElementDisabled(String dataTestId) {
499 return isElementDisabled(
500 waitForElementVisibilityByTestId(dataTestId));
503 public static void ultimateWait() {
504 long startTime = System.nanoTime();
506 GeneralUIUtils.waitForLoader();
507 GeneralUIUtils.waitForBackLoader();
508 GeneralUIUtils.waitForAngular();
510 long estimateTime = System.nanoTime();
511 long duration = TimeUnit.NANOSECONDS.toSeconds(estimateTime - startTime);
512 if (duration > timeOut) {
513 SetupCDTest.getExtendTest().log(Status.WARNING, String.format("Delays on page, %d seconds", duration));
517 public static WebElement unhideElement(WebElement element, String attributeValue) {
518 String js = "arguments[0].setAttribute('class','" + attributeValue + "');";
519 ((JavascriptExecutor) getDriver()).executeScript(js, element);
523 public static WebElement findByText(String textInElement) {
524 return getDriver().findElement(searchByTextContaining(textInElement));
527 public static By searchByTextContaining(String textInElement) {
528 return By.xpath("//*[contains(text(),'" + textInElement + "')]");
531 public static WebElement getClickableButtonBy(By by, int timout) {
533 WebDriverWait wait = new WebDriverWait(getDriver(), timout);
534 return wait.until(ExpectedConditions.elementToBeClickable(by));
535 } catch (Exception e) {
541 public static WebElement getButtonWithText(String textInButton) {
543 return getDriver().findElement(By.xpath("//button[contains(text(),'" + textInButton + "')]"));
544 } catch (Exception e) {
549 public static void closeErrorMessage() {
550 WebElement okWebElement = getButtonWithText("OK");
551 if (okWebElement != null) {
552 okWebElement.click();
557 public static WebElement getElementByCSS(String cssString) throws InterruptedException {
559 return getDriver().findElement(By.cssSelector(cssString));
562 public static String getDataTestIdAttributeValue(WebElement element) {
563 return element.getAttribute("data-tests-id");
566 public static String getTextContentAttributeValue(WebElement element) {
567 return element.getAttribute("textContent");
570 public static void clickOnElementByCSS(String cssString) throws Exception {
571 WebDriverWait wait = new WebDriverWait(getDriver(), timeOut);
572 wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(cssString))).click();
576 public static boolean checkForDisabledAttribute(String dataTestId) {
577 Object elementAttributes = getAllElementAttributes(waitForElementVisibilityByTestId(dataTestId));
578 return elementAttributes.toString().contains("disabled");
581 public static void dragAndDropElementByY(WebElement area, int yOffset) {
582 Actions actions = new Actions(getDriver());
583 actions.dragAndDropBy(area, 10, yOffset).perform();
587 public static void waitForBackLoader() {
588 waitForBackLoader(timeOut);
591 public static void waitForBackLoader(int timeOut) {
593 waitForElementInVisibilityBy(By.className("tlv-loader-back"), timeOut);
596 public static void addStringtoClipboard(String text) {
597 StringSelection selection = new StringSelection(text);
598 Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
599 clipboard.setContents(selection, selection);
602 public static boolean checkForDisabledAttributeInHiddenElement(String cssString) {
603 boolean isDisabled = false;
604 for (int i = 0; i < 3; i++) {
605 Object elementAttributes = getAllElementAttributes(getWebElementByPresence(By.cssSelector(cssString), timeOut));
606 isDisabled = elementAttributes.toString().contains("disabled");
614 public static void selectByValueTextContained(String dataTestsId, String value) {
616 List<WebElement> options = GeneralUIUtils.getWebElementsListBy(By.xpath(String.format("//select[@data-tests-id='%s']//option[contains(@value,'%s')]", dataTestsId, value)));
618 boolean matched = false;
619 for (WebElement option : options) {
625 throw new NoSuchElementException("Cannot locate option with value: " + value);
631 public static void setTextInElementByXpath(String xPath, String text) {
632 WebElement webElement = GeneralUIUtils.getWebElementBy(By.xpath(xPath));
635 webElement.sendKeys(text);
640 public static void clickOnElementByXpath(String xPath) {
641 WebElement webElement = GeneralUIUtils.getWebElementBy(By.xpath(xPath));
646 public static String getTextValueFromWebElementByXpath(String Xpath) {
647 WebElement webElement = getWebElementBy(By.xpath(Xpath));
648 return webElement.getAttribute("value");
651 public static List<WebElement> findElementsByXpath(String xPath) {
652 return getDriver().findElements(By.xpath(xPath));
655 public static void clickOnBrowserBackButton() throws Exception {
656 SetupCDTest.getExtendTest().log(Status.INFO, "Going to press on back browser button.");
657 getDriver().navigate().back();
661 public static String copyCurrentURL() throws Exception {
662 SetupCDTest.getExtendTest().log(Status.INFO, "Copying current URL");
663 return getDriver().getCurrentUrl();
666 public static void navigateToURL(String url) throws Exception {
667 SetupCDTest.getExtendTest().log(Status.INFO, "Navigating to URL " + url);
668 getDriver().navigate().to(url);
671 public static Object getElementPositionOnCanvas(String elementName) {
672 String scriptJS = "var cy = window.jQuery('.sdc-composition-graph-wrapper').cytoscape('get');\n" +
673 "var n = cy.nodes('[name=\"" + elementName + "\"]');\n" +
674 "var nPos = n.renderedPosition();\n" +
675 "return JSON.stringify({\n" +
679 return ((JavascriptExecutor) getDriver()).executeScript(scriptJS);
682 public static Object getElementGreenDotPositionOnCanvas(String elementName) {
683 String scriptJS = "var cy = window.jQuery('.sdc-composition-graph-wrapper').cytoscape('get');\n" +
684 "var cyZoom = cy.zoom();\n" +
685 "var n = cy.nodes('[name=\"" + elementName + "\"]');\n" +
686 "var nPos = n.renderedPosition();\n" +
687 "var nData = n.data();\n" +
688 "var nImgSize = nData.imgWidth;\n" +
689 "var shiftSize = (nImgSize-18)*cyZoom/2;\n" +
690 "return JSON.stringify({\n" +
691 "\tx: nPos.x + shiftSize,\n" +
692 "\ty: nPos.y - shiftSize\n" +
694 return ((JavascriptExecutor) getDriver()).executeScript(scriptJS);
697 public static Long getAndValidateActionDuration (Runnable action, int regularTestRunTime){
698 Long actualTestRunTime = null;
700 actualTestRunTime = Utils.getActionDuration(() -> {
703 } catch (Throwable throwable) {
704 throwable.printStackTrace();
707 } catch (Exception e) {
712 assertTrue("Expected test run time should be less than " + regularTestRunTime*factor + ", " +
713 "actual time is " + actualTestRunTime , regularTestRunTime*factor>actualTestRunTime);
714 // SetupCDTest.getExtendTest().log(Status.INFO, "Actual catalog loading time is " + actualTestRunTime + " seconds");
715 return actualTestRunTime;