假设当我单击网页上的按钮时执行了某些操作。假设需要 X 秒,在这些秒内,页面中央会显示一个 div
。操作处理完成后,div
将被删除,焦点将转到元素 E。
1) 我用 Selenium ( C# ) 编写了一个测试:
stopwatch.Restart();
button.Click();
while (driver.FindElementsById(PopupDivId).Count != 0)
{
Thread.Sleep(10);
}
stopwatch.Stop();
2 ) 以及 javascript 测试(在我的页面内)。简化代码:
OnClick 按钮处理程序:
console.time('test');
文本框上的 GotFocus 处理程序(元素 E):
console.log(document.getElementById('My_PopupDivId')); // just to be sure - it returns null
console.timeEnd('test');
<小时/>
出于某种原因,Selenium 测量值比直接 JavaScript 测量值大约 2 倍。 (400 毫秒与 800 毫秒)。
这是我的代码有问题还是只是 Selenium 不准确(使用 Selenium 测量 javascript/DOM 性能等内容实际上有意义吗?)
最佳答案
约翰·科纳 (John Koerner) 关于金钱的评论是正确的。您正在比较苹果和橙子。以下是影响差异的一些因素:
Selenium 使用有线协议(protocol)与您的浏览器通信。它必须获取您的参数,编码它们,将它们发送到浏览器,等待响应,解码返回值并将其提供给您的代码。这是对所执行的任何 DOM 操作的附加。
您的 Selenium 计时将点击操作作为计时的一部分,而您在点击的事件处理程序内部启动 JavaScript 计时。当您要求 Selenium 单击按钮时,Selenium 会执行一些内务工作,例如检查它是否可见,如果不可见则将其带入 View 。您的 Selenium 计时包括此成本,但您的 JavaScript 计时不包括此成本。
您的 Selenium 代码受设置的任何隐式等待值的影响。我通常不使用隐式等待,但我刚刚对其进行了测试,发现如果我向 Selenium 请求元素列表,它会等到隐式等待结束后才告诉我没有元素。
<
为了更好地了解 Selenium 对结果的影响程度,您应该在 div
的出现和删除之间尝试使用不同的延迟进行测试。我真的怀疑 JavaScript 计时会产生 2 秒的情况会在 Selenium 中转换为 4 秒计时。
至于使用 Selenium 进行性能测量,我认为 Selenium 对于此类任务来说是一个非常生硬的工具。当我担心浏览器中的代码性能时,我会跳过 Selenium 并直接使用 JavaScript。我使用 Selenium 来了解聚合中的性能。例如,有时我重新设计了应用程序的某些核心部分,然后运行一个使用 Selenium 的测试套件,发现运行整个测试套件的时间显着缩短。然而,正如我所说,这是直率的。我们谈论的是秒的差异,而不是毫秒。
关于c# - 使用 Selenium WebDriver 与 native javascript 衡量性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25447725/