Filed under Selenium WebDriver, UI Testing.

Load Focus is a Cloud Load Testing Service. You can stress your app/website/API with thousands of concurrent users from all over the world.

In order to write UI tests with Selenium WebDriver you need to be able to identify web page elements fast and in an accurate way. You don’t want to revisit these selectors very often so you must choose the right selector from the beginning.

There are some browser tools that you can use in order to identify web elements in the DOM easier. These are:

  • Firebug for Firefox
  • Google Developer Tools for Chrome
  • Web Inspector for Safari

You can also create automated website tests for free with LoadFocus.com.

Selenium WebDriver API supports different possibilities to identify elements: by ID, by CLASS, by NAME, by CSS selector, by XPath, by TAG name. Also you define your custom selector in order to interact with the elements.

It’s always a good practice to assign unique IDs to elements, also names and classes in order to be more usable for automatic UI tests. If that is not possible you’ll need to use advanced or XPath selector to interact with those elements. The most popular selectors are the CSS selectors due to performance and simplicity reasons.

To inspect an element you just have to open the desired web page, right-click the desired element and click on Inspect Element. A new panel will open showing the desired element. Also you can inspect other elements by clicking on the cursor in the top left side of the Developer Tools or Firebug panels and hovering page elements.

Locating Elements with Selenium WebDriver, findElement() method returns and WebElement and findElements() returns a list of WebElements.

1. By ID:

 in Java: driver.findElement(By.id("element id")) 

2. By CLASS:

 in Java: driver.findElement(By.className("element class"))

3. By NAME:

in Java: driver.findElement(By.name("element name"))

4. By TAGNAME:

 in Java: driver.findElement(By.tagName("element html tag name"))

5. By CSS Selector:

 in Java: driver.findElement(By.cssSelector("css selector"))

6. By Link:

 in Java: driver.findElement(By.link("link text"))

7. By XPath:

 in Java: driver.findElement(By.xpath("xpath expression"))

Let’s get a HTML snippet code and see how can we use these Selenium WebDriver selectors in order to identify the desired elements:



<div class="thumbnail center well well-small text-center">


<h2>Newsletter</h2>


   Subscribe to our weekly Newsletter and stay tuned.


<form action="" method="post" name="subscribe"><label for="name">Name: </label>
      <input class="name" id="name" type="text" placeholder="Enter name..." />
      <label for="email">Email: </label> <input class="email" id="email" type="text" placeholder="your@email.com" />
      <input class="btn btn-large" type="submit" value="Subscribe" />
   </form>


   <a title="first link" href="#link1">First Link</a>
   <a title="second link" href="#link2">Second Link</a>
</div>


Let’s get some WebElements from the above HTML code snippet:

 WebElement nameInputField = driver.findElement(By.id("name"));

or

 WebElement nameInputField = driver.findElement(By.className("name")); 

or

 WebElement emailInputField = driver.findElement(By.id("email")); 

Locate link elements with findElements() method from the HTML snipped

@Test
public void findLinksTest(){
//Get all the links displayed
List links = driver.findElements(By.tagName("a"));
assertEquals(2, links.size());
for(WebElement link : links)
System.out.print(link.getAttribute("href"));
}

Locate link elements from the HTML snipped:

How to find a link with Selenium WebDriver API by full text:

WebElement firstLink = driver.findElement(By.linkText("First Link"));
assertEquals("#link1", firstLink.getAttribute("href"))

How to find a link with Selenium WebDriver API by partial text:

WebElement firstLink = driver.findElement(By.partialLinkText("First"));
assertEquals("#link1", firstLink.getAttribute("href"))

Locate elements by HTML Tag Name:

WebElement subscribeButton = driver.findElement(By.tagName("button"));

Locate elements by CSS Selectors

WebElement emailInputField =
driver.findElement(By.cssSelector("form input#email"));

or

WebElement emailInputField =
driver.findElement(By.cssSelector("input.email"));

or

WebElement emailInputField =
driver.findElement(By.cssSelector("input[type='submit'][value='Subscribe']"));

Performing partial match on attribute values

