<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Test_Automation_with_Selenium</id>
	<title>Test Automation with Selenium - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Test_Automation_with_Selenium"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Test_Automation_with_Selenium&amp;action=history"/>
	<updated>2026-05-13T01:44:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=Test_Automation_with_Selenium&amp;diff=20028&amp;oldid=prev</id>
		<title>Łukasz Walec: /* Selenium Grid */</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Test_Automation_with_Selenium&amp;diff=20028&amp;oldid=prev"/>
		<updated>2014-07-01T13:35:01Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Selenium Grid&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Locators ==&lt;br /&gt;
&lt;br /&gt;
Source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;header-container&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;header&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;logotype&amp;quot;&amp;gt;Logotype&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Locators for the element containing text Logotype:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
id=logotype&lt;br /&gt;
&lt;br /&gt;
css=#logotype&lt;br /&gt;
css=#header &amp;gt; div&lt;br /&gt;
css=#header-container &amp;gt; div &amp;gt; div&lt;br /&gt;
css=[id=&amp;#039;logotype&amp;#039;]&lt;br /&gt;
css=div[id*=&amp;#039;ogo&amp;#039;]&lt;br /&gt;
css=div[id^=&amp;#039;logo&amp;#039;]&lt;br /&gt;
css=div[id$=&amp;#039;type&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
xpath=//*[@id=&amp;#039;logotype&amp;#039;]&lt;br /&gt;
xpath=//*[@id=&amp;#039;header&amp;#039;]/div&lt;br /&gt;
xpath=//*[@id=&amp;#039;header-container&amp;#039;]/div/div&lt;br /&gt;
xpath=//*[@id=&amp;#039;header-container&amp;#039;]//div[@id=&amp;#039;logotype&amp;#039;]&lt;br /&gt;
xpath=//div[contains(@id, &amp;#039;ogo&amp;#039;)]&lt;br /&gt;
xpath=//div[starts-with(@id, &amp;#039;logo&amp;#039;)]&lt;br /&gt;
xpath=//div[ends-with(@id, &amp;#039;type&amp;#039;)]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;navigation-container&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;ul&amp;gt;&lt;br /&gt;
			&amp;lt;li&amp;gt;&lt;br /&gt;
				&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;Menu item 1&amp;lt;/a&amp;gt;&lt;br /&gt;
			&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;li&amp;gt;&lt;br /&gt;
				&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;Menu item 2&amp;lt;/a&amp;gt;&lt;br /&gt;
			&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;li&amp;gt;&lt;br /&gt;
				&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;Menu item 3&amp;lt;/a&amp;gt;&lt;br /&gt;
			&amp;lt;/li&amp;gt;&lt;br /&gt;
			&amp;lt;li&amp;gt;&lt;br /&gt;
				&amp;lt;a href=&amp;quot;index.html&amp;quot;&amp;gt;Menu item 4&amp;lt;/a&amp;gt;&lt;br /&gt;
			&amp;lt;/li&amp;gt;&lt;br /&gt;
		&amp;lt;/ul&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Locators for the element containing text Menu item 3:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
css=#navigation &amp;gt; ul &amp;gt; li:nth-of-type(3) &amp;gt; a&lt;br /&gt;
css=#navigation &amp;gt; ul &amp;gt; li:nth-child(3) &amp;gt; a&lt;br /&gt;
css=#navigation li:nth-child(3) &amp;gt; a&lt;br /&gt;
&lt;br /&gt;
xpath=//*[@id=&amp;#039;navigation&amp;#039;]/ul/li[3]/a&lt;br /&gt;
xpath=//*[@id=&amp;#039;navigation&amp;#039;]/*/li[3]/a&lt;br /&gt;
xpath=//*[@id=&amp;#039;navigation&amp;#039;]//li[3]/a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;main&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div id=&amp;quot;hero&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;h1&amp;gt;Page title&amp;lt;/h1&amp;gt;&lt;br /&gt;
			&amp;lt;p&amp;gt;Element 1. I aim to create simple yet engaging Web sites that&lt;br /&gt;
			enable users to easily achieve their objective. Read on to find out&lt;br /&gt;
			more about how I work, or get in touch if you&amp;#039;ve got a project&lt;br /&gt;
			you’d like to discuss or you&amp;#039;d just like to say hello.&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Locators for the element containing text Page title:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
css=h1&lt;br /&gt;
css=#hero &amp;gt; h1&lt;br /&gt;
&lt;br /&gt;
xpath=//h1&lt;br /&gt;
xpath=//*[@id=&amp;#039;hero&amp;#039;]/h1&lt;br /&gt;
xpath=//*[text()=&amp;#039;Page title&amp;#039;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Locators for the element containing text Element 1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
css=#hero &amp;gt; p&lt;br /&gt;
css=h1 + p&lt;br /&gt;
&lt;br /&gt;
xpath=//p[starts-with(text(), &amp;#039;Element 1&amp;#039;)]&lt;br /&gt;
xpath=//h1/following-sibling::p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;feature-container&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;feature&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;h3&amp;gt;Service 1&amp;lt;/h3&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Element 2. Lorem ipsum dolor sit amet erat.&lt;br /&gt;
			Fusce iaculis, turpis id enim. Mauris pretium, ipsum feugiat&lt;br /&gt;
			ultrices tortor et malesuada velit pretium.&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;div&amp;gt;&lt;br /&gt;
				&amp;lt;img src=&amp;quot;icon-check.svg&amp;quot; width=&amp;quot;20&amp;quot; height=&amp;quot;16&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;h3&amp;gt;Service 2&amp;lt;/h3&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Element 3. Nunc volutpat tempus malesuada.&lt;br /&gt;
			Donec consectetuer lobortis eu, vulputate fringilla.&lt;br /&gt;
			Morbi nisl mollis nunc volutpat id, libero.&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;div&amp;gt;&lt;br /&gt;
				&amp;lt;img src=&amp;quot;icon-check.svg&amp;quot; width=&amp;quot;20&amp;quot; height=&amp;quot;16&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;h3&amp;gt;Service 3&amp;lt;/h3&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Element 4. Aliquam erat ac ipsum. Integer&lt;br /&gt;
			aliquam purus. Quisque lorem tortor fringilla sed, vestibulum&lt;br /&gt;
			id, eleifend justo vel bibendum sapien.&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;div&amp;gt;&lt;br /&gt;
				&amp;lt;img src=&amp;quot;icon-check.svg&amp;quot; width=&amp;quot;20&amp;quot; height=&amp;quot;16&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Locators for the element containing text Service 3:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
css=#feature &amp;gt; .box:nth-child(3) &amp;gt; h3&lt;br /&gt;
css=#feature &amp;gt; .box:last-child &amp;gt; h3&lt;br /&gt;
css=.box:nth-child(3) &amp;gt; h3&lt;br /&gt;
&lt;br /&gt;
xpath=//*[@id=&amp;#039;feature&amp;#039;]/*[3][@class=&amp;#039;box&amp;#039;]/h3&lt;br /&gt;
xpath=//*[@id=&amp;#039;feature&amp;#039;]/*[@class=&amp;#039;box&amp;#039;][last()]/h3&lt;br /&gt;
xpath=//*[@id=&amp;#039;feature&amp;#039;]/*[@class=&amp;#039;box&amp;#039;]/following-sibling::*[2]&lt;br /&gt;
xpath=//*[3][@class=&amp;#039;box&amp;#039;]/h3&lt;br /&gt;
xpath=//*[@id=&amp;#039;feature&amp;#039;]//*[text()=&amp;#039;Service 3&amp;#039;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Locators for the element containing text Element 3:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
css=#feature &amp;gt; .box:nth-child(2) &amp;gt; .note&lt;br /&gt;
&lt;br /&gt;
xpath=//*[@id=&amp;#039;feature&amp;#039;]/*[2]/*[@class=&amp;#039;note&amp;#039;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;newsflash-container&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;newsflash&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;h2&amp;gt;Newsflash&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Element 5. Donec consectetuer lobortis eu, vulputate fringilla.&lt;br /&gt;
		Morbi nisl mollis nunc volutpat id, libero.&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;h3&amp;gt;News 1&amp;lt;/h3&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Element 6. Lorem ipsum dolor sit amet erat.&lt;br /&gt;
		Fusce iaculis, turpis id enim. Mauris pretium, ipsum feugiat&lt;br /&gt;
		ultrices tortor et malesuada velit pretium.&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;h3&amp;gt;News 2&amp;lt;/h3&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Element 7. Nunc volutpat tempus malesuada.&lt;br /&gt;
		Donec consectetuer lobortis eu, vulputate fringilla. Morbi nisl&lt;br /&gt;
		mollis nunc volutpat id, libero.&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;h3&amp;gt;News 3&amp;lt;/h3&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Element 8. Aliquam erat ac ipsum. Integer&lt;br /&gt;
		aliquam purus. Quisque lorem tortor fringilla sed, vestibulum&lt;br /&gt;
		id, eleifend justo vel bibendum sapien.&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Locators for the element containing text Element 7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
css=#newsflash .note:nth-of-type(2)&lt;br /&gt;
css=#newsflash h3:nth-of-type(2) + div&lt;br /&gt;
&lt;br /&gt;
xpath=//*[@id=&amp;#039;newsflash&amp;#039;]/div[2][@class=&amp;#039;note&amp;#039;]&lt;br /&gt;
xpath=//*[@id=&amp;#039;newsflash&amp;#039;]/h3[2]/following-sibling::div&lt;br /&gt;
xpath=//*[@class=&amp;#039;note&amp;#039;][contains(text(), &amp;#039;Element 7&amp;#039;)]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;footer-container&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;grid-9&amp;quot;&amp;gt;Footnote 1. Donec consectetuer lobortis eu,&lt;br /&gt;
		vulputate fringilla. Morbi nisl mollis nunc volutpat id, libero.&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;grid-3 text-right&amp;quot;&amp;gt;Footnote 2&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Locators for the element containing text Footnote 2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
css=#footer &amp;gt; div.grid-3&lt;br /&gt;
css=#footer &amp;gt; div:nth-child(2)&lt;br /&gt;
css=#footer &amp;gt; div + div&lt;br /&gt;
&lt;br /&gt;
xpath=//*[@id=&amp;#039;footer&amp;#039;]/div[@class=&amp;#039;grid-3 text-right&amp;#039;]&lt;br /&gt;
xpath=//*[@id=&amp;#039;footer&amp;#039;]/div[2]&lt;br /&gt;
xpath=//*[@id=&amp;#039;footer&amp;#039;]/*[2]&lt;br /&gt;
xpath=//*[@id=&amp;#039;footer&amp;#039;]/div/following-sibling::div&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote WebDriver ==&lt;br /&gt;
&lt;br /&gt;
WebDriver can use local or external Selenium server, which we can run with the command:&lt;br /&gt;
&lt;br /&gt;
 java -jar selenium-server-standalone-2.42.2.jar&lt;br /&gt;
&lt;br /&gt;
It will be required to add the appropriate classes in the source code:&lt;br /&gt;
&lt;br /&gt;
 import java.net.URL;&lt;br /&gt;
 import org.openqa.selenium.remote.DesiredCapabilities;&lt;br /&gt;
 import org.openqa.selenium.remote.RemoteWebDriver;&lt;br /&gt;
&lt;br /&gt;
Working with Selenium server also requires adding:&lt;br /&gt;
&lt;br /&gt;
 DesiredCapabilities capability = DesiredCapabilities.firefox();&lt;br /&gt;
 capability.setBrowserName(&amp;quot;firefox&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Present in the code, default Firefox driver:&lt;br /&gt;
&lt;br /&gt;
 driver = new FirefoxDriver();&lt;br /&gt;
&lt;br /&gt;
Is replaced by the definition of an external Selenium server:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;driver = new RemoteWebDriver(new URL(&amp;quot;http://localhost:4444/wd/hub&amp;quot;), capability);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Support for other browsers is implemented using drivers developed independently of the Selenium project. You can attach them to Selenium server using command:&lt;br /&gt;
&lt;br /&gt;
 java -jar selenium-server-standalone-2.42.2.jar -Dwebdriver.chrome.driver=chromedriver.exe -Dwebdriver.ie.driver=IEDriverServer.exe&lt;br /&gt;
&lt;br /&gt;
Running tests in other browsers is done by selecting the driver. For Chrome browser:&lt;br /&gt;
&lt;br /&gt;
 capability.setBrowserName(&amp;quot;chrome&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Similarly for Internet Explorer browser:&lt;br /&gt;
&lt;br /&gt;
 capability.setBrowserName(&amp;quot;internet explorer&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
You can also specify the version of the browser and the platform on which you want to run the test:&lt;br /&gt;
&lt;br /&gt;
 capability.setBrowserName(&amp;quot;firefox&amp;quot;);&lt;br /&gt;
 capability.setVersion(&amp;quot;25.0.1&amp;quot;);&lt;br /&gt;
 capability.setPlatform(Platform.WINDOWS);&lt;br /&gt;
&lt;br /&gt;
Selenium Server or the Node within the Selenium Grid has to be configured first.&lt;br /&gt;
&lt;br /&gt;
== Selenium Grid ==&lt;br /&gt;
&lt;br /&gt;
Selenium Server as a Hub:&lt;br /&gt;
&lt;br /&gt;
 java -jar selenium-server-standalone-2.42.2.jar -role hub&lt;br /&gt;
&lt;br /&gt;
The console is available at:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://localhost:4444/grid/console&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Register the Node with network address 192.168.0.50 at Selenium Hub with network address 192.168.0.10:&lt;br /&gt;
&lt;br /&gt;
 java -jar selenium-server-standalone-2.42.2.jar -role webdriver -hubHost 192.168.0.10 -host 192.168.0.50&lt;br /&gt;
&lt;br /&gt;
Each Node can have its configuration of available browsers in a separate file. The contents of nodeConfig.json file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;class&amp;quot;: &amp;quot;org.openqa.grid.common.RegistrationRequest&amp;quot;,&lt;br /&gt;
	&amp;quot;capabilities&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;platform&amp;quot;: &amp;quot;WINDOWS&amp;quot;,&lt;br /&gt;
			&amp;quot;seleniumProtocol&amp;quot;: &amp;quot;WebDriver&amp;quot;,&lt;br /&gt;
			&amp;quot;browserName&amp;quot;: &amp;quot;firefox&amp;quot;,&lt;br /&gt;
			&amp;quot;maxInstances&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;platform&amp;quot;: &amp;quot;WINDOWS&amp;quot;,&lt;br /&gt;
			&amp;quot;seleniumProtocol&amp;quot;: &amp;quot;WebDriver&amp;quot;,&lt;br /&gt;
			&amp;quot;browserName&amp;quot;: &amp;quot;chrome&amp;quot;,&lt;br /&gt;
			&amp;quot;maxInstances&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{	&amp;quot;platform&amp;quot;: &amp;quot;WINDOWS&amp;quot;,&lt;br /&gt;
			&amp;quot;seleniumProtocol&amp;quot;: &amp;quot;WebDriver&amp;quot;,&lt;br /&gt;
			&amp;quot;browserName&amp;quot;: &amp;quot;internet explorer&amp;quot;,&lt;br /&gt;
			&amp;quot;version&amp;quot;: 8,&lt;br /&gt;
			&amp;quot;maxInstances&amp;quot;: 1&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;configuration&amp;quot;: {&lt;br /&gt;
		&amp;quot;register&amp;quot;: true,&lt;br /&gt;
		&amp;quot;role&amp;quot;: &amp;quot;node&amp;quot;,&lt;br /&gt;
		&amp;quot;hubHost&amp;quot;: &amp;quot;192.168.0.10&amp;quot;,&lt;br /&gt;
		&amp;quot;host&amp;quot;: &amp;quot;192.168.0.50&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use of a configuration file:&lt;br /&gt;
&lt;br /&gt;
 java -jar selenium-server-standalone-2.42.2.jar -role webdriver -nodeConfig nodeConfig.json&lt;br /&gt;
&lt;br /&gt;
== Screenshots ==&lt;br /&gt;
&lt;br /&gt;
Needed classes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import java.util.Calendar;&lt;br /&gt;
import java.text.SimpleDateFormat;&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import org.apache.commons.io.FileUtils;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the source code, in desired location you must add:&lt;br /&gt;
&lt;br /&gt;
 Calendar calendar = Calendar.getInstance();&lt;br /&gt;
 SimpleDateFormat formater = new SimpleDateFormat(&amp;quot;yyyy-MM-dd_hhmmss&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 File screenshotFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);&lt;br /&gt;
 FileUtils.copyFile(screenshotFile, new File(&amp;quot;C:\\Selenium\\screenshot_&amp;quot; + formater.format(calendar.getTime()) + &amp;quot;.png&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
In case of remote requests using RemoteWebDriver, getScreenshotAs method is not implemented and requires the creation of a virtual driver:&lt;br /&gt;
&lt;br /&gt;
 WebDriver augmentedDriver = new Augmenter().augment(driver);&lt;br /&gt;
 File screenshotFile = ((TakesScreenshot)augmentedDriver).getScreenshotAs(OutputType.FILE);&lt;br /&gt;
&lt;br /&gt;
The definition of the driver should be placed before the screenshot command.&lt;br /&gt;
&lt;br /&gt;
== TestNG ==&lt;br /&gt;
&lt;br /&gt;
Running tests using TestNG requires changes in the code. Currently, are imported classes from JUnit package:&lt;br /&gt;
&lt;br /&gt;
 import org.junit.*;&lt;br /&gt;
 import static org.junit.Assert.*;&lt;br /&gt;
&lt;br /&gt;
We will replace them with classes from TestNG package:&lt;br /&gt;
&lt;br /&gt;
 import org.testng.annotations.*;&lt;br /&gt;
 import static org.testng.Assert.*;&lt;br /&gt;
&lt;br /&gt;
At the same time JUnit annotations:&lt;br /&gt;
&lt;br /&gt;
 @Before&lt;br /&gt;
 @Test&lt;br /&gt;
 @After&lt;br /&gt;
&lt;br /&gt;
We will replace with annotations suitable for TestNG:&lt;br /&gt;
&lt;br /&gt;
 @BeforeTest&lt;br /&gt;
 @Test&lt;br /&gt;
 @AfterTest&lt;br /&gt;
&lt;br /&gt;
After such changes, development environment, will have the ability to run tests using TestNG.&lt;br /&gt;
&lt;br /&gt;
The tests can be parameterised using a separate configuration file. Parameters are passed using annotation that needs to be added to the code:&lt;br /&gt;
&lt;br /&gt;
 @Parameters&lt;br /&gt;
&lt;br /&gt;
Parameters will be available as variables.&lt;br /&gt;
&lt;br /&gt;
The contents of testng.xml file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE suite SYSTEM &amp;quot;http://testng.org/testng-1.0.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;suite name=&amp;quot;MySuite&amp;quot; verbose=&amp;quot;1&amp;quot; thread-count=&amp;quot;1&amp;quot; parallel=&amp;quot;tests&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tests&amp;gt;&lt;br /&gt;
		&amp;lt;test name=&amp;quot;Windows + Firefox&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;parameters&amp;gt;&lt;br /&gt;
				&amp;lt;parameter name=&amp;quot;platform&amp;quot; value=&amp;quot;WINDOWS&amp;quot; /&amp;gt;&lt;br /&gt;
				&amp;lt;parameter name=&amp;quot;browser&amp;quot; value=&amp;quot;firefox&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/parameters&amp;gt;&lt;br /&gt;
			&amp;lt;classes&amp;gt;&lt;br /&gt;
				&amp;lt;class name=&amp;quot;MyTest&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/classes&amp;gt;&lt;br /&gt;
		&amp;lt;/test&amp;gt;&lt;br /&gt;
		&amp;lt;test name=&amp;quot;Windows + Chrome&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;parameters&amp;gt;&lt;br /&gt;
				&amp;lt;parameter name=&amp;quot;platform&amp;quot; value=&amp;quot;WINDOWS&amp;quot; /&amp;gt;&lt;br /&gt;
				&amp;lt;parameter name=&amp;quot;browser&amp;quot; value=&amp;quot;chrome&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/parameters&amp;gt;&lt;br /&gt;
			&amp;lt;classes&amp;gt;&lt;br /&gt;
				&amp;lt;class name=&amp;quot;MyTest&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/classes&amp;gt;&lt;br /&gt;
		&amp;lt;/test&amp;gt;&lt;br /&gt;
		&amp;lt;test name=&amp;quot;Windows + Internet Explorer&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;parameters&amp;gt;&lt;br /&gt;
				&amp;lt;parameter name=&amp;quot;platform&amp;quot; value=&amp;quot;WINDOWS&amp;quot; /&amp;gt;&lt;br /&gt;
				&amp;lt;parameter name=&amp;quot;browser&amp;quot; value=&amp;quot;internet explorer&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/parameters&amp;gt;&lt;br /&gt;
			&amp;lt;classes&amp;gt;&lt;br /&gt;
				&amp;lt;class name=&amp;quot;MyTest&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/classes&amp;gt;&lt;br /&gt;
		&amp;lt;/test&amp;gt;&lt;br /&gt;
		 &amp;lt;test name=&amp;quot;Linux + Firefox&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;parameters&amp;gt;&lt;br /&gt;
				&amp;lt;parameter name=&amp;quot;platform&amp;quot; value=&amp;quot;LINUX&amp;quot; /&amp;gt;&lt;br /&gt;
				&amp;lt;parameter name=&amp;quot;browser&amp;quot; value=&amp;quot;firefox&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/parameters&amp;gt;&lt;br /&gt;
			&amp;lt;classes&amp;gt;&lt;br /&gt;
				&amp;lt;class name=&amp;quot;MyTest&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/classes&amp;gt;&lt;br /&gt;
		&amp;lt;/test&amp;gt;&lt;br /&gt;
		&amp;lt;test name=&amp;quot;Linux + Chrome&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;parameters&amp;gt;&lt;br /&gt;
				&amp;lt;parameter name=&amp;quot;platform&amp;quot; value=&amp;quot;LINUX&amp;quot; /&amp;gt;&lt;br /&gt;
				&amp;lt;parameter name=&amp;quot;browser&amp;quot; value=&amp;quot;chrome&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/parameters&amp;gt;&lt;br /&gt;
			&amp;lt;classes&amp;gt;&lt;br /&gt;
				&amp;lt;class name=&amp;quot;MyTest&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;/classes&amp;gt;&lt;br /&gt;
		&amp;lt;/test&amp;gt;&lt;br /&gt;
	&amp;lt;/tests&amp;gt;&lt;br /&gt;
&amp;lt;/suite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Edit Run configuration, change option from Class to Suite and specify the full path to testng.xml file.&lt;br /&gt;
&lt;br /&gt;
== Apache Ant ==&lt;br /&gt;
&lt;br /&gt;
Ant tool allows you to automate build and run tests from the command line. It requires a separate build.xml configuration file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;project name=&amp;quot;TestNGTest&amp;quot; default=&amp;quot;test&amp;quot; basedir=&amp;quot;.&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;taskdef name=&amp;quot;testng&amp;quot; classname=&amp;quot;org.testng.TestNGAntTask&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;classpath&amp;gt;&lt;br /&gt;
			&amp;lt;pathelement location=&amp;quot;lib/testng-6.8.jar&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/classpath&amp;gt;&lt;br /&gt;
	&amp;lt;/taskdef&amp;gt;&lt;br /&gt;
	&amp;lt;property name=&amp;quot;testdir&amp;quot; location=&amp;quot;test&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;property name=&amp;quot;srcdir&amp;quot; location=&amp;quot;src&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;property name=&amp;quot;libdir&amp;quot; location=&amp;quot;lib&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;property name=&amp;quot;full-compile&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;path id=&amp;quot;classpath.base&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;path id=&amp;quot;classpath.test&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;fileset dir=&amp;quot;${libdir}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;include name=&amp;quot;**/*.jar&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/fileset&amp;gt;&lt;br /&gt;
		&amp;lt;pathelement location=&amp;quot;${testdir}&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;pathelement location=&amp;quot;${srcdir}&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;path refid=&amp;quot;classpath.base&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/path&amp;gt;&lt;br /&gt;
	&amp;lt;target name=&amp;quot;clean&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;delete verbose=&amp;quot;${full-compile}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;fileset dir=&amp;quot;${testdir}&amp;quot; includes=&amp;quot;**/*.class&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/delete&amp;gt;&lt;br /&gt;
	&amp;lt;/target&amp;gt;&lt;br /&gt;
	&amp;lt;target name=&amp;quot;compile&amp;quot; depends=&amp;quot;clean&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;javac srcdir=&amp;quot;${srcdir}&amp;quot; destdir=&amp;quot;${testdir}&amp;quot; verbose=&amp;quot;${full-compile}&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;classpath refid=&amp;quot;classpath.test&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/javac&amp;gt;&lt;br /&gt;
	&amp;lt;/target&amp;gt;&lt;br /&gt;
	&amp;lt;target name=&amp;quot;test&amp;quot; depends=&amp;quot;compile&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;testng outputdir=&amp;quot;${testdir}&amp;quot; classpathref=&amp;quot;classpath.test&amp;quot;&amp;gt; &lt;br /&gt;
			&amp;lt;xmlfileset dir=&amp;quot;${srcdir}&amp;quot; includes=&amp;quot;testng.xml&amp;quot;/&amp;gt; &lt;br /&gt;
		&amp;lt;/testng&amp;gt;&lt;br /&gt;
	&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configuration defines the structure of the project and the location of the libraries, source files and files related to running the test. The structure of the workspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
workspace&lt;br /&gt;
├── build.xml&lt;br /&gt;
├── lib&lt;br /&gt;
│   ├── selenium-server-standalone-2.42.2.jar&lt;br /&gt;
│   └── testng-6.8.jar&lt;br /&gt;
├── src&lt;br /&gt;
│   ├── MyTest.java&lt;br /&gt;
│   └── testng.xml&lt;br /&gt;
└── test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To run the test, execute ant program in the workspace directory.&lt;br /&gt;
&lt;br /&gt;
The source code of MyTest.java file with sample test that uses the parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.concurrent.TimeUnit;&lt;br /&gt;
import org.testng.annotations.*;&lt;br /&gt;
import static org.testng.Assert.*;&lt;br /&gt;
import org.openqa.selenium.*;&lt;br /&gt;
import org.openqa.selenium.remote.DesiredCapabilities;&lt;br /&gt;
import org.openqa.selenium.remote.RemoteWebDriver;&lt;br /&gt;
&lt;br /&gt;
public class MyTest {&lt;br /&gt;
	private WebDriver driver;&lt;br /&gt;
	private String baseUrl;&lt;br /&gt;
	private StringBuffer verificationErrors = new StringBuffer();&lt;br /&gt;
&lt;br /&gt;
	@Parameters({&amp;quot;platform&amp;quot;, &amp;quot;browser&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
	@BeforeTest(alwaysRun = true)&lt;br /&gt;
	public void setUp(String platform, String browser) throws Exception {&lt;br /&gt;
		DesiredCapabilities capability = new DesiredCapabilities();&lt;br /&gt;
&lt;br /&gt;
		if (browser.equals(&amp;quot;chrome&amp;quot;)) {&lt;br /&gt;
			capability = DesiredCapabilities.chrome();&lt;br /&gt;
			capability.setBrowserName(&amp;quot;chrome&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		else if (browser.equals(&amp;quot;internet explorer&amp;quot;)) {&lt;br /&gt;
			capability = DesiredCapabilities.internetExplorer();&lt;br /&gt;
			capability.setBrowserName(&amp;quot;internet explorer&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			capability = DesiredCapabilities.firefox();&lt;br /&gt;
			capability.setBrowserName(&amp;quot;firefox&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (platform.equals(&amp;quot;LINUX&amp;quot;)) {&lt;br /&gt;
			capability.setPlatform(Platform.LINUX);&lt;br /&gt;
		}&lt;br /&gt;
		else if (platform.equals(&amp;quot;MAC&amp;quot;)) {&lt;br /&gt;
			capability.setPlatform(Platform.MAC);&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			capability.setPlatform(Platform.WINDOWS);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		driver = new RemoteWebDriver(new URL(&amp;quot;http://192.168.0.10:4444/wd/hub&amp;quot;), capability);&lt;br /&gt;
		baseUrl = &amp;quot;https://www.google.com&amp;quot;;&lt;br /&gt;
		driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testMyTest() throws Exception {&lt;br /&gt;
		driver.get(baseUrl + &amp;quot;/&amp;quot;);&lt;br /&gt;
		driver.findElement(By.id(&amp;quot;gbqfq&amp;quot;)).clear();&lt;br /&gt;
		driver.findElement(By.id(&amp;quot;gbqfq&amp;quot;)).sendKeys(&amp;quot;Selenium&amp;quot;);&lt;br /&gt;
		driver.findElement(By.id(&amp;quot;gbqfb&amp;quot;)).click();&lt;br /&gt;
		assertEquals(&amp;quot;Selenium - Web Browser Automation&amp;quot;, driver.findElement(By.xpath(&amp;quot;//ol[@id=&amp;#039;rso&amp;#039;]//li//h3/a&amp;quot;)).getText());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@AfterTest&lt;br /&gt;
	public void tearDown() throws Exception {&lt;br /&gt;
		driver.quit();&lt;br /&gt;
		String verificationErrorString = verificationErrors.toString();&lt;br /&gt;
		if (!&amp;quot;&amp;quot;.equals(verificationErrorString)) {&lt;br /&gt;
			fail(verificationErrorString);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Page Objects ==&lt;br /&gt;
&lt;br /&gt;
This design pattern has become popular in test automation, because it facilitates tests maintenance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Source code of SimpleGoogleSearchTest.java file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.junit.*;&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
import org.openqa.selenium.*;&lt;br /&gt;
import org.openqa.selenium.firefox.FirefoxDriver;&lt;br /&gt;
import org.openqa.selenium.support.ui.ExpectedConditions;&lt;br /&gt;
import org.openqa.selenium.support.ui.WebDriverWait;&lt;br /&gt;
&lt;br /&gt;
public class SimpleGoogleSearchTest {&lt;br /&gt;
	private WebDriver driver;&lt;br /&gt;
	private String baseUrl;&lt;br /&gt;
	&lt;br /&gt;
	@Before&lt;br /&gt;
	public void setUp() throws Exception {&lt;br /&gt;
		driver = new FirefoxDriver();&lt;br /&gt;
		baseUrl = &amp;quot;https://www.google.com&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Test&lt;br /&gt;
	public void SimpleGoogleSearchTest() {&lt;br /&gt;
		driver.get(baseUrl + &amp;quot;/&amp;quot;);&lt;br /&gt;
		driver.findElement(By.id(&amp;quot;gbqfq&amp;quot;)).clear();&lt;br /&gt;
		driver.findElement(By.id(&amp;quot;gbqfq&amp;quot;)).sendKeys(&amp;quot;Selenium&amp;quot;);&lt;br /&gt;
		driver.findElement(By.id(&amp;quot;gbqfb&amp;quot;)).click();&lt;br /&gt;
		WebDriverWait wait = new WebDriverWait(driver, 10);&lt;br /&gt;
		wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(&amp;quot;//ol[@id=&amp;#039;rso&amp;#039;]//li//h3/a&amp;quot;)));&lt;br /&gt;
		assertEquals(&amp;quot;Selenium - Web Browser Automation&amp;quot;, driver.findElement(By.xpath(&amp;quot;//ol[@id=&amp;#039;rso&amp;#039;]//li//h3/a&amp;quot;)).getText());&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@After&lt;br /&gt;
	public void tearDown() {&lt;br /&gt;
		driver.quit();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Source code of GoogleSearchTest.java file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.junit.*;&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
import org.openqa.selenium.*;&lt;br /&gt;
import org.openqa.selenium.firefox.FirefoxDriver;&lt;br /&gt;
&lt;br /&gt;
public class GoogleSearchTest {&lt;br /&gt;
	private WebDriver driver;&lt;br /&gt;
	&lt;br /&gt;
	@Before&lt;br /&gt;
	public void setUp() {&lt;br /&gt;
		driver = new FirefoxDriver();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Test&lt;br /&gt;
	public void GoogleSearchTest() {&lt;br /&gt;
		GoogleHomePage homePage = GoogleHomePage.open(driver);&lt;br /&gt;
		GoogleSearchResultsPage resultsPage = homePage.search(&amp;quot;Selenium&amp;quot;);&lt;br /&gt;
		assertEquals(&amp;quot;Selenium - Web Browser Automation&amp;quot;, resultsPage.getTopResult());&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@After&lt;br /&gt;
	public void tearDown() {&lt;br /&gt;
		driver.quit();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Source code of GoogleHomePage.java file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.openqa.selenium.*;&lt;br /&gt;
import org.openqa.selenium.support.FindBy;&lt;br /&gt;
import org.openqa.selenium.support.PageFactory;&lt;br /&gt;
&lt;br /&gt;
public class GoogleHomePage {&lt;br /&gt;
	private WebDriver driver;&lt;br /&gt;
	&lt;br /&gt;
	@FindBy(id=&amp;quot;gbqfq&amp;quot;)&lt;br /&gt;
	private WebElement searchField;&lt;br /&gt;
	&lt;br /&gt;
	@FindBy(id=&amp;quot;gbqfb&amp;quot;)&lt;br /&gt;
	private WebElement searchButton;&lt;br /&gt;
	&lt;br /&gt;
	public GoogleHomePage(WebDriver driver) {&lt;br /&gt;
		this.driver = driver;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	public static GoogleHomePage open(WebDriver driver) {&lt;br /&gt;
		driver.get(&amp;quot;https://www.google.com/&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		return PageFactory.initElements(driver, GoogleHomePage.class);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	public GoogleSearchResultsPage search(String searchTerm) {&lt;br /&gt;
		searchField.clear();&lt;br /&gt;
		searchField.sendKeys(searchTerm);&lt;br /&gt;
		searchButton.click();&lt;br /&gt;
		&lt;br /&gt;
		return PageFactory.initElements(driver, GoogleSearchResultsPage.class);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Source code of GoogleSearchResultsPage.java file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.openqa.selenium.*;&lt;br /&gt;
import org.openqa.selenium.support.FindBy;&lt;br /&gt;
import org.openqa.selenium.support.ui.ExpectedConditions;&lt;br /&gt;
import org.openqa.selenium.support.ui.WebDriverWait;&lt;br /&gt;
&lt;br /&gt;
public class GoogleSearchResultsPage {&lt;br /&gt;
	private WebDriver driver;&lt;br /&gt;
	&lt;br /&gt;
	@FindBy(xpath=&amp;quot;//ol[@id=&amp;#039;rso&amp;#039;]//li//h3/a&amp;quot;)&lt;br /&gt;
	private WebElement topResultTitle;&lt;br /&gt;
	&lt;br /&gt;
	public GoogleSearchResultsPage(WebDriver driver) {&lt;br /&gt;
		this.driver = driver;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	public String getTopResult() {&lt;br /&gt;
		WebDriverWait wait = new WebDriverWait(driver, 10);&lt;br /&gt;
		wait.until(ExpectedConditions.visibilityOf(topResultTitle));&lt;br /&gt;
		&lt;br /&gt;
		return topResultTitle.getText();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Selenium]]&lt;/div&gt;</summary>
		<author><name>Łukasz Walec</name></author>
	</entry>
</feed>