解释硒如何搜索元素

Explain how selenium searches for an element

您好,我正在寻找有关 selenium 如何在网站上搜索元素的解释。对于我们来说,我们使用 inspect element 来找到一个元素的 id、名称、xpath 等,然后将其放入 selenium 中以进行一些操作。 selenium 如何找到我们告诉它要查找的元素?它会像我们一样 ctrl shift J 并检查元素吗?

注意:我不是在寻找如何编写 selenium 代码来查找元素。

搜索上下文

SearchContext 是 Selenium WebDriver 层次结构中的最顶层接口。它有两个抽象方法,因为 SearchContext 是一个接口。

  • findElement(): 使用给定的方法找到第一个

    WebElement findElement​(By by)
    
    Parameters:
    by - The locating mechanism
    
    Returns:
    The first matching element on the current context
    
    Throws:
    NoSuchElementException - If no matching elements are found
    
  • findElements(): 使用给定机制查找当前上下文中的所有元素。

    java.util.List<WebElement> findElements​(By by)
    
    Parameters:
    by - The locating mechanism to use
    
    Returns:
    A list of all WebElements, or an empty list if nothing matches
    

浏览器DOM通过javascript公开了API,如querySelector、querySelectorAll、getElementById、getElementsByClassName、getElementsByName等,可用于定位元素。 例如:

  1. 导航到 www.bing.com
  2. 按 F12 打开开发者控制台。
  3. 输入document.querySelector("#sb_form_q")定位css选择器输入的搜索框。我在这里使用 #Id 作为 css 选择器。
  4. 输入document.getElementById("sb_form_q")根据其Id定位输入的搜索框
  5. 输入document.getElementsByClassName("sb_form_q")[0]定位搜索框输入的class名称
  6. 输入document.getElementsByName("q")[0]定位搜索框输入的名称

以上所有应该 return "<input id="sb_form_q" class="sb_form_q" name="q" type="search" maxlength="1000" autocomplete="off" aria-label="Enter your search term" autofocus="" aria-controls="sw_as" aria-autocomplete="both" aria-owns="sw_as" aria-activedescendant="sa_5004">" 相同的结果。

Selenium 使用这些 DOM API 来检索元素。但是,selenium 可能会通过其他机制(例如 C++)使用这些 DOM API,而不是通过执行 javascript 来加快执行速度。 XPath 查找是浏览器不直接支持的东西 DOM API。 Selenium 可能会为 XPath 查找提供它自己的实现,或者依赖于某些浏览器 polyfill 来实现此功能。

Html 页面只是具有树状结构元素的文档。

一般

Selenium 使用元素定位器来查找内容。 Locators work lazily. When you look up an element Selenium first checks if its cached. If not, it uses SearchContext 使用给定机制(例如 XPathEvaluator)查找当前上下文中的所有元素(例如 DOM 元素)。

SearchContext 运行s findElement() 如果您正在寻找一个元素或 findElements() 如果您正在寻找多个元素。 简单来说,findElement() 尝试 运行 JavaScript 脚本来查找元素 asynchronously. If it can’t, it tries to find it directly by using an interestingly called method – xpathWizardry,即通过使用 XPathEvaluator 求值。

XPath

当您在 Selenium 中使用 XPath(XML 路径语言)时,这只是一种在 XML 类文档(例如 html)的层次结构中导航的方法。 XPath 使用非 XML 语法来提供一种灵活的方式来指向 XML 文档的不同部分。 selenium 在内部使用 W3 XPathEvaluator,它计算 XPath 表达式。

你可以学习XPathEvaluator源码here.