^= as in input[id^='email'] means Starting with.

 

$= as in input[id$='_name'] means Ending with.

 

*= as in Input[id*='userName'] means Containing.

Finding elements with XPATH

Enroll Now for the new Online Course: How to Find XPath for Web Elements in Chrome and Firefox Browsers.

  • Absolute path
WebElement userName =
driver.findElement(By.xpath("html/body/div/form/input"));
  • Relative path
WebElement email = driver.findElement(By.xpath("//input"));

Finding elements using index

WebElement email =
driver.findElement(By.xpath("//input[3]"));

Finding elements using attributes values with XPath

WebElement logo =
driver.findElement(By.xpath("img[@alt='logo']"));

XPATH

starts-with()

input[starts-with(@id,'input')]

Starting with:

ends-with()

input[ends-with(@id,'_field')]

Ending with:

contains()

input[contains(@id,'field')]

Containing

Locating table rows and cells

@Test
public void testTable() {
	WebElement simpleTable = driver.findElement(By.id("items"));

	//Get all rows
	List rows = simpleTable.findElements(By.tagName("tr"));
	assertEquals(3, rows.size());

	//Print data from each row
	for (WebElement row : rows) {
		List cols = row.findElements(By.tagName("td"));
		for (WebElement col : cols) {
			System.out.print(col.getText() + "\t");
		}
		System.out.print();
	}
}

Using jQuery selectors

Locate all the Checkbox which are checked by calling jQuery find() method.
find() method returns elements in array

List elements =
(List) js.executeScript("return jQuery.find(':checked')");

Get the text of an element with no class or id, and dynamic rendering inside the DOM:

For example:



<div>
  <img src="/image1.png" /> Text1
</div>


This is the method to return the text of an WebElement based on the parent element:

public String getCity(){
        WebElement element = driver.findElement(By.xpath("//img[contains(@src,'/image1.png')]/parent::*"));
        return element.getText();
}

Related Posts

Check out how to take a screenshot with Selenium WebDriver or to pass traffic though a proxy.

Check also The Ultimate Selenium WebDriver Testing & Hands-on Guide – Online Course.

Filed under Load Testing, Performance Testing.

If you want to check the performance improvement or degradation of your web application between two builds you need to do the following:

  • decide what part of your application you want to compare – page rendering, API response time, CPU or memory of the two builds
  • create a Apache JMeter performance test script
  • run the load/ performance test against the first version of your application
  • monitor the system under test and save the test results
  • deploy the new build on the same environment (same hardware and network connection)
  • run the same test and compare results

You should be careful that the performance test in run under the same system.
You can also use the compare functionality that Load Focus (Cloud Load and Performance Service) offers. Load Focus saves all your tests configuration and test results.

You can very easily select two test runs and compare them on the same chart. You can compare the Response Times, Latency, Throughput, Bytes/second, and other metrics. Sign Up and give it a try, I’ll make your life easier and no test results will be lost any more.

Filed under Apache JMeter, Load Testing, Performance Testing, Uncategorized.

If you want to stress your application with Apache JMeter you will try to start a load/performance test from JMeter with a lot of threads or concurrent users.

You have an example in our previous post how to create a simple GET performance test for a web application or web site.

Let’s return to our question, the number of threads that you can start from your machine it first depends on its hardware capabilities CPU, Memory. Apache JMeter is a Java application with a good UI interface, very easy to design new tests, however if you want to run load or performance tests you should run the JMeter test (.jmx file) from the Command Line. This way you will be able to start a lot more concurrent threads.

As an average you can start between 200-250 threads on a single machine, with a maximum of 300 threads. Before starting the actual test, you need to do a dry run from the injector machine and inspect when the tests start failing and limit the maximum number of threads per thread group.

To run a load or performance test with your own Apache JMeter script you can use Load Focus Cloud Load and Performance testing service which allows you to do the following:

  • select the number and location of injector machines (for example North America, Asia, Europe etc)
  • upload your own JMeter test script (.jmx) on the injector machines
  • run the test and monitor the execution log and live results

