Webdriver Xpath 性能

Webdriver Xpath 性能

问题描述:

评估长 xpath 与评估短 xpath 所需的时间是否有重大差异?
前任.
之间是否存在性能差异/div[@id = 'id1']/label[contains(text(), 'Hello')/../../descendant::input

//输入

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

和使用有什么区别By.id("id1")

By.Xpath("///*[@id='id1']")

很高兴您提出了这个问题,我发现答案令人惊讶.

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

  • 短 xpath 比长 xpath 快,但相差不大
  • 在 Firefox 上,按名称搜索比长 xpath 快,但短 xpath 却死气沉沉(有时更快)
  • 在 Internet Explorer 上,By.name 比 xpath 慢很多

这似乎违背了 Simon Stewart 给出的指导:IE 的 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.

我编写了一个快速测试来说明这一点.它在 Google 上寻找搜索框

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();
}
}

这给出了输出:

使用 Firefox 驱动程序.
长时间的 XPath 查找耗时 0.13667022 秒.
短 XPath 查找耗时 0.024628577 秒.
By.name 查找耗时 0.025209911 秒.

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.

使用 Internet Explorer 驱动程序.
长时间的 XPath 查找耗时 0.196125248 秒.
短 XPath 查找耗时 0.164044262 秒.
By.name 查找耗时 1.005109964 秒.

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.