tags:

views:

79

answers:

1

Is there a major difference in the time it takes to evaluate a long xpath than a short xpath?
Ex. Is there a performance difference between
/div[@id = 'id1']/label[contains(text(), 'Hello')/../../descendant::input
and
//input

What about the difference between using By.id("id1")
and
By.Xpath("//*[@id='id1']")

+2  A: 

I'm glad you asked, I found the answers surprising.

  • Short xpath is faster than long xpath, but not by much
  • On Firefox searching by name is faster than long xpath but a dead heat with short xpath (sometimes faster)
  • On Internet Explorer, By.name is much slower than xpath

This seems to fly in the face of the guidance Simon Stewart has been giving re: IE's xpath performance, so I'd take it with a grain of salt, but in the code below, it's pretty consistent.

I've written a quick test that illustrates this. It looks for the search box on the Google

package com.PeterNewhook;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;

public class FooTest {

public static void main(String[] args) {
    long start;
    long end;
    WebDriver driver;
    String longXpath = "/html/body/span[@id='main']/center/span[@id='body']/center/form/table/tbody/tr/td[2]/div[@class='ds']/input[@name='q']";
    String shortXpath = "//input[@name='q']";
    String elementId = "q";

    System.out.println("Using Firefox driver.");
    driver = new FirefoxDriver();
    driver.get("http://google.com");
    start = System.nanoTime();
    driver.findElement(By.xpath(longXpath));
    end = System.nanoTime()-start;
    System.out.println("The long XPath lookup took " + (double)end/1000000000.0 + " seconds.");
    start = System.nanoTime();
    driver.findElement(By.xpath(shortXpath));
    end = System.nanoTime() - start;
    System.out.println("The short XPath lookup took " + (double)end / 1000000000.0 + " seconds.");
    start = System.nanoTime();
    driver.findElement(By.name(elementId));
    end = System.nanoTime() - start;
    System.out.println("The By.name lookup took " + (double)end / 1000000000.0 + " seconds.");
    driver.close();

    System.out.println("\nUsing Internet Explorer driver.");        
    driver = new InternetExplorerDriver();
    driver.get("http://google.com");
    start = System.nanoTime();
    driver.findElement(By.xpath(longXpath));
    end = System.nanoTime()-start;
    System.out.println("The long XPath lookup took " + (double)end/1000000000.0 + " seconds.");
    start = System.nanoTime();
    driver.findElement(By.xpath(shortXpath));
    end = System.nanoTime() - start;
    System.out.println("The short XPath lookup took " + (double)end / 1000000000.0 + " seconds.");
    start = System.nanoTime();
    driver.findElement(By.name(elementId));
    end = System.nanoTime() - start;
    System.out.println("The By.name lookup took " + (double)end / 1000000000.0 + " seconds.");
    driver.close();
}
}

This gives the output:

Using Firefox driver.
The long XPath lookup took 0.13667022 seconds.
The short XPath lookup took 0.024628577 seconds.
The By.name lookup took 0.025209911 seconds.

Using Internet Explorer driver.
The long XPath lookup took 0.196125248 seconds.
The short XPath lookup took 0.164044262 seconds.
The By.name lookup took 1.005109964 seconds.

pnewhook