Selenium八种元素定位方法源码阅读

时间:2023-07-10 13:54:07

接触过Selenium的都知道元素定位有八种方法,但用不同的方法在执行时有什么区别呢?

元素定位8种方法(Python版),当然还有每一个方法对应的find_elements方法

find_element_by_id()

find_element_by_name()

find_element_by_class_name()

find_element_by_tag_name()

find_element_by_link_text()

find_element_by_partial_link_text()

find_element_by_xpath()

find_element_by_css_selector()

我去读了一下源码

    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 = element.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_CHILD_ELEMENT,
{"using": by, "value": value})['value']

find_element_by_id(self, id_) -> self.find_element(by=By.ID, value=id_)

find_element_by_tag_name(self, name) -> self.find_element(by=By.TAG_NAME, value=name)

find_element_by_name(self, name) -> self.find_element(by=By.NAME, value=name)

find_element_by_class_name(self, name) -> self.find_element(by=By.CLASS_NAME, value=name)

find_element_by_link_text(self, link_text) -> self.find_element(by=By.LINK_TEXT, value=link_text)

find_element_by_partial_link_text(self, link_text) -> self.find_element(by=By.PARTIAL_LINK_TEXT, value=link_text)

find_element_by_xpath(self, xpath) -> self.find_element(by=By.XPATH, value=xpath)

find_element_by_css_selector(self, css_selector) -> self.find_element(by=By.CSS_SELECTOR, value=css_selector)

从find_element源码可以知道,

如果by是By.ID / By.TAG_NAME / By.CLASS_NAME / By.NAME的话,by的值换成By.CSS_SELECTOR,并将其value值处理成对应的CSS格式。by是其他值的不做处理。所以如果元素定位用的是前面这四种,本质还是用的By.CSS_SELECTOR。

然后再调用 self._execute(Command.FIND_CHILD_ELEMENT,{"using": by, "value": value})['value'] 去向remote webdriver server post 请求去查找element。

Command.FIND_CHILD_ELEMENT:('POST', '/session/$sessionId/element/$id/element')

https://www.selenium.dev/selenium/docs/api/py/_modules/selenium/webdriver/remote/webdriver.html#WebDriver.find_element