{"id":16181294,"url":"https://github.com/kaosat-dev/react-page-objects","last_synced_at":"2025-04-07T12:16:53.261Z","repository":{"id":29291675,"uuid":"32824507","full_name":"kaosat-dev/react-page-objects","owner":"kaosat-dev","description":"Page Object pattern for testing React components","archived":false,"fork":false,"pushed_at":"2015-03-12T16:10:33.000Z","size":832,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-13T14:49:38.841Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"QubitProducts/react-page-objects","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kaosat-dev.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":"2015-03-24T20:52:06.000Z","updated_at":"2015-03-24T20:52:07.000Z","dependencies_parsed_at":"2024-04-19T11:50:13.752Z","dependency_job_id":null,"html_url":"https://github.com/kaosat-dev/react-page-objects","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaosat-dev%2Freact-page-objects","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaosat-dev%2Freact-page-objects/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaosat-dev%2Freact-page-objects/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaosat-dev%2Freact-page-objects/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kaosat-dev","download_url":"https://codeload.github.com/kaosat-dev/react-page-objects/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247648976,"owners_count":20972945,"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-10-10T06:24:30.719Z","updated_at":"2025-04-07T12:16:53.219Z","avatar_url":"https://github.com/kaosat-dev.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# React Page Objects\n\n[React](http://facebook.github.io/react/) [page objects](https://code.google.com/p/selenium/wiki/PageObjects) make it easy to test [react](http://facebook.github.io/react/) components.\n\nReact gives you some useful utilities for testing React components however they lead to verbose code that clutters your tests.\n\n```js\nvar TestUtils = require(\"react/addons\").addons.TestUtils;\n\nvar element = TestUtils.renderIntoDocument(\u003cLoginPage /\u003e);\nvar emailNode = element.email.getDOMNode();\n\nexpect(emailNode.value).to.equal(\"foo@bar.com\");\n\nelement.password.getDOMNode().value = \"bar@baz.com\";\nTestUtils.Simulate.change(element.password.getDOMNode(), {\n  target: {\n    value: \"password\"\n  }\n});\n\nTestUtils.Simulate.click(element.login.getDOMNode());\n```\n\nReact Page Objects hides this complexity by providing a simpler API\n\n```\nvar page = new PageObject(\u003cLoginPage /\u003e);\n\nexpect(page.email.value).to.equal(\"foo@bar.com\");\npage.email.value = \"bar@baz.com\";\npage.login.click();\n```\n\n##Tutorial\n\nSay you have a login page built in React you want to test\n\n```js\nvar LoginPage = React.createClass({\n  render: function () {\n    return (\n      \u003cdiv className=\"login-page\"\u003e\n        \u003cinput ref=\"email\" type=\"text\" value={this.state.email} onChange={this.onEmailChanged} /\u003e\n        \u003cinput ref=\"password\" type=\"password\" value={this.state.password} onChange={this.onPasswordChanged} /\u003e\n        \u003cinput ref=\"login\" value=\"Login\" type=\"submit\" onClick={this.login} /\u003e\n      \u003c/div\u003e\n    );\n  },\n  login: function () {\n    AuthService.authenticate(this.state.email, this.state.password);\n  },\n  onEmailChanged: function (e) {\n    this.setState({ email: e.target.value });\n  },\n  onPasswordChanged: function () {\n    this.setState({ password: this.refs.password.getDOMNode().value });\n  },\n  getInitialState: function () {\n    return {\n      email: \"\",\n      password: \"\"\n    };\n  }\n});\n```\n\nTo easily reference specific elements within the component, you should add [refs](http://facebook.github.io/react/docs/more-about-refs.html) to them. \n\nIf you then pass an instance of the component into a page object, any refs will be accessible. You can then get the values of the elements and simulate events (e.g. click, select, etc).\n\n```js\nvar page = new PageObject(\u003cLoginPage /\u003e);\n\npage.email.value = \"foo@bar.com\";\npage.password.value = \"password\";\npage.login.click();\n```\n\nYou can also create a custom type for a page using ``PageObject#extend``\n\n```js\nvar LoginPageObject = PageObject.extend({\n  getComponent: function () {\n    return \u003cLoginPage /\u003e;\n  },\n  loginAs: function (email, password) {\n    this.email.value = \"foo@bar.com\";\n    this.password.value = \"password\";\n    this.login.click();\n  }\n});\n\nvar page = new LoginPageObject();\n\npage.loginAs(\"foo@bar.com\", \"password\");\n```\n\nThe ``elements`` hash map allows you to specify the page object type of any [refs](http://facebook.github.io/react/docs/more-about-refs.html) allowing you to build more complex pages. They key in the ``elements`` is the name of the [ref](http://facebook.github.io/react/docs/more-about-refs.html) and the value is the page object type.\n\n```js\nvar NewsFeedItem = React.createClass({\n  render: function () {\n    return (\n      \u003cdiv className=\"news-feed-item\"\u003e\n        \u003cUser ref=\"user\" user={this.props.item.user} /\u003e\n        \u003ch1 ref=\"title\"\u003e{this.props.item.title}\u003c/h1\u003e\n        \u003cdiv ref=\"body\"\u003e{this.props.item.body}\u003c/div\u003e\n      \u003c/div\u003e\n    );\n  }\n});\n\nvar NewsFeedItemPageObject = PageObject.extend({\n  elements: {\n    user: PageObject\n  },\n  getComponent: function (props) {\n    return \u003cNewsFeed {...props} /\u003e;\n  }\n});\n\nvar User = React.createClass({\n  render: function () {\n    return (\n      \u003cdiv className=\"user\"\u003e\n        \u003cspan ref=\"name\"\u003e{this.props.user.name}\u003c/span\u003e\n      \u003c/div\u003e\n    );\n  }\n});\n\nvar item = new NewsFeedItemPageObject({\n  item: {\n    user: { name: \"Foo Bar\" },\n    title: \"Foo\",\n    body: \"Lorum Ipsum\"\n  }\n});\n\nexpect(item.title.value).to.equal(\"Foo\");\nexpect(item.user.name.value).to.equal(\"Foo Bar\");\n```\n\nIf you have an array of page objects, you should add a ref to the parent element and then in elements hash the value should be an array containing the page object type.\n\n```js\nvar NewsFeed = React.createClass({\n  render: function () {\n    return (\n      \u003cdiv className=\"news-feed\"\u003e\n        \u003cdiv className=\"news-feed-items\" ref=\"items\"\u003e\n          {this.state.items.map(function (item) {\n            return \u003cNewsFeedItem key={item.id} item={item} /\u003e;\n          })}\n        \u003c/div\u003e\n      \u003c/div\u003e\n    );\n  },\n  getInitialState: function () {\n    return {\n      items: NewsFeedService.getNewsFeedItemsFor(this.props.user)\n    };\n  }\n});\n\nvar NewsFeedPageObject = PageObject.extend({\n  elements: {\n    items: [NewsFeedItemPageObject]\n  },\n  getComponent: function (props) {\n    return \u003cNewsFeed {...props} /\u003e;\n  }\n});\n\nvar newsFeed = new NewsFeedPageObject({\n  user: \"foo\"\n});\n\nexpect(newsFeed.items).to.not.be.empty;\nexpect(newsFeed.items.get(1).user.name.value).to.equal(\"foo\");\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaosat-dev%2Freact-page-objects","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkaosat-dev%2Freact-page-objects","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaosat-dev%2Freact-page-objects/lists"}