diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..17a1e05
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,77 @@
+
+
+ 4.0.0
+
+ SeleniumWebdriver
+ WikipediaPDF_0001
+ 1.0-SNAPSHOT
+
+
+ 21
+ 21
+ UTF-8
+
+
+
+
+ jitpack.io
+ https://jitpack.io
+
+
+
+
+
+
+ com.github.aquality-automation
+ aquality-selenium-java
+ 4.0.1-SNAPSHOT
+
+
+
+
+ org.seleniumhq.selenium
+ selenium-java
+ 4.17.0
+
+
+
+
+ org.testng
+ testng
+ 7.9.0
+ test
+
+
+
+
+ io.cucumber
+ cucumber-java
+ 7.15.0
+
+
+
+
+ io.cucumber
+ cucumber-testng
+ 7.15.0
+
+
+
+
+ io.qameta.allure
+ allure-testng
+ 2.25.0
+
+
+
+
+ com.google.code.gson
+ gson
+ 2.10.1
+
+
+
+
+
diff --git a/src/test/java/wikipedia/TestRunner.java b/src/test/java/wikipedia/TestRunner.java
new file mode 100644
index 0000000..2d672f2
--- /dev/null
+++ b/src/test/java/wikipedia/TestRunner.java
@@ -0,0 +1,17 @@
+package wikipedia;
+
+import io.cucumber.testng.AbstractTestNGCucumberTests;
+import io.cucumber.testng.CucumberOptions;
+import org.testng.annotations.DataProvider;
+
+@CucumberOptions(
+ features = {"src/test/java/wikipedia/features"},
+ glue = {"wikipedia.hooks", "wikipedia.stepDefinitions"}
+)
+public class TestRunner extends AbstractTestNGCucumberTests {
+ @Override
+ @DataProvider(parallel = true)
+ public Object[][] scenarios() {
+ return super.scenarios();
+ }
+}
diff --git a/src/test/java/wikipedia/data/preTestData.json b/src/test/java/wikipedia/data/preTestData.json
new file mode 100644
index 0000000..8b49c61
--- /dev/null
+++ b/src/test/java/wikipedia/data/preTestData.json
@@ -0,0 +1,6 @@
+{
+ "URL": "https://www.wikipedia.org/",
+ "SearchContext": "Albert Einstein",
+ "FileName": "Albert_Einstein.pdf",
+ "PageInformationHeader": "Information for \"Albert Einstein\""
+}
\ No newline at end of file
diff --git a/src/test/java/wikipedia/features/wikipeadia.feature b/src/test/java/wikipedia/features/wikipeadia.feature
new file mode 100644
index 0000000..7afd0ad
--- /dev/null
+++ b/src/test/java/wikipedia/features/wikipeadia.feature
@@ -0,0 +1,24 @@
+
+
+Feature: Wikipedia Functionality Testing
+
+ Background:
+ Given the user is on the Main page
+ Then the user inputs "Albert Einstein" in the search field
+
+ Scenario: Download PDF from Albert Einstein Article
+ Then the user clicks on the search submit button
+ And the user clicks the Tool menu button on the Article page
+ And the user clicks the Download as PDF button on the Article page
+ Then the file with the provided name on the Download as PDF page should be downloaded
+
+ Scenario: View Page Information for Albert Einstein Article
+ Then the user clicks on the search submit button
+ And the user clicks the Tool menu button on the Article page
+ And the user clicks the Page information button on the Article page
+ Then the Information page for the "Albert Einstein" article should be displayed
+
+ Scenario: Search Albert Einstein in Spanish Language
+ When the user changes the search language to "EspaƱol"
+ Then the user clicks on the search submit button
+ Then the Article page for "Albert Einstein" in Spanish should be open
diff --git a/src/test/java/wikipedia/hooks/Hooks.java b/src/test/java/wikipedia/hooks/Hooks.java
new file mode 100644
index 0000000..816f362
--- /dev/null
+++ b/src/test/java/wikipedia/hooks/Hooks.java
@@ -0,0 +1,29 @@
+package wikipedia.hooks;
+
+import aquality.selenium.browser.AqualityServices;
+import aquality.selenium.browser.Browser;
+import io.cucumber.java.After;
+import io.cucumber.java.Before;
+import io.cucumber.java.en.Given;
+import org.testng.Assert;
+import wikipedia.utils.DataProcessor;
+import wikipedia.utils.DriverTools;
+import static io.qameta.allure.Allure.step;
+
+public class Hooks {
+
+ private Browser browser= AqualityServices.getBrowser();
+
+ @Before
+ public void setUp(){
+// browser.maximize();
+ browser.setWindowSize(1440, 900);
+ browser.goTo(DataProcessor.processedData().getURL());
+ }
+
+ @After
+ public void tearDown(){
+ browser.quit();
+ }
+
+}
diff --git a/src/test/java/wikipedia/pages/ArticlePage.java b/src/test/java/wikipedia/pages/ArticlePage.java
new file mode 100644
index 0000000..27f43a3
--- /dev/null
+++ b/src/test/java/wikipedia/pages/ArticlePage.java
@@ -0,0 +1,37 @@
+package wikipedia.pages;
+
+import aquality.selenium.browser.AqualityServices;
+import aquality.selenium.browser.Browser;
+import aquality.selenium.elements.interfaces.IButton;
+import aquality.selenium.elements.interfaces.IElementFactory;
+import aquality.selenium.elements.interfaces.ILabel;
+import aquality.selenium.elements.interfaces.ILink;
+import aquality.selenium.forms.Form;
+import org.openqa.selenium.By;
+import wikipedia.utils.DriverTools;
+
+public class ArticlePage extends Form {
+
+ public ArticlePage() {
+ super(By.xpath("//*[contains(@class,'mw-page-title-main')]"),"Result page header");
+ }
+
+ private IElementFactory iElementFactory=AqualityServices.getElementFactory();
+
+ private final ILabel PAGE_HEADER= iElementFactory.getLabel(By.cssSelector("#firstHeading .mw-page-title-main"),"Page Header");
+ private final ILink PAGE_INFORMATION_LINK=iElementFactory.getLink(By.cssSelector("a[title='More information about this page'] span"),"Page information link");
+ private final IButton TOOLS_DROPDOWN_BTN=iElementFactory.getButton(By.cssSelector(".vector-page-tools-landmark #vector-page-tools-dropdown"),"Tools Dropdown button");
+ private final ILink PDF_DOWNLOAD_LINK=iElementFactory.getLink(By.xpath("//*[text()='Download as PDF']"),"PDF Download link");
+
+
+
+
+ public ILabel getPAGE_HEADER(){return PAGE_HEADER;}
+ public String getPageHeaderText(){return getPAGE_HEADER().getText();}
+ public ILink getPAGE_INFORMATION_LINK(){return PAGE_INFORMATION_LINK;}
+ public void clickOnPageInformationLink(){getPAGE_INFORMATION_LINK().click();}
+ public IButton getTOOLS_DROPDOWN_BTN(){return TOOLS_DROPDOWN_BTN;}
+ public void clickOnToolsDropdownBtn(){getTOOLS_DROPDOWN_BTN().click();}
+ public ILink getPDF_DOWNLOAD_LINK(){return PDF_DOWNLOAD_LINK;}
+ public void clickOnPdfDownloadLink(){getPDF_DOWNLOAD_LINK().click();}
+}
diff --git a/src/test/java/wikipedia/pages/InformationPage.java b/src/test/java/wikipedia/pages/InformationPage.java
new file mode 100644
index 0000000..9c87a98
--- /dev/null
+++ b/src/test/java/wikipedia/pages/InformationPage.java
@@ -0,0 +1,34 @@
+package wikipedia.pages;
+
+import aquality.selenium.browser.AqualityServices;
+import aquality.selenium.elements.interfaces.IElementFactory;
+import aquality.selenium.elements.interfaces.ILabel;
+import aquality.selenium.forms.Form;
+import org.openqa.selenium.By;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class InformationPage extends Form {
+ public InformationPage() {
+ super(By.xpath("//*[@role='main']"), "Information page");
+ }
+
+ private IElementFactory iElementFactory= AqualityServices.getElementFactory();
+
+ private final ILabel PAGE_HEADER=iElementFactory.getLabel(By.xpath("//*[@id='firstHeading']"),",Page header");
+
+
+
+
+ public String getPAGE_HEADER(){
+ Pattern pattern = Pattern.compile("\"(.*?)\"");
+ Matcher matcher = pattern.matcher(PAGE_HEADER.getText());
+ String lastMatchedValue = "";
+ while (matcher.find()) {
+ lastMatchedValue = matcher.group(1).trim();
+ }
+ return lastMatchedValue;
+ }
+
+}
diff --git a/src/test/java/wikipedia/pages/MainPage.java b/src/test/java/wikipedia/pages/MainPage.java
new file mode 100644
index 0000000..a4a6113
--- /dev/null
+++ b/src/test/java/wikipedia/pages/MainPage.java
@@ -0,0 +1,54 @@
+package wikipedia.pages;
+
+import aquality.selenium.browser.AqualityServices;
+import aquality.selenium.elements.ElementType;
+import aquality.selenium.elements.interfaces.*;
+import aquality.selenium.forms.Form;
+import org.openqa.selenium.By;
+import java.util.List;
+
+public class MainPage extends Form {
+
+ public MainPage() {
+ super(By.id("www-wikipedia-org"), "Search Page");
+ }
+
+ private IElementFactory iElementFactory= AqualityServices.getElementFactory();
+
+ private final ITextBox SEARCH_FIELD=iElementFactory.getTextBox(By.xpath("//*[@id='searchInput']"),"Search field on the search page");
+ private final IButton LANGUAGE_SELECITOR_BTN=iElementFactory.getButton(By.xpath("//*[contains(@class,'hide-arrow')]"),"Language selector button");
+ private List languages;
+ private final IButton SEARCH_SUBMIT_BTN=iElementFactory.getButton(By.xpath("//*[@type='submit']"),"Search submit button on the search page");
+ private List searchResults;
+
+
+
+
+
+ public ITextBox getSEARCH_FIELD(){return SEARCH_FIELD;}
+
+ public void typeInTheSearchField(String text){getSEARCH_FIELD().clearAndType(text);}
+
+ public IButton getSEARCH_SUBMIT_BTN(){return SEARCH_SUBMIT_BTN;}
+ public void clickOnSearchSubmitBtn(){getSEARCH_SUBMIT_BTN().click();}
+
+ public IButton getLANGUAGE_SELECTOR_BTN(){return LANGUAGE_SELECITOR_BTN;}
+ public void clickOnTheLanguageSelectorBtn(){getLANGUAGE_SELECTOR_BTN().click();}
+ public List setLanguages(){
+ languages=iElementFactory.findElements(By.xpath("//*[@id='searchLanguage']/option"), "List of languages", ElementType.BUTTON);
+ return languages;
+ }
+ public void setLanguageToEspanol(String text){
+ setLanguages();
+ for(IElement language:languages){
+ if(language.getText().equals(text)){
+ language.click();
+ }
+ }
+ }
+ public List getSearchResults(){
+ searchResults=iElementFactory.findElements(By.xpath("//*[@class='suggestion-link']"),"Search results",ElementType.LABEL);
+ return searchResults;
+ }
+
+}
diff --git a/src/test/java/wikipedia/pages/PDFDownloadPage.java b/src/test/java/wikipedia/pages/PDFDownloadPage.java
new file mode 100644
index 0000000..359ccc8
--- /dev/null
+++ b/src/test/java/wikipedia/pages/PDFDownloadPage.java
@@ -0,0 +1,30 @@
+package wikipedia.pages;
+
+import aquality.selenium.browser.AqualityServices;
+import aquality.selenium.elements.interfaces.IButton;
+import aquality.selenium.elements.interfaces.IElementFactory;
+import aquality.selenium.elements.interfaces.ILabel;
+import aquality.selenium.forms.Form;
+import org.openqa.selenium.By;
+import wikipedia.utils.DriverTools;
+
+public class PDFDownloadPage extends Form {
+
+ public PDFDownloadPage() {
+ super(By.xpath("//h1[contains(@class,'mw-first-heading') and text()='Download as PDF']"), "PDF Download page");
+ }
+
+ private IElementFactory iElementFactory= AqualityServices.getElementFactory();
+
+ private final ILabel FILE_DOWNLOAD_BOX= iElementFactory.getLabel(By.xpath("//*[contains(@class,'mw-electronpdfservice-selection-label-text')]"),"File download box");
+ private final IButton FILE_DOWNLOAD_BTN=iElementFactory.getButton(By.xpath("//*[contains(@class,'oo-ui-labelElement-label')and text()='Download']"),"File download button");
+
+
+
+
+ public ILabel getFILE_DOWNLOAD_BOX(){return FILE_DOWNLOAD_BOX;}
+ public String getFileDownloadBoxText(){return getFILE_DOWNLOAD_BOX().getText();}
+ public IButton getFILE_DOWNLOAD_BTN(){return FILE_DOWNLOAD_BTN;}
+ public void clickOnFileDownloadBtn(){getFILE_DOWNLOAD_BTN().click();}
+
+}
diff --git a/src/test/java/wikipedia/stepDefinitions/ArticlePageSteps.java b/src/test/java/wikipedia/stepDefinitions/ArticlePageSteps.java
new file mode 100644
index 0000000..0d74ebb
--- /dev/null
+++ b/src/test/java/wikipedia/stepDefinitions/ArticlePageSteps.java
@@ -0,0 +1,29 @@
+package wikipedia.stepDefinitions;
+
+import io.cucumber.java.en.And;
+import io.cucumber.java.en.Then;
+import org.testng.Assert;
+import wikipedia.pages.ArticlePage;
+import wikipedia.utils.DataProcessor;
+
+public class ArticlePageSteps {
+
+ private ArticlePage articlePage=new ArticlePage();
+
+ @And("the user clicks the Tool menu button on the Article page")
+ public void theUserClicksTheToolMenuButtonOnTheArticlePage() {
+ articlePage.clickOnToolsDropdownBtn();
+ }
+ @And("the user clicks the Download as PDF button on the Article page")
+ public void theUserClicksTheDownloadAsPDFBtn(){
+ articlePage.clickOnPdfDownloadLink();
+ }
+ @And("the user clicks the Page information button on the Article page")
+ public void theUserClicksThePageInformationButtonOnTheArticlePage() {
+ articlePage.clickOnPageInformationLink();
+ }
+ @Then("the Article page for {string} in Spanish should be open")
+ public void checkPageHeader(String string){
+ Assert.assertEquals(articlePage.getPageHeaderText(),string,"Page header does not match");
+ }
+}
diff --git a/src/test/java/wikipedia/stepDefinitions/InformationPageSteps.java b/src/test/java/wikipedia/stepDefinitions/InformationPageSteps.java
new file mode 100644
index 0000000..019e91b
--- /dev/null
+++ b/src/test/java/wikipedia/stepDefinitions/InformationPageSteps.java
@@ -0,0 +1,19 @@
+package wikipedia.stepDefinitions;
+
+import io.cucumber.java.en.Then;
+import org.testng.Assert;
+import wikipedia.pages.InformationPage;
+
+public class InformationPageSteps {
+
+ private InformationPage informationPage=new InformationPage();
+
+
+
+
+ @Then("the Information page for the {string} article should be displayed")
+ public void infoPageIsDisplayed(String string){
+ Assert.assertEquals(informationPage.getPAGE_HEADER(), string,"Page informaiton is not correct");
+ }
+
+}
diff --git a/src/test/java/wikipedia/stepDefinitions/MainPageSteps.java b/src/test/java/wikipedia/stepDefinitions/MainPageSteps.java
new file mode 100644
index 0000000..8fa0ed0
--- /dev/null
+++ b/src/test/java/wikipedia/stepDefinitions/MainPageSteps.java
@@ -0,0 +1,32 @@
+package wikipedia.stepDefinitions;
+
+import aquality.selenium.elements.interfaces.IElement;
+import io.cucumber.java.en.Given;
+import io.cucumber.java.en.Then;
+import io.cucumber.java.en.When;
+import org.testng.Assert;
+import wikipedia.pages.MainPage;
+
+public class MainPageSteps {
+
+ private MainPage mainPage=new MainPage();
+
+ @Given("the user is on the Main page")
+ public void theUserIsOnTheMainPage() {
+ Assert.assertTrue(mainPage.state().isDisplayed());
+ }
+ @Then("the user inputs {string} in the search field")
+ public void theUserInputsInTheSearchFieldAndClicksSubmit(String string) {
+ mainPage.typeInTheSearchField(string);
+ }
+ @Then("the user clicks on the search submit button")
+ public void clickOnTheSearchSubmitBtn(){
+ mainPage.clickOnSearchSubmitBtn();
+ }
+ @When("the user changes the search language to {string}")
+ public void selectEspanolLanguage(String string){
+ mainPage.clickOnTheLanguageSelectorBtn();
+ mainPage.setLanguageToEspanol(string);
+ }
+
+}
diff --git a/src/test/java/wikipedia/stepDefinitions/PDFDOwnloadPageSteps.java b/src/test/java/wikipedia/stepDefinitions/PDFDOwnloadPageSteps.java
new file mode 100644
index 0000000..5422c8a
--- /dev/null
+++ b/src/test/java/wikipedia/stepDefinitions/PDFDOwnloadPageSteps.java
@@ -0,0 +1,18 @@
+package wikipedia.stepDefinitions;
+
+import io.cucumber.java.en.Then;
+import org.testng.Assert;
+import wikipedia.pages.PDFDownloadPage;
+import wikipedia.utils.FileActions;
+
+public class PDFDOwnloadPageSteps {
+
+ private PDFDownloadPage pdfDownloadPage=new PDFDownloadPage();
+
+ @Then("the file with the provided name on the Download as PDF page should be downloaded")
+ public void theFileIsDownloadedFromThePDFDownloadPage(){
+ pdfDownloadPage.clickOnFileDownloadBtn();
+ Assert.assertTrue(FileActions.doesFileExists(FileActions.getDOWNLOADED_FILE()),"File not found at the location");
+ FileActions.deleteFile(FileActions.doesFileExists(FileActions.getDOWNLOADED_FILE()));
+ }
+}
diff --git a/src/test/java/wikipedia/utils/DataProcessor.java b/src/test/java/wikipedia/utils/DataProcessor.java
new file mode 100644
index 0000000..39af17b
--- /dev/null
+++ b/src/test/java/wikipedia/utils/DataProcessor.java
@@ -0,0 +1,24 @@
+package wikipedia.utils;
+
+import aquality.selenium.browser.AqualityServices;
+import com.google.gson.Gson;
+import java.io.FileReader;
+
+public class DataProcessor {
+
+ private static final Gson GSON=new Gson();
+ private static final String PRE_TEST_DATA="./src/test/java/wikipedia/data/preTestData.json";
+
+
+
+
+ public static ProcessedData processedData(){
+ try{
+ return GSON.fromJson(new FileReader(PRE_TEST_DATA),ProcessedData.class);
+ }catch(Exception err){
+ AqualityServices.getLogger().error(err.getMessage());
+ throw new RuntimeException(err.getMessage());
+ }
+ }
+
+}
diff --git a/src/test/java/wikipedia/utils/DriverTools.java b/src/test/java/wikipedia/utils/DriverTools.java
new file mode 100644
index 0000000..fce033b
--- /dev/null
+++ b/src/test/java/wikipedia/utils/DriverTools.java
@@ -0,0 +1,21 @@
+package wikipedia.utils;
+
+import aquality.selenium.browser.AqualityServices;
+import aquality.selenium.browser.Browser;
+import aquality.selenium.core.waitings.IConditionalWait;
+import aquality.selenium.elements.interfaces.IElementFactory;
+
+public class DriverTools {
+
+ private static final Browser BROWSER= AqualityServices.getBrowser();
+ private static final IElementFactory iEL_FACTORY=AqualityServices.getElementFactory();
+ private static final IConditionalWait iCON_WAIT=AqualityServices.getConditionalWait();
+
+
+
+
+ public static Browser getBrowser(){return BROWSER;}
+ public static IElementFactory getiElementFactory(){return iEL_FACTORY;}
+ public static IConditionalWait getiConWait(){return iCON_WAIT;}
+
+}
diff --git a/src/test/java/wikipedia/utils/FileActions.java b/src/test/java/wikipedia/utils/FileActions.java
new file mode 100644
index 0000000..a8ace76
--- /dev/null
+++ b/src/test/java/wikipedia/utils/FileActions.java
@@ -0,0 +1,31 @@
+package wikipedia.utils;
+
+import aquality.selenium.browser.AqualityServices;
+
+import java.io.File;
+
+public class FileActions {
+
+ private static final String FILE_DOWNLOAD_LOCATION="./downloads/";
+ private static final File DOWNLOADED_FILE=new File(FILE_DOWNLOAD_LOCATION+DataProcessor.processedData().getFileName());
+
+
+
+
+ public static File getDOWNLOADED_FILE(){return DOWNLOADED_FILE;}
+ public static boolean doesFileExists(File file){
+ try{
+ DriverTools.getiConWait().waitFor(() -> file.exists());
+ }catch(Exception err){
+ AqualityServices.getLogger().error(err.getMessage());
+ return false;
+ }
+ return true;
+ }
+ public static void deleteFile(Boolean condition){
+ if(condition){
+ DOWNLOADED_FILE.delete();
+ }
+ }
+
+}
diff --git a/src/test/java/wikipedia/utils/ProcessedData.java b/src/test/java/wikipedia/utils/ProcessedData.java
new file mode 100644
index 0000000..e0068f0
--- /dev/null
+++ b/src/test/java/wikipedia/utils/ProcessedData.java
@@ -0,0 +1,18 @@
+package wikipedia.utils;
+
+public class ProcessedData {
+
+ private String URL;
+ private String SearchContext;
+ private String FileName;
+ private String PageInformationHeader;
+
+
+
+
+ public String getURL(){return URL;}
+ public String getSearchContext(){return SearchContext;}
+ public String getFileName(){return FileName;}
+ public String getPageInformationHeader(){return PageInformationHeader;}
+
+}
diff --git a/src/test/resources/allure.properties b/src/test/resources/allure.properties
new file mode 100644
index 0000000..e37bada
--- /dev/null
+++ b/src/test/resources/allure.properties
@@ -0,0 +1,3 @@
+allure.results.directory=target/allure-results
+allure.link.issue.pattern=https://example.org/issue/{}
+allure.link.tms.pattern=https://example.org/tms/{}
\ No newline at end of file