Seleniumelement-Selektoren - Ich dachte, xPath sei am langsamsten?

Ich habe einige Tests mit einer öffentlichen Website durchgeführt, um festzustellen, ob sich die Leistung einiger verschiedener Selenium-CSS-Selektoren unterscheidet. Ich habe einen Hub mit fünf Knoten betrieben. mac / chrome / local, mac / safari / local, mac / ff / local, win7 / ie9 / localVM und win8 / ie10, localVM. Die Tests liefen alle parallel, um zu simulieren, wie ich sie normalerweise laufe. Ich war überrascht zu sehen, dass sich xPath-Selektoren nicht als der Teufel herausstellten, den ich erwartet hatte. Vielleicht haben meine Tests etwas Irres? Hat jemand einen Einblick?

Hier ist der Testcode ...

    int cycles = 500;
int yVal = 0;

getPage(“http://www.princeton.edu");

/* try an element that does not have an id*/
startStopwatch();
for (int i = 0; i < cycles; i++)
    yVal = driver.findElementByCssSelector("a[href='/main/news/events/']").getLocation().y;
print("By CSS: " + elapsedSeconds());

startStopwatch();
for (int i = 0; i < cycles; i++)
    yVal = driver.findElementByCssSelector("div[id='events'] a[href='/main/news/events/']").getLocation().y;
print("By CSS using id: " + elapsedSeconds());


startStopwatch();
for (int i = 0; i < cycles; i++)
    yVal = driver.findElementByXPath("//a[@href=\'/main/news/events/']").getLocation().y;
print("By xPath: " + elapsedSeconds());

/* try an element with an id */
//by id
startStopwatch();
for (int i = 0; i < cycles; i++)
    yVal = driver.findElementById("events").getLocation().y;
print("By Id: " + elapsedSeconds());

//by CSS
startStopwatch();
for (int i = 0; i < cycles; i++)
    yVal = driver.findElementByCssSelector("div[id='events']").getLocation().y;
print("By CSS: " + elapsedSeconds());

// an unnecessarily long xPath expression
startStopwatch();
for (int i = 0; i < cycles; i++)
    yVal = driver.findElementByXPath("//span[text()='News at Princeton']/ancestor::div[1]/following-sibling::div[1]").getLocation().y;
print("By longer xPath: " + elapsedSeconds());

// somewhat shorter xPath
startStopwatch();
for (int i = 0; i < cycles; i++)
    yVal = driver.findElementByXPath("//span[text()='Featured Events']/ancestor::div[1]").getLocation().y;
print("By shorter xPath: " + elapsedSeconds());

Hier sind die Ergebnisse, die zeigen, dass sich xPath gut behauptet. Alle Zeiten in Sekunden für 500 Iterationen.

Safari war bei weitem der unberechenbarste Performer, wobei die Zeiten bei jedem Testlauf merkwürdig unterschiedlich waren.

princeton.edu ist eine ziemlich gewöhnliche Webseite mit ziemlich einfachen Selektoren, scheint aber darauf hinzudeuten, dass xPath nicht so schlecht ist. Beim Testen meiner Baustelle habe ich fast dasselbe festgestellt.

Irgendwelche Gedanken darüber, was ich hier vermissen könnte?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage