Selenium 元素选择器 - 我认为 xPath 最慢?

标签 selenium xpath webdriver css-selectors

我对一个公共(public)网站进行了一些测试,看看我是否能发现几个不同 Selenium CSS 选择器的性能差异。我运行一个带有五个节点的集线器; mac/chrome/local、mac/safari/local、mac/ff/local、win7/ie9/localVM 和 win8/ie10,localVM。这些测试都是并行运行的,以尝试模拟我通常如何运行它们。我很惊讶地发现 xPath 选择器并没有像我预期的那样成为魔鬼。也许我的测试有些奇怪?任何人有任何见解?

这是测试代码...

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

以下是结果,显示 xPath 保持自己的状态,500 次迭代的所有时间都以秒为单位。

Selenium Selector Comparison Table

Safari 是迄今为止表现最不稳定的,每次测试运行的时间都出奇地不同。

Princeton.edu 是一个非常普通的网页,具有相当简单的选择器,但似乎表明 xPath 并没有那么糟糕。在测试我的工作站点时,我发现了非常相似的事情。

关于我可能在这里遗漏的任何想法?

最佳答案

人们似乎懒惰地认为 Xpath 很慢,应该避免使用。当我采访人们时,当他们说他们避免使用 Xpath 因为它又慢又脆弱时,我会感到畏缩。如此处所示的速度不再是一个问题,xpath 仅与编写它的人一样脆弱。在正确的场景中,Xpath 非常棒,实际上可以提高性能,因为它允许您在一个可能需要多个命令的命令中执行(例如,查找元素然后迭代子元素可以在一个 xpath 中执行)

哦,不要让我开始那些认为一个元素只有一个 Xpath 并且可以通过右键单击 firebug 找到它的人

关于Selenium 元素选择器 - 我认为 xPath 最慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22519336/

相关文章:

java - 单击 List<WebElement> 中找到的所有元素

xpath - 使用htmlagilitypack搜索具有特定属性的节点

java - Selenium Webdriver 多选下拉列表 ElementNotVisibleException

javascript - 无法通过命令提示符运行我的 JMeter webdriver 采样器脚本

python - 尝试通过 Chromedriver 2.34、Selenium 3.8 和 Python 3.6.2 登录 Wells Fargo 时出错

javascript - 尝试使用 python selenium 更改 namecheap 选择自定义 dns 字段

java - Selenium 等待 Element 的任何一个可见

python - Xerces + Python?

python - Python xpath中如何处理单引号和双引号

json - 在 Selenium 中执行 JSON