selenium元素定位问题

问题
1、find_element_by_link_text() 本质上是xpath定位还是 css selector定位,还是其他别的定位
2、面试的时候被问到,什么时候选择xpath定位,什么时候选择id 定位
3、什么时候用xpath,什么时候用 css selector定位呢,两者之间的效率对比

以上的三个问题,麻烦各位老师解答

1、感觉本质应该是css,但是没有很细节研究这个,因为link_text是通过定位超链接标签完成定位的,就是的文本。
2、什么时候都可以用xpath,因为他就是一个万能定位,但是实际的经验应该是特征值定位,因为xpath是一个模糊匹配,他会遍历dom树,然后层层匹配,所以性能会偏慢。特征值匹配会快速一点,原因就省略了。
3、css和xpath的应用场景基本上差不多,都是万能匹配的,只是css基于前端的jQuery定位方式,会比xpath快,所以对熟悉jquery的人会非常友好。

直接通过pycharm查看代码就好了,底层原理都在框架代码里

    def find_element(self, by=By.ID, value=None):
        """
        Find an element given a By strategy and locator. Prefer the find_element_by_* methods when
        possible.

        :Usage:
            element = driver.find_element(By.ID, 'foo')

        :rtype: WebElement
        """
        if self.w3c:
            if by == By.ID:
                by = By.CSS_SELECTOR
                value = '[id="%s"]' % value
            elif by == By.TAG_NAME:
                by = By.CSS_SELECTOR
            elif by == By.CLASS_NAME:
                by = By.CSS_SELECTOR
                value = ".%s" % value
            elif by == By.NAME:
                by = By.CSS_SELECTOR
                value = '[name="%s"]' % value
        return self.execute(Command.FIND_ELEMENT, {
            'using': by,
            'value': value})['value']

常见定位方式

class By(object):
    """
    Set of supported locator strategies.
    """

    ID = "id"
    XPATH = "xpath"
    LINK_TEXT = "link text"
    PARTIAL_LINK_TEXT = "partial link text"
    NAME = "name"
    TAG_NAME = "tag name"
    CLASS_NAME = "class name"
    CSS_SELECTOR = "css selector"

各个定位策略的细节
https://www.w3.org/TR/webdriver/#locator-strategies

总结下就是

  • webdriver底层只支持css、link test、partial link text、tag, xpath五种定位,其他的定位符都是在后台直接换算为了css定位的
  • css的本质是执行 document.querySelectorAll("a") 遍历的是dom控件树
  • xpath本质是执行 document.evaluate("//a", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 遍历的是整个页面代码的xml
  • 因为dom形成于xml的后面,存在渲染延迟,使用xpath容易找出一些可能还没来得及展示的控件,平时用css定位会更理想些。

所以平时在使用的时候,为了性能考虑,一般会使用css 进行定位较好的意思是吗

这点性能损耗不用在意,其实最终都会通过js,都是很快的。

好的,谢谢老师

关闭