{"id":99134,"date":"2019-10-11T07:00:09","date_gmt":"2019-10-11T04:00:09","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=99134"},"modified":"2019-10-09T12:43:30","modified_gmt":"2019-10-09T09:43:30","slug":"using-pagefactory-implement-page-object-pattern","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html","title":{"rendered":"JUnit 5 and Selenium &#8211; Using Selenium built-in `PageFactory` to implement Page Object Pattern"},"content":{"rendered":"<p>Selenium is a set of tools and libraries supporting browser automation and it is mainly used for web applications testing. One of the Selenium\u2019s components is a Selenium WebDriver that provides client library, the JSON wire protocol (protocol to communicate with the browser drivers) and browser drivers. One of the main advantages of Selenium WebDriver is that it supported by all major programming languages and it can run on all major operating systems.<\/p>\n<p>In this part of the <em>JUnit 5 with Selenium WebDriver &#8211; Tutorial<\/em> I will go though the implementation of Page Object pattern with Selenium\u2019s built-in PageFactory support class. <code>PageFactory<\/code> provides mechanism to initialize any Page Object that declares <code>WebElement<\/code> or <code>List&lt;WebElement&gt;<\/code> fields annotated with <code>@FindBy<\/code> annotation.<\/p>\n<h2 class=\"wp-block-heading\">About this Tutorial<\/h2>\n<p>You are reading the second part of the <em>JUnit 5 with Selenium WebDriver &#8211; Tutorial<\/em>.<\/p>\n<p>All articles in this tutorial:<\/p>\n<ul class=\"wp-block-list\">\n<li>Part 1 &#8211; <a href=\"https:\/\/www.javacodegeeks.com\/2019\/09\/junit-selenium-setup-project-gradle-jupiter-selenium.html\">Setup the project from the ground up &#8211; Gradle with JUnit 5 and Jupiter Selenium<\/a><\/li>\n<li>Part 2 &#8211; <a href=\"https:\/\/blog.codeleak.pl\/2019\/10\/junit-5-and-selenium-using-selenium.html\">Using Selenium built-in <code>PageFactory<\/code> to implement Page Object Pattern<\/a><\/li>\n<\/ul>\n<p>Coming up next:<\/p>\n<ul class=\"wp-block-list\">\n<li>Part 3 &#8211; Improving the project configuration &#8211; executing tests in parallel, tests execution order, parameterized tests, AssertJ and more<\/li>\n<\/ul>\n<p>The source code for this tutorial can be found on <a href=\"https:\/\/github.com\/kolorobot\/junit5-selenium-todomvc-demo\">Github<\/a><\/p>\n<h2 class=\"wp-block-heading\">Introducing Page Object Pattern<\/h2>\n<p>We will be creating tests for JavaScript based Todo application available here: <a href=\"http:\/\/todomvc.com\/examples\/vanillajs\">http:\/\/todomvc.com\/examples\/vanillajs<\/a>. The application is created as a Single Page Application (SPA) and uses local storage as a task repository. The possible scenarios to be implemented include adding and editing todo, removing todo, marking single or multiple todos as done. The implementation will be done using Page Object pattern.<\/p>\n<p>The goal of Page Object pattern is to abstract the application pages and functionality from the actual tests. Page Object pattern improves re-usability of the code across tests and fixtures but also makes the code easier to maintain.<\/p>\n<p>You can read more about this pattern in the Martin Fowler article: <a href=\"https:\/\/martinfowler.com\/bliki\/PageObject.html\">https:\/\/martinfowler.com\/bliki\/PageObject.html<\/a><\/p>\n<h2 class=\"wp-block-heading\">Page API aka Page Object<\/h2>\n<p>We will start the project from modelling the <a href=\"http:\/\/todomvc.com\/examples\/vanillajs\">TodoMVC<\/a> page as Page Object. This object will be representing the page API that will be used in tests. The API itself can be modelled using an interface. If you look at the methods of the below interface you notice that the methods are just user functions that are available on the page. User can <em>create todo<\/em>, user can <em>rename todo<\/em> or he can <em>remove todo<\/em>:<\/p>\n<div>\n<div id=\"highlighter_631911\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">interface<\/code> <code class=\"java plain\">TodoMvc {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">navigateTo();<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">createTodo(String todoName);<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">createTodos(String... todoNames);<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">int<\/code> <code class=\"java plain\">getTodosLeft();<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">boolean<\/code> <code class=\"java plain\">todoExists(String todoName);<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">int<\/code> <code class=\"java plain\">getTodoCount();<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">List&lt;String&gt; getTodos();<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">renameTodo(String todoName, String newTodoName);<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">removeTodo(String todoName);<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">completeTodo(String todoName);<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">completeAllTodos();<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">showActive();<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">showCompleted();<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">clearCompleted();<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The above interface (obviously) hides all the implementation details but also it does not expose any Selenium WebDriver details to the potential client (in our case the client = the test method). In fact, it has no relation to Selenium WebDriver whatsoever. So in theory, we could have different implementations of this page for different devices (e.g. mobile native application, desktop application and web application).<\/p>\n<h2 class=\"wp-block-heading\">Creating tests<\/h2>\n<p>With the page API defined we can jump directly to creating the test methods. We will work on the page implementation after we confirm the API can be used for creating tests. This design technique allows to focus on the real usage of the application instead of jumping into implementation details too early.<\/p>\n<p>The following tests were created:<\/p>\n<div>\n<div id=\"highlighter_878856\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">001<\/div>\n<div class=\"line number2 index1 alt1\">002<\/div>\n<div class=\"line number3 index2 alt2\">003<\/div>\n<div class=\"line number4 index3 alt1\">004<\/div>\n<div class=\"line number5 index4 alt2\">005<\/div>\n<div class=\"line number6 index5 alt1\">006<\/div>\n<div class=\"line number7 index6 alt2\">007<\/div>\n<div class=\"line number8 index7 alt1\">008<\/div>\n<div class=\"line number9 index8 alt2\">009<\/div>\n<div class=\"line number10 index9 alt1\">010<\/div>\n<div class=\"line number11 index10 alt2\">011<\/div>\n<div class=\"line number12 index11 alt1\">012<\/div>\n<div class=\"line number13 index12 alt2\">013<\/div>\n<div class=\"line number14 index13 alt1\">014<\/div>\n<div class=\"line number15 index14 alt2\">015<\/div>\n<div class=\"line number16 index15 alt1\">016<\/div>\n<div class=\"line number17 index16 alt2\">017<\/div>\n<div class=\"line number18 index17 alt1\">018<\/div>\n<div class=\"line number19 index18 alt2\">019<\/div>\n<div class=\"line number20 index19 alt1\">020<\/div>\n<div class=\"line number21 index20 alt2\">021<\/div>\n<div class=\"line number22 index21 alt1\">022<\/div>\n<div class=\"line number23 index22 alt2\">023<\/div>\n<div class=\"line number24 index23 alt1\">024<\/div>\n<div class=\"line number25 index24 alt2\">025<\/div>\n<div class=\"line number26 index25 alt1\">026<\/div>\n<div class=\"line number27 index26 alt2\">027<\/div>\n<div class=\"line number28 index27 alt1\">028<\/div>\n<div class=\"line number29 index28 alt2\">029<\/div>\n<div class=\"line number30 index29 alt1\">030<\/div>\n<div class=\"line number31 index30 alt2\">031<\/div>\n<div class=\"line number32 index31 alt1\">032<\/div>\n<div class=\"line number33 index32 alt2\">033<\/div>\n<div class=\"line number34 index33 alt1\">034<\/div>\n<div class=\"line number35 index34 alt2\">035<\/div>\n<div class=\"line number36 index35 alt1\">036<\/div>\n<div class=\"line number37 index36 alt2\">037<\/div>\n<div class=\"line number38 index37 alt1\">038<\/div>\n<div class=\"line number39 index38 alt2\">039<\/div>\n<div class=\"line number40 index39 alt1\">040<\/div>\n<div class=\"line number41 index40 alt2\">041<\/div>\n<div class=\"line number42 index41 alt1\">042<\/div>\n<div class=\"line number43 index42 alt2\">043<\/div>\n<div class=\"line number44 index43 alt1\">044<\/div>\n<div class=\"line number45 index44 alt2\">045<\/div>\n<div class=\"line number46 index45 alt1\">046<\/div>\n<div class=\"line number47 index46 alt2\">047<\/div>\n<div class=\"line number48 index47 alt1\">048<\/div>\n<div class=\"line number49 index48 alt2\">049<\/div>\n<div class=\"line number50 index49 alt1\">050<\/div>\n<div class=\"line number51 index50 alt2\">051<\/div>\n<div class=\"line number52 index51 alt1\">052<\/div>\n<div class=\"line number53 index52 alt2\">053<\/div>\n<div class=\"line number54 index53 alt1\">054<\/div>\n<div class=\"line number55 index54 alt2\">055<\/div>\n<div class=\"line number56 index55 alt1\">056<\/div>\n<div class=\"line number57 index56 alt2\">057<\/div>\n<div class=\"line number58 index57 alt1\">058<\/div>\n<div class=\"line number59 index58 alt2\">059<\/div>\n<div class=\"line number60 index59 alt1\">060<\/div>\n<div class=\"line number61 index60 alt2\">061<\/div>\n<div class=\"line number62 index61 alt1\">062<\/div>\n<div class=\"line number63 index62 alt2\">063<\/div>\n<div class=\"line number64 index63 alt1\">064<\/div>\n<div class=\"line number65 index64 alt2\">065<\/div>\n<div class=\"line number66 index65 alt1\">066<\/div>\n<div class=\"line number67 index66 alt2\">067<\/div>\n<div class=\"line number68 index67 alt1\">068<\/div>\n<div class=\"line number69 index68 alt2\">069<\/div>\n<div class=\"line number70 index69 alt1\">070<\/div>\n<div class=\"line number71 index70 alt2\">071<\/div>\n<div class=\"line number72 index71 alt1\">072<\/div>\n<div class=\"line number73 index72 alt2\">073<\/div>\n<div class=\"line number74 index73 alt1\">074<\/div>\n<div class=\"line number75 index74 alt2\">075<\/div>\n<div class=\"line number76 index75 alt1\">076<\/div>\n<div class=\"line number77 index76 alt2\">077<\/div>\n<div class=\"line number78 index77 alt1\">078<\/div>\n<div class=\"line number79 index78 alt2\">079<\/div>\n<div class=\"line number80 index79 alt1\">080<\/div>\n<div class=\"line number81 index80 alt2\">081<\/div>\n<div class=\"line number82 index81 alt1\">082<\/div>\n<div class=\"line number83 index82 alt2\">083<\/div>\n<div class=\"line number84 index83 alt1\">084<\/div>\n<div class=\"line number85 index84 alt2\">085<\/div>\n<div class=\"line number86 index85 alt1\">086<\/div>\n<div class=\"line number87 index86 alt2\">087<\/div>\n<div class=\"line number88 index87 alt1\">088<\/div>\n<div class=\"line number89 index88 alt2\">089<\/div>\n<div class=\"line number90 index89 alt1\">090<\/div>\n<div class=\"line number91 index90 alt2\">091<\/div>\n<div class=\"line number92 index91 alt1\">092<\/div>\n<div class=\"line number93 index92 alt2\">093<\/div>\n<div class=\"line number94 index93 alt1\">094<\/div>\n<div class=\"line number95 index94 alt2\">095<\/div>\n<div class=\"line number96 index95 alt1\">096<\/div>\n<div class=\"line number97 index96 alt2\">097<\/div>\n<div class=\"line number98 index97 alt1\">098<\/div>\n<div class=\"line number99 index98 alt2\">099<\/div>\n<div class=\"line number100 index99 alt1\">100<\/div>\n<div class=\"line number101 index100 alt2\">101<\/div>\n<div class=\"line number102 index101 alt1\">102<\/div>\n<div class=\"line number103 index102 alt2\">103<\/div>\n<div class=\"line number104 index103 alt1\">104<\/div>\n<div class=\"line number105 index104 alt2\">105<\/div>\n<div class=\"line number106 index105 alt1\">106<\/div>\n<div class=\"line number107 index106 alt2\">107<\/div>\n<div class=\"line number108 index107 alt1\">108<\/div>\n<div class=\"line number109 index108 alt2\">109<\/div>\n<div class=\"line number110 index109 alt1\">110<\/div>\n<div class=\"line number111 index110 alt2\">111<\/div>\n<div class=\"line number112 index111 alt1\">112<\/div>\n<div class=\"line number113 index112 alt2\">113<\/div>\n<div class=\"line number114 index113 alt1\">114<\/div>\n<div class=\"line number115 index114 alt2\">115<\/div>\n<div class=\"line number116 index115 alt1\">116<\/div>\n<div class=\"line number117 index116 alt2\">117<\/div>\n<div class=\"line number118 index117 alt1\">118<\/div>\n<div class=\"line number119 index118 alt2\">119<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java color1\">@ExtendWith<\/code><code class=\"java plain\">(SeleniumExtension.<\/code><code class=\"java keyword\">class<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Managing Todos\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">class<\/code> <code class=\"java plain\">TodoMvcTests {<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">TodoMvc todoMvc;<\/code><\/div>\n<div class=\"line number6 index5 alt1\">&nbsp;<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">final<\/code> <code class=\"java plain\">String buyTheMilk = <\/code><code class=\"java string\">\"Buy the milk\"<\/code><code class=\"java plain\">;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">final<\/code> <code class=\"java plain\">String cleanupTheRoom = <\/code><code class=\"java string\">\"Clean up the room\"<\/code><code class=\"java plain\">;<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">final<\/code> <code class=\"java plain\">String readTheBook = <\/code><code class=\"java string\">\"Read the book\"<\/code><code class=\"java plain\">;<\/code><\/div>\n<div class=\"line number10 index9 alt1\">&nbsp;<\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@BeforeEach<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">beforeEach(ChromeDriver driver) {<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.todoMvc = <\/code><code class=\"java keyword\">null<\/code><code class=\"java plain\">;<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.todoMvc.navigateTo();<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number16 index15 alt1\">&nbsp;<\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Test<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Creates Todo with given name\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">createsTodo() {<\/code><\/div>\n<div class=\"line number20 index19 alt1\">&nbsp;<\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.createTodo(buyTheMilk);<\/code><\/div>\n<div class=\"line number22 index21 alt1\">&nbsp;<\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertAll(<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">() -&gt; assertEquals(<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">, todoMvc.getTodosLeft()),<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">() -&gt; assertTrue(todoMvc.todoExists(buyTheMilk))<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number28 index27 alt1\">&nbsp;<\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Test<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Creates Todos all with the same name\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">createsTodosWithSameName() {<\/code><\/div>\n<div class=\"line number32 index31 alt1\">&nbsp;<\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.createTodos(buyTheMilk, buyTheMilk, buyTheMilk);<\/code><\/div>\n<div class=\"line number34 index33 alt1\">&nbsp;<\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertEquals(<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">, todoMvc.getTodosLeft());<\/code><\/div>\n<div class=\"line number36 index35 alt1\">&nbsp;<\/div>\n<div class=\"line number37 index36 alt2\">&nbsp;<\/div>\n<div class=\"line number38 index37 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.showActive();<\/code><\/div>\n<div class=\"line number39 index38 alt2\">&nbsp;<\/div>\n<div class=\"line number40 index39 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertEquals(<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">, todoMvc.getTodoCount());<\/code><\/div>\n<div class=\"line number41 index40 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number42 index41 alt1\">&nbsp;<\/div>\n<div class=\"line number43 index42 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Test<\/code><\/div>\n<div class=\"line number44 index43 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Edits inline double-clicked Todo\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number45 index44 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">editsTodo() {<\/code><\/div>\n<div class=\"line number46 index45 alt1\">&nbsp;<\/div>\n<div class=\"line number47 index46 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.createTodos(buyTheMilk, cleanupTheRoom);<\/code><\/div>\n<div class=\"line number48 index47 alt1\">&nbsp;<\/div>\n<div class=\"line number49 index48 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.renameTodo(buyTheMilk, readTheBook);<\/code><\/div>\n<div class=\"line number50 index49 alt1\">&nbsp;<\/div>\n<div class=\"line number51 index50 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertAll(<\/code><\/div>\n<div class=\"line number52 index51 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">() -&gt; assertFalse(todoMvc.todoExists(buyTheMilk)),<\/code><\/div>\n<div class=\"line number53 index52 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">() -&gt; assertTrue(todoMvc.todoExists(readTheBook)),<\/code><\/div>\n<div class=\"line number54 index53 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">() -&gt; assertTrue(todoMvc.todoExists(cleanupTheRoom))<\/code><\/div>\n<div class=\"line number55 index54 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number56 index55 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number57 index56 alt2\">&nbsp;<\/div>\n<div class=\"line number58 index57 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Test<\/code><\/div>\n<div class=\"line number59 index58 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Removes selected Todo\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number60 index59 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">removesTodo() {<\/code><\/div>\n<div class=\"line number61 index60 alt2\">&nbsp;<\/div>\n<div class=\"line number62 index61 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.createTodos(buyTheMilk, cleanupTheRoom, readTheBook);<\/code><\/div>\n<div class=\"line number63 index62 alt2\">&nbsp;<\/div>\n<div class=\"line number64 index63 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.removeTodo(buyTheMilk);<\/code><\/div>\n<div class=\"line number65 index64 alt2\">&nbsp;<\/div>\n<div class=\"line number66 index65 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertAll(<\/code><\/div>\n<div class=\"line number67 index66 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">() -&gt; assertFalse(todoMvc.todoExists(buyTheMilk)),<\/code><\/div>\n<div class=\"line number68 index67 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">() -&gt; assertTrue(todoMvc.todoExists(cleanupTheRoom)),<\/code><\/div>\n<div class=\"line number69 index68 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">() -&gt; assertTrue(todoMvc.todoExists(readTheBook))<\/code><\/div>\n<div class=\"line number70 index69 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number71 index70 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number72 index71 alt1\">&nbsp;<\/div>\n<div class=\"line number73 index72 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Test<\/code><\/div>\n<div class=\"line number74 index73 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Toggles selected Todo as completed\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number75 index74 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">togglesTodoCompleted() {<\/code><\/div>\n<div class=\"line number76 index75 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.createTodos(buyTheMilk, cleanupTheRoom, readTheBook);<\/code><\/div>\n<div class=\"line number77 index76 alt2\">&nbsp;<\/div>\n<div class=\"line number78 index77 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.completeTodo(buyTheMilk);<\/code><\/div>\n<div class=\"line number79 index78 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertEquals(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">, todoMvc.getTodosLeft());<\/code><\/div>\n<div class=\"line number80 index79 alt1\">&nbsp;<\/div>\n<div class=\"line number81 index80 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.showCompleted();<\/code><\/div>\n<div class=\"line number82 index81 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertEquals(<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">, todoMvc.getTodoCount());<\/code><\/div>\n<div class=\"line number83 index82 alt2\">&nbsp;<\/div>\n<div class=\"line number84 index83 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.showActive();<\/code><\/div>\n<div class=\"line number85 index84 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertEquals(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">, todoMvc.getTodoCount());<\/code><\/div>\n<div class=\"line number86 index85 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number87 index86 alt2\">&nbsp;<\/div>\n<div class=\"line number88 index87 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Test<\/code><\/div>\n<div class=\"line number89 index88 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Toggles all Todos as completed\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number90 index89 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">togglesAllTodosCompleted() {<\/code><\/div>\n<div class=\"line number91 index90 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.createTodos(buyTheMilk, cleanupTheRoom, readTheBook);<\/code><\/div>\n<div class=\"line number92 index91 alt1\">&nbsp;<\/div>\n<div class=\"line number93 index92 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.completeAllTodos();<\/code><\/div>\n<div class=\"line number94 index93 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertEquals(<\/code><code class=\"java value\">0<\/code><code class=\"java plain\">, todoMvc.getTodosLeft());<\/code><\/div>\n<div class=\"line number95 index94 alt2\">&nbsp;<\/div>\n<div class=\"line number96 index95 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.showCompleted();<\/code><\/div>\n<div class=\"line number97 index96 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertEquals(<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">, todoMvc.getTodoCount());<\/code><\/div>\n<div class=\"line number98 index97 alt1\">&nbsp;<\/div>\n<div class=\"line number99 index98 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.showActive();<\/code><\/div>\n<div class=\"line number100 index99 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertEquals(<\/code><code class=\"java value\">0<\/code><code class=\"java plain\">, todoMvc.getTodoCount());<\/code><\/div>\n<div class=\"line number101 index100 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number102 index101 alt1\">&nbsp;<\/div>\n<div class=\"line number103 index102 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Test<\/code><\/div>\n<div class=\"line number104 index103 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Clears all completed Todos\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number105 index104 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">clearsCompletedTodos() {<\/code><\/div>\n<div class=\"line number106 index105 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.createTodos(buyTheMilk, cleanupTheRoom);<\/code><\/div>\n<div class=\"line number107 index106 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.completeAllTodos();<\/code><\/div>\n<div class=\"line number108 index107 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.createTodo(readTheBook);<\/code><\/div>\n<div class=\"line number109 index108 alt2\">&nbsp;<\/div>\n<div class=\"line number110 index109 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.clearCompleted();<\/code><\/div>\n<div class=\"line number111 index110 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertEquals(<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">, todoMvc.getTodosLeft());<\/code><\/div>\n<div class=\"line number112 index111 alt1\">&nbsp;<\/div>\n<div class=\"line number113 index112 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.showCompleted();<\/code><\/div>\n<div class=\"line number114 index113 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertEquals(<\/code><code class=\"java value\">0<\/code><code class=\"java plain\">, todoMvc.getTodoCount());<\/code><\/div>\n<div class=\"line number115 index114 alt2\">&nbsp;<\/div>\n<div class=\"line number116 index115 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.showActive();<\/code><\/div>\n<div class=\"line number117 index116 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertEquals(<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">, todoMvc.getTodoCount());<\/code><\/div>\n<div class=\"line number118 index117 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number119 index118 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>More: If you are new to JUnit 5 you can read this introduction on my blog: <a href=\"https:\/\/blog.codeleak.pl\/2017\/10\/junit-5-basics.html\">https:\/\/blog.codeleak.pl\/2017\/10\/junit-5-basics.html<\/a>. There is also a newer version of this article written in polish: <a href=\"https:\/\/blog.qalabs.pl\/junit\/junit5-pierwsze-kroki\/\">https:\/\/blog.qalabs.pl\/junit\/junit5-pierwsze-kroki\/<\/a>.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>In the above test class we see that before each test the ChromeDriver is initialized and injected into the setup method (<code>@BeforeEach<\/code>) by the Selenium Jupiter extension (hence the <code>@ExtendWith(SeleniumExtension.class)<\/code>). The driver object will be be used to initialize the page object.<\/p>\n<p>There are different page objects modelling techniques and a lot depends on the characteristics of the project you are working on. You may want to use interfaces but it is not required. You may want to consider modelling on a bit lower level of abstraction, where the API is exposing more detailed methods like for example <code>setTodoInput(String value)<\/code>, <code>clickSubmitButton()<\/code>.<\/p>\n<h2 class=\"wp-block-heading\">Using Selenium built-in PageFactory to implement Page Object Pattern<\/h2>\n<p>As of now we have an interface that models the behaviour of the TodoMVC page and we have the failing tests that are using the API. The next step is to actually implement the page object. In order to do so, we will use Selenium built-in <code>PageFactory<\/code> class and its utilities.<\/p>\n<p><code>PageFactory<\/code> class simplifies implementation of Page Object pattern. The class provides mechanism to initialize any Page Object that declares <code>WebElement<\/code> or <code>List&lt;WebElement&gt;<\/code> fields annotated with <code>@FindBy<\/code> annotation. The <code>PageFactory<\/code> and all other annotations supporting implementation of Page Object pattern are available in the <code>org.openqa.selenium.support<\/code> package.<\/p>\n<p>The below <code>TodoMvcPage<\/code> class implements the interface we created earlier. It declares several fields annotated with <code>@FindBy<\/code> annotation. It also declares a constructor taking <code>WebDriver<\/code> parameter used by the factory to initialize the fields:<\/p>\n<div>\n<div id=\"highlighter_647453\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">001<\/div>\n<div class=\"line number2 index1 alt1\">002<\/div>\n<div class=\"line number3 index2 alt2\">003<\/div>\n<div class=\"line number4 index3 alt1\">004<\/div>\n<div class=\"line number5 index4 alt2\">005<\/div>\n<div class=\"line number6 index5 alt1\">006<\/div>\n<div class=\"line number7 index6 alt2\">007<\/div>\n<div class=\"line number8 index7 alt1\">008<\/div>\n<div class=\"line number9 index8 alt2\">009<\/div>\n<div class=\"line number10 index9 alt1\">010<\/div>\n<div class=\"line number11 index10 alt2\">011<\/div>\n<div class=\"line number12 index11 alt1\">012<\/div>\n<div class=\"line number13 index12 alt2\">013<\/div>\n<div class=\"line number14 index13 alt1\">014<\/div>\n<div class=\"line number15 index14 alt2\">015<\/div>\n<div class=\"line number16 index15 alt1\">016<\/div>\n<div class=\"line number17 index16 alt2\">017<\/div>\n<div class=\"line number18 index17 alt1\">018<\/div>\n<div class=\"line number19 index18 alt2\">019<\/div>\n<div class=\"line number20 index19 alt1\">020<\/div>\n<div class=\"line number21 index20 alt2\">021<\/div>\n<div class=\"line number22 index21 alt1\">022<\/div>\n<div class=\"line number23 index22 alt2\">023<\/div>\n<div class=\"line number24 index23 alt1\">024<\/div>\n<div class=\"line number25 index24 alt2\">025<\/div>\n<div class=\"line number26 index25 alt1\">026<\/div>\n<div class=\"line number27 index26 alt2\">027<\/div>\n<div class=\"line number28 index27 alt1\">028<\/div>\n<div class=\"line number29 index28 alt2\">029<\/div>\n<div class=\"line number30 index29 alt1\">030<\/div>\n<div class=\"line number31 index30 alt2\">031<\/div>\n<div class=\"line number32 index31 alt1\">032<\/div>\n<div class=\"line number33 index32 alt2\">033<\/div>\n<div class=\"line number34 index33 alt1\">034<\/div>\n<div class=\"line number35 index34 alt2\">035<\/div>\n<div class=\"line number36 index35 alt1\">036<\/div>\n<div class=\"line number37 index36 alt2\">037<\/div>\n<div class=\"line number38 index37 alt1\">038<\/div>\n<div class=\"line number39 index38 alt2\">039<\/div>\n<div class=\"line number40 index39 alt1\">040<\/div>\n<div class=\"line number41 index40 alt2\">041<\/div>\n<div class=\"line number42 index41 alt1\">042<\/div>\n<div class=\"line number43 index42 alt2\">043<\/div>\n<div class=\"line number44 index43 alt1\">044<\/div>\n<div class=\"line number45 index44 alt2\">045<\/div>\n<div class=\"line number46 index45 alt1\">046<\/div>\n<div class=\"line number47 index46 alt2\">047<\/div>\n<div class=\"line number48 index47 alt1\">048<\/div>\n<div class=\"line number49 index48 alt2\">049<\/div>\n<div class=\"line number50 index49 alt1\">050<\/div>\n<div class=\"line number51 index50 alt2\">051<\/div>\n<div class=\"line number52 index51 alt1\">052<\/div>\n<div class=\"line number53 index52 alt2\">053<\/div>\n<div class=\"line number54 index53 alt1\">054<\/div>\n<div class=\"line number55 index54 alt2\">055<\/div>\n<div class=\"line number56 index55 alt1\">056<\/div>\n<div class=\"line number57 index56 alt2\">057<\/div>\n<div class=\"line number58 index57 alt1\">058<\/div>\n<div class=\"line number59 index58 alt2\">059<\/div>\n<div class=\"line number60 index59 alt1\">060<\/div>\n<div class=\"line number61 index60 alt2\">061<\/div>\n<div class=\"line number62 index61 alt1\">062<\/div>\n<div class=\"line number63 index62 alt2\">063<\/div>\n<div class=\"line number64 index63 alt1\">064<\/div>\n<div class=\"line number65 index64 alt2\">065<\/div>\n<div class=\"line number66 index65 alt1\">066<\/div>\n<div class=\"line number67 index66 alt2\">067<\/div>\n<div class=\"line number68 index67 alt1\">068<\/div>\n<div class=\"line number69 index68 alt2\">069<\/div>\n<div class=\"line number70 index69 alt1\">070<\/div>\n<div class=\"line number71 index70 alt2\">071<\/div>\n<div class=\"line number72 index71 alt1\">072<\/div>\n<div class=\"line number73 index72 alt2\">073<\/div>\n<div class=\"line number74 index73 alt1\">074<\/div>\n<div class=\"line number75 index74 alt2\">075<\/div>\n<div class=\"line number76 index75 alt1\">076<\/div>\n<div class=\"line number77 index76 alt2\">077<\/div>\n<div class=\"line number78 index77 alt1\">078<\/div>\n<div class=\"line number79 index78 alt2\">079<\/div>\n<div class=\"line number80 index79 alt1\">080<\/div>\n<div class=\"line number81 index80 alt2\">081<\/div>\n<div class=\"line number82 index81 alt1\">082<\/div>\n<div class=\"line number83 index82 alt2\">083<\/div>\n<div class=\"line number84 index83 alt1\">084<\/div>\n<div class=\"line number85 index84 alt2\">085<\/div>\n<div class=\"line number86 index85 alt1\">086<\/div>\n<div class=\"line number87 index86 alt2\">087<\/div>\n<div class=\"line number88 index87 alt1\">088<\/div>\n<div class=\"line number89 index88 alt2\">089<\/div>\n<div class=\"line number90 index89 alt1\">090<\/div>\n<div class=\"line number91 index90 alt2\">091<\/div>\n<div class=\"line number92 index91 alt1\">092<\/div>\n<div class=\"line number93 index92 alt2\">093<\/div>\n<div class=\"line number94 index93 alt1\">094<\/div>\n<div class=\"line number95 index94 alt2\">095<\/div>\n<div class=\"line number96 index95 alt1\">096<\/div>\n<div class=\"line number97 index96 alt2\">097<\/div>\n<div class=\"line number98 index97 alt1\">098<\/div>\n<div class=\"line number99 index98 alt2\">099<\/div>\n<div class=\"line number100 index99 alt1\">100<\/div>\n<div class=\"line number101 index100 alt2\">101<\/div>\n<div class=\"line number102 index101 alt1\">102<\/div>\n<div class=\"line number103 index102 alt2\">103<\/div>\n<div class=\"line number104 index103 alt1\">104<\/div>\n<div class=\"line number105 index104 alt2\">105<\/div>\n<div class=\"line number106 index105 alt1\">106<\/div>\n<div class=\"line number107 index106 alt2\">107<\/div>\n<div class=\"line number108 index107 alt1\">108<\/div>\n<div class=\"line number109 index108 alt2\">109<\/div>\n<div class=\"line number110 index109 alt1\">110<\/div>\n<div class=\"line number111 index110 alt2\">111<\/div>\n<div class=\"line number112 index111 alt1\">112<\/div>\n<div class=\"line number113 index112 alt2\">113<\/div>\n<div class=\"line number114 index113 alt1\">114<\/div>\n<div class=\"line number115 index114 alt2\">115<\/div>\n<div class=\"line number116 index115 alt1\">116<\/div>\n<div class=\"line number117 index116 alt2\">117<\/div>\n<div class=\"line number118 index117 alt1\">118<\/div>\n<div class=\"line number119 index118 alt2\">119<\/div>\n<div class=\"line number120 index119 alt1\">120<\/div>\n<div class=\"line number121 index120 alt2\">121<\/div>\n<div class=\"line number122 index121 alt1\">122<\/div>\n<div class=\"line number123 index122 alt2\">123<\/div>\n<div class=\"line number124 index123 alt1\">124<\/div>\n<div class=\"line number125 index124 alt2\">125<\/div>\n<div class=\"line number126 index125 alt1\">126<\/div>\n<div class=\"line number127 index126 alt2\">127<\/div>\n<div class=\"line number128 index127 alt1\">128<\/div>\n<div class=\"line number129 index128 alt2\">129<\/div>\n<div class=\"line number130 index129 alt1\">130<\/div>\n<div class=\"line number131 index130 alt2\">131<\/div>\n<div class=\"line number132 index131 alt1\">132<\/div>\n<div class=\"line number133 index132 alt2\">133<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">TodoMvcPage <\/code><code class=\"java keyword\">implements<\/code> <code class=\"java plain\">TodoMvc {<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">final<\/code> <code class=\"java plain\">WebDriver driver;<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">final<\/code> <code class=\"java plain\">By byTodoEdit = By.cssSelector(<\/code><code class=\"java string\">\"input.edit\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">final<\/code> <code class=\"java plain\">By byTodoRemove = By.cssSelector(<\/code><code class=\"java string\">\"button.destroy\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">final<\/code> <code class=\"java plain\">By byTodoComplete = By.cssSelector(<\/code><code class=\"java string\">\"input.toggle\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(className = <\/code><code class=\"java string\">\"new-todo\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">WebElement newTodoInput;<\/code><\/div>\n<div class=\"line number11 index10 alt2\">&nbsp;<\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(css = <\/code><code class=\"java string\">\".todo-count &gt; strong\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">WebElement todoCount;<\/code><\/div>\n<div class=\"line number14 index13 alt1\">&nbsp;<\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(css = <\/code><code class=\"java string\">\".todo-list li\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">List&lt;WebElement&gt; todos;<\/code><\/div>\n<div class=\"line number17 index16 alt2\">&nbsp;<\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(className = <\/code><code class=\"java string\">\"toggle-all\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">WebElement toggleAll;<\/code><\/div>\n<div class=\"line number20 index19 alt1\">&nbsp;<\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(css = <\/code><code class=\"java string\">\"a[href='#\/active']\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">WebElement showActive;<\/code><\/div>\n<div class=\"line number23 index22 alt2\">&nbsp;<\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(css = <\/code><code class=\"java string\">\"a[href='#\/completed']\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">WebElement showCompleted;<\/code><\/div>\n<div class=\"line number26 index25 alt1\">&nbsp;<\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(className = <\/code><code class=\"java string\">\"clear-completed\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">WebElement clearCompleted;<\/code><\/div>\n<div class=\"line number29 index28 alt2\">&nbsp;<\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java plain\">TodoMvcPage(WebDriver driver) {<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.driver = driver;<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number33 index32 alt2\">&nbsp;<\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Override<\/code><\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">navigateTo() {<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">driver.get(<\/code><code class=\"java string\">\"<a href=\"http:\/\/todomvc.com\/examples\/vanillajs\">http:\/\/todomvc.com\/examples\/vanillajs<\/a>\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number37 index36 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number38 index37 alt1\">&nbsp;<\/div>\n<div class=\"line number39 index38 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">createTodo(String todoName) {<\/code><\/div>\n<div class=\"line number40 index39 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">newTodoInput.sendKeys(todoName + Keys.ENTER);<\/code><\/div>\n<div class=\"line number41 index40 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number42 index41 alt1\">&nbsp;<\/div>\n<div class=\"line number43 index42 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">createTodos(String... todoNames) {<\/code><\/div>\n<div class=\"line number44 index43 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">for<\/code> <code class=\"java plain\">(String todoName : todoNames) {<\/code><\/div>\n<div class=\"line number45 index44 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">createTodo(todoName);<\/code><\/div>\n<div class=\"line number46 index45 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number47 index46 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number48 index47 alt1\">&nbsp;<\/div>\n<div class=\"line number49 index48 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">int<\/code> <code class=\"java plain\">getTodosLeft() {<\/code><\/div>\n<div class=\"line number50 index49 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">Integer.parseInt(todoCount.getText());<\/code><\/div>\n<div class=\"line number51 index50 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number52 index51 alt1\">&nbsp;<\/div>\n<div class=\"line number53 index52 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">boolean<\/code> <code class=\"java plain\">todoExists(String todoName) {<\/code><\/div>\n<div class=\"line number54 index53 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">getTodos().stream().anyMatch(todoName::equals);<\/code><\/div>\n<div class=\"line number55 index54 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number56 index55 alt1\">&nbsp;<\/div>\n<div class=\"line number57 index56 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">int<\/code> <code class=\"java plain\">getTodoCount() {<\/code><\/div>\n<div class=\"line number58 index57 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">todos.size();<\/code><\/div>\n<div class=\"line number59 index58 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number60 index59 alt1\">&nbsp;<\/div>\n<div class=\"line number61 index60 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java plain\">List&lt;String&gt; getTodos() {<\/code><\/div>\n<div class=\"line number62 index61 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">todos<\/code><\/div>\n<div class=\"line number63 index62 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.stream()<\/code><\/div>\n<div class=\"line number64 index63 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.map(WebElement::getText)<\/code><\/div>\n<div class=\"line number65 index64 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.collect(Collectors.toList());<\/code><\/div>\n<div class=\"line number66 index65 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number67 index66 alt2\">&nbsp;<\/div>\n<div class=\"line number68 index67 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">renameTodo(String todoName, String newTodoName) {<\/code><\/div>\n<div class=\"line number69 index68 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">WebElement todoToEdit = getTodoElementByName(todoName);<\/code><\/div>\n<div class=\"line number70 index69 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">doubleClick(todoToEdit);<\/code><\/div>\n<div class=\"line number71 index70 alt2\">&nbsp;<\/div>\n<div class=\"line number72 index71 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">WebElement todoEditInput = find(byTodoEdit, todoToEdit);<\/code><\/div>\n<div class=\"line number73 index72 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">executeScript(<\/code><code class=\"java string\">\"arguments[0].value = ''\"<\/code><code class=\"java plain\">, todoEditInput);<\/code><\/div>\n<div class=\"line number74 index73 alt1\">&nbsp;<\/div>\n<div class=\"line number75 index74 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoEditInput.sendKeys(newTodoName + Keys.ENTER);<\/code><\/div>\n<div class=\"line number76 index75 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number77 index76 alt2\">&nbsp;<\/div>\n<div class=\"line number78 index77 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">removeTodo(String todoName) {<\/code><\/div>\n<div class=\"line number79 index78 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">WebElement todoToRemove = getTodoElementByName(todoName);<\/code><\/div>\n<div class=\"line number80 index79 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">moveToElement(todoToRemove);<\/code><\/div>\n<div class=\"line number81 index80 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">click(byTodoRemove, todoToRemove);<\/code><\/div>\n<div class=\"line number82 index81 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number83 index82 alt2\">&nbsp;<\/div>\n<div class=\"line number84 index83 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">completeTodo(String todoName) {<\/code><\/div>\n<div class=\"line number85 index84 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">WebElement todoToComplete = getTodoElementByName(todoName);<\/code><\/div>\n<div class=\"line number86 index85 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">click(byTodoComplete, todoToComplete);<\/code><\/div>\n<div class=\"line number87 index86 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number88 index87 alt1\">&nbsp;<\/div>\n<div class=\"line number89 index88 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">completeAllTodos() {<\/code><\/div>\n<div class=\"line number90 index89 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">toggleAll.click();<\/code><\/div>\n<div class=\"line number91 index90 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number92 index91 alt1\">&nbsp;<\/div>\n<div class=\"line number93 index92 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">showActive() {<\/code><\/div>\n<div class=\"line number94 index93 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">showActive.click();<\/code><\/div>\n<div class=\"line number95 index94 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number96 index95 alt1\">&nbsp;<\/div>\n<div class=\"line number97 index96 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">showCompleted() {<\/code><\/div>\n<div class=\"line number98 index97 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">showCompleted.click();<\/code><\/div>\n<div class=\"line number99 index98 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number100 index99 alt1\">&nbsp;<\/div>\n<div class=\"line number101 index100 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">clearCompleted() {<\/code><\/div>\n<div class=\"line number102 index101 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">clearCompleted.click();<\/code><\/div>\n<div class=\"line number103 index102 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number104 index103 alt1\">&nbsp;<\/div>\n<div class=\"line number105 index104 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">WebElement getTodoElementByName(String todoName) {<\/code><\/div>\n<div class=\"line number106 index105 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">todos<\/code><\/div>\n<div class=\"line number107 index106 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.stream()<\/code><\/div>\n<div class=\"line number108 index107 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.filter(el -&gt; todoName.equals(el.getText()))<\/code><\/div>\n<div class=\"line number109 index108 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.findFirst()<\/code><\/div>\n<div class=\"line number110 index109 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.orElseThrow(() -&gt; <\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">RuntimeException(<\/code><code class=\"java string\">\"Todo with name \"<\/code> <code class=\"java plain\">+ todoName + <\/code><code class=\"java string\">\" not found!\"<\/code><code class=\"java plain\">));<\/code><\/div>\n<div class=\"line number111 index110 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number112 index111 alt1\">&nbsp;<\/div>\n<div class=\"line number113 index112 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">WebElement find(By by, SearchContext searchContext) {<\/code><\/div>\n<div class=\"line number114 index113 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">searchContext.findElement(by);<\/code><\/div>\n<div class=\"line number115 index114 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number116 index115 alt1\">&nbsp;<\/div>\n<div class=\"line number117 index116 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">click(By by, SearchContext searchContext) {<\/code><\/div>\n<div class=\"line number118 index117 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">WebElement element = searchContext.findElement(by);<\/code><\/div>\n<div class=\"line number119 index118 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">element.click();<\/code><\/div>\n<div class=\"line number120 index119 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number121 index120 alt2\">&nbsp;<\/div>\n<div class=\"line number122 index121 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">moveToElement(WebElement element) {<\/code><\/div>\n<div class=\"line number123 index122 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">Actions(driver).moveToElement(element).perform();<\/code><\/div>\n<div class=\"line number124 index123 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number125 index124 alt2\">&nbsp;<\/div>\n<div class=\"line number126 index125 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">doubleClick(WebElement element) {<\/code><\/div>\n<div class=\"line number127 index126 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">Actions(driver).doubleClick(element).perform();<\/code><\/div>\n<div class=\"line number128 index127 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number129 index128 alt2\">&nbsp;<\/div>\n<div class=\"line number130 index129 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">executeScript(String script, Object... arguments) {<\/code><\/div>\n<div class=\"line number131 index130 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">((JavascriptExecutor) driver).executeScript(script, arguments);<\/code><\/div>\n<div class=\"line number132 index131 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number133 index132 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><code>@FindBy<\/code> is not the only annotation used to lookup elements in a Page Object. There are also <code>@FindBys<\/code> and <code>@FindAll<\/code>.<\/p>\n<h3 class=\"wp-block-heading\"><code>@FindBys<\/code><\/h3>\n<p><code>@FindBys<\/code> annotation is used to mark a field on a Page Object to indicate that lookup should use a series of <code>@FindBy<\/code> tags. In this example, Selenium will search for the element with <code>class = \"button\"<\/code> that is <strong>inside<\/strong> the element with <code>id = \"menu\"<\/code>:<\/p>\n<div>\n<div id=\"highlighter_240243\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java color1\">@FindBys<\/code><code class=\"java plain\">({<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(id = <\/code><code class=\"java string\">\"menu\"<\/code><code class=\"java plain\">),<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(className = <\/code><code class=\"java string\">\"button\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">})<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java keyword\">private<\/code> <code class=\"java plain\">WebElement element;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3 class=\"wp-block-heading\"><code>@FindAll<\/code><\/h3>\n<p><code>@FindAll<\/code> annotation is used to mark a field on a Page Object to indicate that lookup should use a series of @FindBy tags. In this example, Selenium will search for all the elements with <code>class = \"button\"<\/code> <strong>and<\/strong> all the elements with <code>id = \"menu\"<\/code>. Elements are not guaranteed to be in document order:<\/p>\n<div>\n<div id=\"highlighter_262627\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java color1\">@FindAll<\/code><code class=\"java plain\">({<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(id = <\/code><code class=\"java string\">\"menu\"<\/code><code class=\"java plain\">),<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(className = <\/code><code class=\"java string\">\"button\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">})<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java keyword\">private<\/code> <code class=\"java plain\">List&lt;WebElement&gt; webElements;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2 class=\"wp-block-heading\"><code>PageFactory<\/code> &#8211; initialize the Page object<\/h2>\n<p><code>PageFactory<\/code> provides several static methods to initialize Page Objects. In our test, in <code>beforeEach()<\/code> method we need to initialize <code>TodoMvcPage<\/code> object:<\/p>\n<div>\n<div id=\"highlighter_347759\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java color1\">@BeforeEach<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">void<\/code> <code class=\"java plain\">beforeEach(ChromeDriver driver) {<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.todoMvc = PageFactory.initElements(driver, TodoMvcPage.<\/code><code class=\"java keyword\">class<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.todoMvc.navigateTo();<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The <code>PageFactory<\/code> initializes the object using reflection and then it initializes all the <code>WebElement<\/code> or <code>List&lt;WebElement&gt;<\/code> fields marked with <code>@FindBy<\/code> annotation (no lookup is done at this momment, fields are proxied). Using this method requires that the Page Object has a single parameter constructor accepting <code>WebDriver<\/code> object.<\/p>\n<h2 class=\"wp-block-heading\">Locating elements<\/h2>\n<p>So when the elements are located? The lookup takes place each time the field is accessed. So the for example, when we execute the code: <code>newTodoInput.sendKeys(todoName + Keys.ENTER);<\/code> in <code>createTodo()<\/code> method the actual instruction that is executed is: <code>driver.findElement(By.className('new-todo')).sendKeys(todoName + Keys.ENTER)<\/code>. We can expect that potential exception that element was not found is thrown not during the object initialization but during the first element lookup.<\/p>\n<p>Selenium uses <a href=\"https:\/\/en.wikipedia.org\/wiki\/Proxy_pattern#Java\">Proxy<\/a> pattern to achieve described behaviour.<\/p>\n<h2 class=\"wp-block-heading\"><code>@CacheLookup<\/code><\/h2>\n<p>There are situations when there is no need to lookup for elements each time the annotated field is accessed. In such a case we can use <code>@CacheLookup<\/code> annotation. In our example the input field does not change on the page so its lookup can be cached:<\/p>\n<div>\n<div id=\"highlighter_222719\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java color1\">@FindBy<\/code><code class=\"java plain\">(className = <\/code><code class=\"java string\">\"new-todo\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java color1\">@CacheLookup<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">private<\/code> <code class=\"java plain\">WebElement newTodoInput;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Running the tests<\/h2>\n<p>It is high time to execute the tests. It can be done either from IDE or using the terminal:<\/p>\n<div>\n<div id=\"highlighter_852800\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">.\/gradlew clean test --tests *TodoMvcTests<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The build was successful with all tests passed:<\/p>\n<div>\n<div id=\"highlighter_866060\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">&gt; Task :test<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; editsTodo() PASSED<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; togglesTodoCompleted() PASSED<\/code><\/div>\n<div class=\"line number6 index5 alt1\">&nbsp;<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; createsTodo() PASSED<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; removesTodo() PASSED<\/code><\/div>\n<div class=\"line number10 index9 alt1\">&nbsp;<\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; togglesAllTodosCompleted() PASSED<\/code><\/div>\n<div class=\"line number12 index11 alt1\">&nbsp;<\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; createsTodosWithSameName() PASSED<\/code><\/div>\n<div class=\"line number14 index13 alt1\">&nbsp;<\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; clearsCompletedTodos() PASSED<\/code><\/div>\n<div class=\"line number16 index15 alt1\">&nbsp;<\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java plain\">BUILD SUCCESSFUL in 27s<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java value\">3<\/code> <code class=\"java plain\">actionable tasks: <\/code><code class=\"java value\">3<\/code> <code class=\"java plain\">executed<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Next steps<\/h2>\n<p>In the next part of this tutorial you will learn how to improve the project configuration. You will learn about executing tests in parallel, tests execution order, parameterized tests, AssertJ and more.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Java Code Geeks with permission by Rafal Borowiec, partner at our <a href=\"\/\/www.javacodegeeks.com\/join-us\/jcg\/\" target=\"_blank\" rel=\"noopener noreferrer\">JCG program<\/a>. See the original article here: <a href=\"https:\/\/blog.codeleak.pl\/2019\/10\/junit-5-and-selenium-using-selenium.html\" target=\"_blank\" rel=\"noopener noreferrer\">JUnit 5 and Selenium &#8211; Using Selenium built-in `PageFactory` to implement Page Object Pattern<\/a><\/p>\n<p>Opinions expressed by Java Code Geeks contributors are their own.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Selenium is a set of tools and libraries supporting browser automation and it is mainly used for web applications testing. One of the Selenium\u2019s components is a Selenium WebDriver that provides client library, the JSON wire protocol (protocol to communicate with the browser drivers) and browser drivers. One of the main advantages of Selenium WebDriver &hellip;<\/p>\n","protected":false},"author":516,"featured_media":176,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[274,287],"class_list":["post-99134","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-junit","tag-selenium"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>JUnit 5 and Selenium - Using Selenium built-in `PageFactory` to implement Page Object Pattern - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn about PageFactory? Check our article explaining how to use Selenium built-in `PageFactory` to implement Page Object Pattern\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JUnit 5 and Selenium - Using Selenium built-in `PageFactory` to implement Page Object Pattern - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about PageFactory? Check our article explaining how to use Selenium built-in `PageFactory` to implement Page Object Pattern\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2019-10-11T04:00:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Rafal Borowiec\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/kolorobot\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rafal Borowiec\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html\"},\"author\":{\"name\":\"Rafal Borowiec\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/b1a0b2657d5dd2459806446ac66d2d52\"},\"headline\":\"JUnit 5 and Selenium &#8211; Using Selenium built-in `PageFactory` to implement Page Object Pattern\",\"datePublished\":\"2019-10-11T04:00:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html\"},\"wordCount\":1262,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/junit-logo-e1426444701180.jpg\",\"keywords\":[\"JUnit\",\"Selenium\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html\",\"name\":\"JUnit 5 and Selenium - Using Selenium built-in `PageFactory` to implement Page Object Pattern - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/junit-logo-e1426444701180.jpg\",\"datePublished\":\"2019-10-11T04:00:09+00:00\",\"description\":\"Interested to learn about PageFactory? Check our article explaining how to use Selenium built-in `PageFactory` to implement Page Object Pattern\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/junit-logo-e1426444701180.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/junit-logo-e1426444701180.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/using-pagefactory-implement-page-object-pattern.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"JUnit 5 and Selenium &#8211; Using Selenium built-in `PageFactory` to implement Page Object Pattern\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/b1a0b2657d5dd2459806446ac66d2d52\",\"name\":\"Rafal Borowiec\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g\",\"caption\":\"Rafal Borowiec\"},\"description\":\"Software developer, Team Leader, Agile practitioner, occasional blogger, lecturer. Open Source enthusiast, quality oriented and open-minded.\",\"sameAs\":[\"http:\\\/\\\/blog.codeleak.pl\\\/\",\"http:\\\/\\\/pl.linkedin.com\\\/in\\\/borowiec\\\/\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/twitter.com\\\/kolorobot\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/rafal-borowiec\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"JUnit 5 and Selenium - Using Selenium built-in `PageFactory` to implement Page Object Pattern - Java Code Geeks","description":"Interested to learn about PageFactory? Check our article explaining how to use Selenium built-in `PageFactory` to implement Page Object Pattern","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html","og_locale":"en_US","og_type":"article","og_title":"JUnit 5 and Selenium - Using Selenium built-in `PageFactory` to implement Page Object Pattern - Java Code Geeks","og_description":"Interested to learn about PageFactory? Check our article explaining how to use Selenium built-in `PageFactory` to implement Page Object Pattern","og_url":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2019-10-11T04:00:09+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.jpg","type":"image\/jpeg"}],"author":"Rafal Borowiec","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/kolorobot","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Rafal Borowiec","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html"},"author":{"name":"Rafal Borowiec","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/b1a0b2657d5dd2459806446ac66d2d52"},"headline":"JUnit 5 and Selenium &#8211; Using Selenium built-in `PageFactory` to implement Page Object Pattern","datePublished":"2019-10-11T04:00:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html"},"wordCount":1262,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.jpg","keywords":["JUnit","Selenium"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html","url":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html","name":"JUnit 5 and Selenium - Using Selenium built-in `PageFactory` to implement Page Object Pattern - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.jpg","datePublished":"2019-10-11T04:00:09+00:00","description":"Interested to learn about PageFactory? Check our article explaining how to use Selenium built-in `PageFactory` to implement Page Object Pattern","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"JUnit 5 and Selenium &#8211; Using Selenium built-in `PageFactory` to implement Page Object Pattern"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/b1a0b2657d5dd2459806446ac66d2d52","name":"Rafal Borowiec","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g","caption":"Rafal Borowiec"},"description":"Software developer, Team Leader, Agile practitioner, occasional blogger, lecturer. Open Source enthusiast, quality oriented and open-minded.","sameAs":["http:\/\/blog.codeleak.pl\/","http:\/\/pl.linkedin.com\/in\/borowiec\/","https:\/\/x.com\/https:\/\/twitter.com\/kolorobot"],"url":"https:\/\/www.javacodegeeks.com\/author\/rafal-borowiec"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/99134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/516"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=99134"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/99134\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/176"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=99134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=99134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=99134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}