selenium - 通过 id 定位元素

标签 selenium xpath selenium-webdriver css-selectors protractor

以下定位技术有什么区别?

  • 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)纯粹的废话!您已经可以从您获得的其他答案和评论中看到这一点。

    要获得真正的答案(由实际数据支持),需要考虑的变量太多:
  • 不同浏览器供应商实现的有线协议(protocol),以及不同版本中的各种优化。
  • 由不同浏览器供应商实现的 DOM 引擎,以及不同版本中的各种优化。
  • 由不同浏览器供应商实现的 JavaScript 引擎,以及不同版本中的各种优化。

  • 此外,由于用于构建该站点的框架存在差异,您为您的 Web 应用程序/网页获得的任何结果都不会适用于不同的 Web 应用程序/网页。

    底线是:如果您关心性能测试,那么 Selenium 是错误的答案。 Selenium 是一个功能测试库,经过优化可以为您提供最佳的最终用户表示。性能是一个遥远的事后考虑。

    如果您的目标是让您的测试运行得更快,那么您最好花时间查看您的测试结构:
  • 您打开/关闭浏览器的频率。这通常是测试中最耗时的事件。
  • 您多久刷新一次元素缓存,需要多久刷新一次?考虑将您的元素移动到页面 工厂 模型,它为您延迟加载所有元素。
  • 当然还有最大的加速因素:在多台机器上并行运行测试。

  • 但我认为这与您最初的问题无关(有些人可能会建议“咆哮”)。

    关于selenium - 通过 id 定位元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34521441/

    相关文章:

    excel - 将 Chrome 窗口向右移动,将当前 excel 向左移动

    Python - Selenium PhantomJS - JSON 错误

    google-chrome - C# Selenium ChromeDriver : Google Chrome fails when run as administrator

    html - xpath 在页面中查找包含 HTML 的链接

    java - 自动化测试如何知道下载后的文件名?

    python - 将鼠标悬停在 Selenium 上后如何单击可见的元素?

    java - 自定义等待 try catch webdriver

    java - 如何获取员工 ID 并将其放入其他元素中

    javascript - 无法使用 javascript 或 xpath 单击跨度内的按钮

    java - 通过 xpath 永远在 org.w3c.dom 文档中查找节点并返回 null