接触过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')