You can also upload different scripts on different machines so that you can check different scenarios like check your Sign Up functionality while the site is under heavy load.

Filed under Amazon Web Services, Apache JMeter, Cloud Services, Load Testing.

LoadFocus launches today the cloud load and performance testing service powerful enough to stress a web application or API with thousands of concurrent users.

Based on Apache JMeter open source project and hosted in the cloud, LoadFocus is designed for software developers, QA (Quality Assurance) engineers and product owners to run accurate load and performance tests with minimum costs.

load testing results

As we can see nowadays there are numerous web applications and APIs that appear everyday which requires load and performance assessments.

However, the existing commercial and professional load testing solutions are too expensive and too complex to meet real world requirements. The open-source load testing tools, like JMeter, are limited in terms of scalability for the requirements of enterprise and high-traffic web applications.

Once you sign up with LoadFocus.com, the only cost you will have is running the injector machines (Amazon EC2 instances).
The cost depends on the type of machine you’re using and the duration of the load test.

LoadFocus.com provides unlimited testing capacity, interactive real-time reporting and comprehensive result analysis integrated with mobile devices.

Click here to try it now!

Filed under Load Testing, Performance Testing.

Let’s say that you want to access a web service or a web page. The response time that you can see with different tools is a sum of the server processing time of the request and the delay involved for your request to reach to server and back.

This is getting more important when remote data centers are hosting the web page or web service.

Latency + Processing Time = Response Time

You can have a look at the latency vs. response time chart as you need to understand these different aspects of the system, and it is important for all the parties involved to know the difference between the two when they are doing a performance analysis.

You can use LoadFocus in order to stress test your application or API, inspect the latency and response time for all requests.

latency and response time

Filed under Apache JMeter, Load Testing, Performance Testing.

In order to create a new Cloud Apache JMeter Load Test with Load Focus all you need to do is follow the steps below:

1. Select New JMeter test

load test

2. Enter the name of the test and upload the Apache JMeter test script files (.jmx)

Here are the steps in more detail

– log into your account from https://loadfocus.com/login
– click on the Apache JMeter -> New Test menu item from left side of the https://loadfocus.com/admin web page
– on the https://loadfocus.com/newjmeter webpage insert a Test Run Name (i.e. First JMeter Script GET Load Test for www.example.com)
– upload your Apache JMeter .jmx script file that will execute the load test
– select the Location of the injector machine and the type of the machine
– you can upload a new file to execute in parallel a new .jmx script file

You can either Save the configuration or directly Execute the test.

If you are not familiar with Apache JMeter you can check the Apache JMeter Performance Testing tutorial or run a General Test with Load Focus.

Filed under Cloud Services, Load Testing, Performance Testing.

It is very easy to create a New General Load Test configuration, all you need to do is follow the steps below:

Click on the General Test Button

load test

Enter a new name for your General Test

Screen shot 2013-07-24 at 3.01.07 AM

Select the request type GET or POST and details for injector machines

Screen shot 2013-07-24 at 3.03.17 AM

Add Load Test details: threads, loops, URL and delay:

Screen shot 2013-07-24 at 3.03.49 AM

Here are the steps in more details:

  • log into your account
  • click on the General Test -> New Test from the https://loadfocus.com/admin URL
  • on the https://loadfocus.com/newgeneral URL enter the Test Run Name (i.e. First GET Load Test for www.example.com)
  • click on the “New Machine” button from the right side of the page
  • select the type of the request (GET or POST) from the New Machine area
  • you may select the geographical location of the injector machine – this will represent the location from where the users will hit your application
  • you may select also the Amazon Web Services machine type used for the test – the more concurrent users added the bigger the instance should be
  • GET Request, Request Label: GET www.example.com, URL: www.example.com, Threads (concurrent users): 100, Delay (seconds) 1, Loop count: 3
  • This configuration will execute 300 sample requests
  • you can duplicate this type of request to add other 100 thread x 3 loops in parallel
  • also you can add another type of requests: you can select a different location or type for the injector machine and a different number of threads, delay and loops

You can either Save the configuration or directly Execute the test.