{"id":20456285,"url":"https://github.com/semperos/provi","last_synced_at":"2025-06-28T00:06:02.318Z","repository":{"id":24351758,"uuid":"27750005","full_name":"semperos/Provi","owner":"semperos","description":"Provi implemented in MPS","archived":false,"fork":false,"pushed_at":"2014-12-10T21:13:11.000Z","size":1736,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-05T10:31:48.719Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/semperos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-12-09T04:48:56.000Z","updated_at":"2015-09-20T01:59:08.000Z","dependencies_parsed_at":"2022-08-27T00:54:25.337Z","dependency_job_id":null,"html_url":"https://github.com/semperos/Provi","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/semperos/Provi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semperos%2FProvi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semperos%2FProvi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semperos%2FProvi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semperos%2FProvi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/semperos","download_url":"https://codeload.github.com/semperos/Provi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semperos%2FProvi/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262352621,"owners_count":23297689,"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":[],"created_at":"2024-11-15T11:22:05.659Z","updated_at":"2025-06-28T00:06:02.276Z","avatar_url":"https://github.com/semperos.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Provi #\n\nDSL for Selenium-WebDriver tests using JetBrains' Meta Programming System (MPS).\n\n## Audience(s) ##\n\nQA professionals tasked with automating web test suites, but who either lack the coding experience to put together a large, well-organized codebase themselves, or who simply do not want to learn the whole Selenium-WebDriver API. MPS provides extensive auto-suggestions that make writing the DSL surprisingly straightforward.\n\nMPS allows extending languages. So the human-friendly DSL will be the default, but programmers can go into the settings and pull in other languages (with more programmer-focused constructs) to use in addition/instead.\n\n## DSL Features ##\n\nThe Examples section below fuels this section.\n\n### Concepts ###\n\n * BrowserSession\n * Browser -\u003e Driver -\u003e driver implementations (Firefox, Chrome, etc.)\n * Element\n\n## Examples ##\n\nImagine the ideal language, and then build it.\n\n### Start Browser Session ###\n\n```\nBrowser Session *Login to Github* in Firefox\n```\n\n### Navigate ###\n\n```\nGo to \"https://github.com\"\n```\n\nFor relative paths:\n\n```\nStarting with URL \"https://github.com\"\nGo to \"/login\"\n```\n\n### Interactivity ###\n\nCSS query:\n\n```\nClick \".header \u003e button.login\"\n```\n\nGrab an element and do multiple things.\n\n```\nFind \"input.username\" and\n    Type \"my_username_01\" into it and\n    Press Enter\n```\n\n### Variables ###\n\nElements can be held onto as variables, but we have to figure out how best to deal with Selenium-WebDriver's \"stale element\" concept, wherein references to elements become stale on page refresh.\n\n```\nThe \"input.username\" is called the *username input field*\n\n// OR\n\nThe *username input field* is at \"input.username\"\n```\n\n(Advanced) Support programmer-friendly (PF) variable declarations:\n\n```\nusernameInputField = Find \"input.usename\"\n```\n\n### Functions/Routines ###\n\nNeed reusability and extensibility, but make it simple.\n\nNo parameters/arguments:\n\n```\nTo login do:\n * Go to \"https://github.com\"\n * Click \".header \u003e button.login\"\n * Find \"input.username\" and\n      Type \"my_username_01\" into it and\n      Press Enter\n```\n\nWith one parameter:\n\n```\nFor any table; to delete a row do:\n * Find \"tr td.action\" inside the table and\n       Click the checkbox\n * Click \"button.delete\"\n```\n\nWith multiple parameters:\n\n```\nFor any input field and text; to submit the text do:\n  * Type the text into the input field and\n  * Press Enter\n```\n\n(Advanced) Support PF function declarations:\n\n```\nfunction \u003cname\u003e (param, param) {\n    ...\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemperos%2Fprovi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsemperos%2Fprovi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemperos%2Fprovi/lists"}