{"id":16376784,"url":"https://github.com/mfaisalkhatri/speedwell","last_synced_at":"2025-10-26T08:31:02.687Z","repository":{"id":45161111,"uuid":"149953445","full_name":"mfaisalkhatri/speedwell","owner":"mfaisalkhatri","description":"A power-packed keyword driven framework which is integrated with Allure reports and Log4j2.","archived":false,"fork":false,"pushed_at":"2022-01-04T16:33:19.000Z","size":16671,"stargazers_count":7,"open_issues_count":3,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-31T17:13:32.609Z","etag":null,"topics":["allure","automation","automation-framework","framework","keyword-driven-testing","log4j2","open-source","selenium-webdriver","testing","testng"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mfaisalkhatri.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-09-23T06:18:55.000Z","updated_at":"2023-02-14T19:18:12.000Z","dependencies_parsed_at":"2022-08-28T13:30:33.436Z","dependency_job_id":null,"html_url":"https://github.com/mfaisalkhatri/speedwell","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfaisalkhatri%2Fspeedwell","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfaisalkhatri%2Fspeedwell/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfaisalkhatri%2Fspeedwell/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfaisalkhatri%2Fspeedwell/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mfaisalkhatri","download_url":"https://codeload.github.com/mfaisalkhatri/speedwell/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238293350,"owners_count":19448172,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["allure","automation","automation-framework","framework","keyword-driven-testing","log4j2","open-source","selenium-webdriver","testing","testng"],"created_at":"2024-10-11T03:26:10.498Z","updated_at":"2025-10-26T08:31:00.564Z","avatar_url":"https://github.com/mfaisalkhatri.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"**speedwell**\n\n**A power-packed keyword driven framework which is integrated with Allure reports and Log4j2.**\n\n**Getting Started**\n\n*This page includes all the information you need to get started including setup, usage, advantages, sample test.*\n\n**What to do when you need help?**\n* Discuss your queries by writing to me at: \n* Mail: mohammadfaisalkhatri@gmail.com \n* Twitter: @mfaisal_khatri \n* LinkedIn: Mohammad Faisal Khatri\n\n* If you find any issue which is bottleneck for you, search the issue tracker to see if it is already raised.\n* If not raised, then you can create a new issue with required details as mentioned in the issue template.\n\n**What you do if you like the project?**\n* Spread the word with your network.\n* Star the project to make the project popular.\n* Stay updated with the project progress by Watching it.\n\n**How to use this Framework:**\n01. \"Config.Properties\" file is used in the framework for defining the Browser Type, storing the Url of website used for tests, User Id and Password of used for login, etc.\n\n```\nThis is the config file extract: \nbrowser=chrome //Here, browser value should be given like \"Chrome\" / \"Firefox\".\nwebsite=http://www.google.co.in\nusername=user001\npassword=pass01\n```\n\n02. PropertiesReader class is available in the Framework which is a helper class to read the config file in simplified way.\n03. Getter/Setter is required to be created for the Config file key value pairs to be used in tests.\n\n```\nThis is how Getter/Setter is created for fetching config file values:\npublic class ConfigProperties {\n\n\tPropertiesReader prop = new PropertiesReader();\n\n\tpublic String getBrowser() throws IOException {\n\t\treturn prop.getKey(\"browser\");\n\t}\n\n\tpublic String getWebsite() throws IOException {\n\t\treturn prop.getKey(\"website\");\n\t}\n\n\tpublic String getUserName() throws IOException {\n\t\treturn prop.getKey(\"username\");\n\t}\n\tpublic String getPassword() throws IOException {\n\t\treturn prop.getKey(\"password\");\n\t}\n```\n\n04. For using this framework, you have to create a Setup class where browser will be set up. Use \"testng\" annotations \"BeforeSuite\"/\"BeforeClass\"/\"BeforeMethod\", according to your case and condition of automation tests and Extend \"BrowserSetup\" class in it.\n05. Now you can use the \"startBrowser\" method directly in your tests which requires, \"Browser Name\" and \"Website Url\" as parameters.\n06. For tearDown method, \"stopBrowser\" will quit the browsers.\n\n**This is what Setup class looks like :**\n```\npublic class Setup extends BrowserSetup {\n\n\t@BeforeMethod\n\tpublic void siteup() throws Exception {\n\t\tConfigProperties config = new ConfigProperties();\n\t\tstartBrowser(config.getBrowser(), config.getWebsite());\n\n\t}\n\n\t@AfterMethod\n\tpublic void tearDown() {\n\t\tstopBrowser();\n\t}\n}\n```\n\n07. I have created this framework keeping \"Page Object Model\" in mind, so, the next step would be defining a class with locators of the page which can be used in final tests.\nSuppose, for example, Login Page is available and we need to find locators for \"Username\" and \"Password\" fields, enter their respective values, find locator of submit button and click on it. \n\n**This is what the Login Page will look like:**\n\n```\npublic class LoginPage {\n\n\tprivate WebDriver driver;\n\tprivate ElementSelectors selector;\n\tprivate Utilities utility;\n\n\tpublic LoginPage(WebDriver driver) {\n\t\tthis.driver = driver;\n\t\tthis.selector = new ElementSelectors(driver);\n\t\tthis.utility = new Utilities(driver);\n\t}\n\n\t@Step\n\tpublic void loginSite(String usrName, String password) throws IOException {\n\t\tWebElement pageHeader = driver.findElement(By.cssSelector(\".nav\"));\n\t\tselector.clickField(pageHeader, By.linkText(\"Sign in\"));\n\n\t\tWebElement signInPage = driver.findElement(By.cssSelector(\".columns-container\"));\n\t\tselector.fillField(signInPage, By.id(\"email\"), usrName);\n\t\tselector.fillField(signInPage, By.id(\"passwd\"), password);\n\t\tutility.captureScreenShot();\n\n\t\tselector.clickField(signInPage, By.id(\"SubmitLogin\"));\n\t}\n\n}\n```\n08. Now, comes the Test Class, it will be like this: \n```\npublic class LoginTest extends Setup {\n\n\t@Test\n\tpublic void loginWebsite() throws IOException {\n\t\tConfigProperties config = new ConfigProperties();\n\t\tLoginPage login = new LoginPage(driver);\n\t\tlogin.loginSite(config.getUserName(), config.getPassword());\n\t}\n```\n\n**Isn't this simple? Let me know your thoughts on this....?**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmfaisalkhatri%2Fspeedwell","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmfaisalkhatri%2Fspeedwell","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmfaisalkhatri%2Fspeedwell/lists"}