以下定位技术有什么区别?
element(by.id("id"));
element(by.css("#id"));
element(by.xpath("//*[@id='id']"));
browser.executeScript("return document.querySelector('#id');");
browser.executeScript("return document.getElementById('id');");
而且,从性能的角度来看,哪种方法是通过 id 定位元素的最快方法?
最佳答案
你的问题很难回答,当然要给出一个结论性的答案。事实上,我很想将这个问题标记为“太宽泛”,其他答案和评论都支持这一点。
以您的 element(by.id("id"));
为例。 .查看 Selenium 源代码,大多数驱动程序只是获取您提供的任何 id,并将其传递给有线协议(protocol):
public WebElement findElementById(String using) {
if (getW3CStandardComplianceLevel() == 0) {
return findElement("id", using);
} else {
return findElementByCssSelector("#" + cssEscape(using));
}
}
如您所知,每个浏览器供应商都在单独的二进制文件中实现自己的有线协议(protocol)。随意深入代码,为自己挖一个更深的洞。
对于其他不支持有线协议(protocol)的浏览器,例如 HtmlUnit,你只需要:
public List<WebElement> findElementsById(String id) {
return findElementsByXPath("//*[@id='" + id + "']");
}
然后他们解析可用的 DOM。
至于你的表现问题,任何人给你的任何东西都是1)只是一种感觉,或者2)纯粹的废话!您已经可以从您获得的其他答案和评论中看到这一点。
要获得真正的答案(由实际数据支持),需要考虑的变量太多:
此外,由于用于构建该站点的框架存在差异,您为您的 Web 应用程序/网页获得的任何结果都不会适用于不同的 Web 应用程序/网页。
底线是:如果您关心性能测试,那么 Selenium 是错误的答案。 Selenium 是一个功能测试库,经过优化可以为您提供最佳的最终用户表示。性能是一个遥远的事后考虑。
如果您的目标是让您的测试运行得更快,那么您最好花时间查看您的测试结构:
但我认为这与您最初的问题无关(有些人可能会建议“咆哮”)。
关于selenium - 通过 id 定位元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34521441/