poc added configuration with jira

parent 853fdf3e
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="corretto-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/poc-arsam-2024" vcs="Git" />
</component>
</project>
\ No newline at end of file
......@@ -101,12 +101,25 @@
<artifactId>okhttp</artifactId>
<version>5.0.0-alpha.14</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.http-client/google-http-client -->
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client</artifactId>
<version>1.45.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
......@@ -118,6 +131,13 @@
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
<build>
<plugins>
......
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Burj Al Arab Automation Suite">
<listeners>
<listener class-name="Jira.CustomListener"/>
</listeners>
<test name="Burj Al Arab Test">
<classes>
<class name="runner.TestRunner"/> <!-- Your Cucumber TestNG runner class -->
</classes>
</test>
</suite>
package Utils;
import okhttp3.*;
import java.io.IOException;
public class JiraTicketCreator {
private static final String JIRA_URL = "https://arsamrajput60-1750165581004.atlassian.net/rest/api/3/issue";
private static final String EMAIL = "arsamrajput60@gmail.com";
private static final String API_TOKEN = "ATATT3xFfGF0xXhZtpGOqsm2xls0SCXidNjsgTHTzSdz2CXvqzBWmlHY8Q5b8-PoTVrnGP1yliLqiEMCMKumIv4tnTPWrHAZ_6OExSiia0mE6ybkgGhin2BNWlzHDTRGdxKfvG8YOX-N8v3W6ucOkq1-11sgfO4BHc38ahjik_3AsfBp7VmWqsY=4768D45A";
private static final String AUTH = Credentials.basic(EMAIL, API_TOKEN);
public static void createTicket(String summary, String errorLog) {
OkHttpClient client = new OkHttpClient();
String json = "{\n" +
" \"fields\": {\n" +
" \"project\": {\"key\": \"POC\"},\n" +
" \"summary\": \"" + summary + "\",\n" +
" \"description\": {\n" +
" \"type\": \"doc\",\n" +
" \"version\": 1,\n" +
" \"content\": [\n" +
" {\n" +
" \"type\": \"paragraph\",\n" +
" \"content\": [\n" +
" {\"type\": \"text\", \"text\": \"❗ Error Log: \"}\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"type\": \"codeBlock\",\n" +
" \"attrs\": {\"language\": \"text\"},\n" +
" \"content\": [\n" +
" {\"type\": \"text\", \"text\": \"" + errorLog.replace("\"", "'").replace("\n", "\\n") + "\"}\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"type\": \"paragraph\",\n" +
" \"content\": [\n" +
" {\"type\": \"text\", \"text\": \"💡 AI Suggestion: Check if the XPath locator is valid, the element exists on the page, and try using waits or alternative selectors if needed.\"}\n" +
" ]\n" +
" }\n" +
" ]\n" +
" },\n" +
" \"issuetype\": {\"name\": \"Task\"}\n" +
" }\n" +
"}";
RequestBody body = RequestBody.create(json, MediaType.get("application/json"));
Request request = new Request.Builder()
.url(JIRA_URL)
.header("Authorization", AUTH)
.header("Content-Type", "application/json")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
int code = response.code();
String responseBody = response.body() != null ? response.body().string() : "No body";
System.out.println("JIRA ticket creation response code: " + code);
System.out.println("JIRA response body: " + responseBody);
if (code == 201) {
System.out.println("✅ Ticket created successfully.");
} else {
System.out.println("❌ Ticket creation failed. Check your project key, issue type, or permissions.");
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("❌ Exception occurred during JIRA API call.");
}
}
public static void main(String[] args) {
String summary = "Automation Failure: Could not find element";
String errorLog = "14:02:14.977 [main] ERROR - Error: Could not find search field with locator: //span[@title='NonExistentElement']";
createTicket(summary, errorLog);
}
}
package org.example.OpenAI;
package Utils;
import java.io.BufferedReader;
import java.io.FileReader;
......
package org.example.OpenAI;
package ai;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;
......
package org.example.BurjulArabSteps;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.example.BurjulArabPage.BurjulArabPage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class BurjulArabSteps {
WebDriver driver;
BurjulArabPage burjulArabPage;
@Given("I am on the Google homepage For Burjul Arab Web")
public void iAmOnTheGoogleHomePage() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.google.com/");
burjulArabPage = new BurjulArabPage(driver);
}
@When("I search for {string}")
public void iSearchFor(String searchText) {
burjulArabPage.searchForText(searchText);
}
@When("I click on the link for Burj Al Arab")
public void iClickOnTheLinkForBurjAlArab() {
burjulArabPage.clickBurjAlArabLink();
}
@When("I click on the reserve button")
public void iClickOnTheReserveButton() {
burjulArabPage.clickReserveButton();
}
@Then("I wait for {int} seconds on the page")
public void iWaitForSecondsOnThePage(int seconds) throws InterruptedException {
burjulArabPage.waitForSeconds(seconds);
driver.quit();
}
}
package org.example.NisumSearchSteps;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.example.NisumSearchPage.NisumPage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Objects;
public class NisumSteps {
WebDriver driver;
NisumPage nisumPage;
@Given("I am on the Google homepage")
public void iAmOnTheGoogleHomepage() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.google.com/");
nisumPage = new NisumPage(driver);
}
@When("I search for {string}")
public void iSearchFor(String searchText) {
nisumPage.searchForText(searchText);
}
@When("I click on the first link of Nisum website")
public void iClickOnTheFirstLinkOfNisumWebsite() {
nisumPage.clickFirstLink();
}
@When("I hover on the Global Careers button")
public void iClickOnTheGlobalCareersButton() {
nisumPage.hoverOverGlobalCareers();
}
@When("I click on Contact us button")
public void iClickOnThePakistanCareersButton() {
nisumPage.clickContact();
}
@Then("I should be redirected to the Pakistan careers page")
public void iShouldBeRedirectedToThePakistanCareersPage() {
assert(Objects.requireNonNull(driver.getCurrentUrl()).contains("pakistan"));
driver.quit();
}
}
package org.example.OpenAI;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
String logFilePath = "/Users/arsamali/Documents/IdeaProjects/POC-Arsam/src/main/resources/log4j3-error.log";
LogParser logParser = new LogParser();
List<String> errorLogs = logParser.extractErrors(logFilePath);
OpenAISuggestions openAI = new OpenAISuggestions();
for (String errorLog : errorLogs) {
System.out.println("Error: " + errorLog);
try {
Map<String, Object> suggestions = openAI.getSuggestions(errorLog);
System.out.println("OpenAI Suggestions: " + suggestions.get("suggestion"));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("-------------------------------");
}
}
}
package org.example.SastaTicketSteps;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.example.SastaTicketPage.SastaTicketPage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class SastaTicketSteps {
WebDriver driver;
SastaTicketPage sastaTicketPage;
@Given("I am on the Sastaticket homepage")
public void iAmOnTheSastaTicketHomepage() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
driver.manage().window().maximize();
sastaTicketPage = new SastaTicketPage(driver);
sastaTicketPage.openHomePage();
}
@When("I click on search bar for destination")
public void iSelectDepartureSearchBar() {
sastaTicketPage.IClickOnSearchFieldDestination();
}
@When("I click on search bar")
public void iSelectSearchBar() {
sastaTicketPage.IClickOnSearchField();
}
@When("I select Karachi as the destination city")
public void iSelectDestinationCity() {
sastaTicketPage.selectDestinationCity();
}
@When("I click on the Search Flight button")
public void iClickOnSearchFlightButton() {
sastaTicketPage.clickSearchFlight();
}
@When("I click on date")
public void iClickOnDate() {
sastaTicketPage.clickDate();
}
@Then("I should see the available flights")
public void iShouldSeeTheAvailableFlights() {
System.out.println("Flight search results displayed.");
driver.quit();
}
}
package runner;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import Utils.JiraTicketCreator;
import Utils.LogParser;
import ai.OpenAISuggestions;
import org.example.SastaTicketPage.SastaTicketPage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class OneClickRunner {
private static final Logger log = LogManager.getLogger(OneClickRunner.class);
public static void main(String[] args) {
// STEP 1: Run Selenium Script
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
try {
log.info("Running Selenium script...");
// Your test steps
SastaTicketPage page = new SastaTicketPage(driver);
page.openHomePage();
page.IClickOnSearchField();
page.IClickOnSearchFieldDestination();
page.selectDestinationCity();
page.clickDate();
page.clickSearchFlight();
log.info("Selenium script execution completed.");
} catch (Exception e) {
log.error("Selenium execution failed: " + e.getMessage());
} finally {
driver.quit();
}
// STEP 2: Run Log Parser & AI Suggestion & JIRA Ticket Creation
String logFilePath = "src/main/resources/log4j3-error.log";
LogParser logParser = new LogParser();
List<String> errorLogs = logParser.extractErrors(logFilePath);
OpenAISuggestions openAI = new OpenAISuggestions();
for (String errorLog : errorLogs) {
System.out.println("\n❗ Error Detected: " + errorLog);
try {
Map<String, Object> suggestions = openAI.getSuggestions(errorLog);
String suggestion = suggestions.get("suggestion").toString();
System.out.println("💡 OpenAI Suggestion: " + suggestion);
// Create JIRA Ticket
String summary = "Automation Failure: " + errorLog.split("\\n")[0];
String description = "Error Log:\n" + errorLog + "\n\nAI Suggestion:\n" + suggestion;
JiraTicketCreator.createTicket(summary, description);
} catch (IOException e) {
e.printStackTrace();
System.out.println("❌ Failed to get suggestion or create JIRA ticket.");
}
}
System.out.println("\n✅ All steps completed in one run.");
}
}
12:24:20.685 [main] ERROR - //a[@href='https://www.jumeirah.com/en/stay/dubai/burj-al-aras='LC20lb MBeuO DKV0Md'] i have found an error
##name=PropertiesConfig
##property.filename = logs
##appends = console, file
##
##appender.console.type = Console
##appender.console.name = STDOUT
##appender.console.layout.type = PatternLayout
##appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
##
##appender.file.type = File
##appender.file.name = LOGFILE
##appender.file.fileName=${filename}/logs.log
##appender.file.layout.type=PatternLayout
##appender.file.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
##
##rootLogger.level = debug
##rootLogger.appenderRefs = file
##rootLogger.appenderRef.stdout.ref = LOGFILE
#
#name=PropertiesConfig
#property.filename = logs
#appends = console, file
#
## Console appender configuration
#appender.console.type = Console
#appender.console.name = STDOUT
#appender.console.layout.type = PatternLayout
#appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
#
## File appender configuration
#appender.file.type = File
#appender.file.name = LOGFILE
#appender.file.fileName=${filename}/logs.log
#appender.file.layout.type=PatternLayout
#appender.file.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
#
#rootLogger.level = debug
#rootLogger.appenderRefs = file
#rootLogger.appenderRef.stdout.ref = LOGFILE
name=PropertiesConfig
property.filename = logs
appends = console, file
# Console appender configuration
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
# File appender configuration
appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName=${filename}/logs.log
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
# Set the root logger level to 'error' to only log error-level messages
rootLogger.level = error
rootLogger.appenderRefs = file, console
rootLogger.appenderRef.file.ref = LOGFILE
rootLogger.appenderRef.console.ref = STDOUT
## Set the root logger level to 'error' to only log error-level messages
#rootLogger.level = error
#rootLogger.appenderRefs = file, console
#rootLogger.appenderRef.file.ref = LOGFILE
#rootLogger.appenderRef.console.ref = STDOUT
12:48:07.005 [main] ERROR - Error: Could not find search field with locator: //span[@title='NonExistentElement']
12:48:07.022 [main] ERROR - Error: Could not find destination field with locator: //input[@id='NonExistentInput']
12:48:07.037 [main] ERROR - Error: Could not find destination city with locator: //h5[normalize-space()='NonExistentCity']
12:48:07.052 [main] ERROR - Error: Could not find date field with locator: //div[@class='NonExistentDate']
12:48:07.091 [main] ERROR - Error: Could not find search flight button with locator: //span[normalize-space()='NonExistentSearchButton']
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment