Производительность вебдрайвера Xpath - PullRequest
3 голосов
/ 19 августа 2010

Существует ли существенная разница во времени, необходимом для оценки длинного xpath, чем короткого xpath?
Пример.Есть ли разница в производительности между
/div[@id = 'id1']/label[contains(text(), 'Hello')/../../descendant::input
и
//input

Как насчет разницы между использованием By.id("id1")
и
By.Xpath("//*[@id='id1']")

1 Ответ

13 голосов
/ 10 сентября 2010

Я рад, что вы спросили, я нашел ответы удивительными.

  • Short xpath быстрее, чем long xpath, но ненамного
  • В Firefox поиск по имени быстрее, чем в длинном xpath, но мертвый жар с коротким xpath (иногда быстрее)
  • В Internet Explorer By.name имеет значение намного медленнее, чем xpath

Это, похоже, противоречит руководству, которое Саймон Стюарт давал в отношении производительности xpath для IE: так что я бы взял это с недолгой солью, но в приведенном ниже коде это довольно непротиворечиво.

Я написал быстрый тест, который иллюстрирует это. Он ищет окно поиска в 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();
}
}

Это дает вывод:

Использование драйвера Firefox.
Длинный поиск XPath занял 0,13667022 секунд.
Короткий поиск XPath занял 0,024628577 секунд.
Поиск By.name занял 0,025209911 секунд.

Использование драйвера Internet Explorer.
Длинный поиск XPath занял 0,196125248 секунд.
Короткий поиск XPath занял 0,164044262 секунды.
Поиск By.name занял 1,005109964 секунды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...