Selenium Python:WebElement是否继承WebDriver类?为何可调用其方法?
示例代码
score_both_halves = driver.find_element_by_xpath('//label[@data-btn-radio="\'ScoreBothHalves\'"]') score_both_halves.find_element_by_xpath()
问题描述
在第二行代码中,我使用WebDriver类的
find_element_by_xpath()方法调用WebElement对象,且运行正常。
这是如何实现的?Selenium Python中的WebElement类是否继承自WebDriver类?
Selenium Python中的WebElement类是否并未继承WebDriver类?如果是,为何WebElement对象可使用WebDriver类的方法?
解答
WebElement类并没有继承WebDriver类。
你能在WebElement对象上调用find_element_by_xpath()这类方法,是因为Selenium在WebElement类里单独实现了一套和WebDriver同名的元素查找方法。这些方法和WebDriver的对应方法签名一致,但逻辑上是在当前WebElement的上下文范围内查找子元素,而WebDriver的同名方法是在整个页面范围内查找元素。
举个实际的区别:当你在WebElement上调用find_element_by_xpath(".//div")时,这个xpath是相对当前元素的局部查询;而在driver上调用find_element_by_xpath("//div"),则是查找整个页面中的div元素。
底层实现上,WebElement的这些查找方法会把定位逻辑转换为相对当前元素的查询,通过浏览器驱动协议(比如Chrome DevTools Protocol)向浏览器发送指令,限定查找范围为当前元素的子节点,以此实现局部查找的功能。
内容的提问来源于stack exchange,提问作者Ali Haider

