【selenium】selenium find_element()详解

本文详细解读了Selenium中find_element()方法的底层实现,介绍了不同定位方式如ID、名称、CSS选择器等,并展示了如何通过封装简化定位操作。重点讲解了By条件在实际使用中的应用和推荐的统一调用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

selenium定位方式

# 元素属性定位(3种)
driver.find_element_by_id(id) 
driver.find_element_by_name('name')
driver.find_element_by_class_name('class_name')
# 超链接定位(2种)
driver.find_element_by_link_text('link_text')
driver.find_element_by_partial_link_text('partial_link_text')
# 元素标签,元素路径,CSS选择器
driver.find_element_by_tag_name('tag_name')
driver.find_element_by_xpath('xpath')
driver.find_element_by_css_selector('css_selector')

但我们看下源码:
D:\Program Files\Python27\Lib\site-packages\selenium\webdriver\remote\webdriver.py
可以看到,上面那些定位方式,实际上都是调用的driver.find_element(by, value)
在这里插入图片描述
我们继续看下find_element()的源码,大部分方法最终全是通过By.CSS_SELECTOR来实现的查找

在这里插入图片描述
那By又都有哪些条件呢?

D:\Program Files\Python27\Lib\site-packages\selenium\webdriver\common\by.py
继续看源码,可以看到下面8种
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”

在这里插入图片描述
所以我们以后就都只用find_element()就好了,因为最终实际上也都是调用的这个方法。
简单封装一下,以后就记住find_element()一个方法即可。

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from appium import webdriver

class BasePage(object):
    def split_locator(self, locator):
        """
        分解定位表达式,如'css,.username',拆分后返回'css selector'和定位表达式'.username'(class为username的元素)
        :param locator: 定位方法+定位表达式组合字符串,如'css,.username'
        :return: locator_dict[by], value:返回定位方式和定位表达式
        """
        by = locator.split(',')[0]
        value = locator.split(',')[1]
        locator_dict = {
            'id': 'id',
            'name': 'name',
            'class': 'class name',
            'tag': 'tag name',
            'link': 'link text',
            'plink': 'partial link text',
            'xpath': 'xpath',
            'css': 'css selector',
        }
        if by not in locator_dict.keys():
            raise NameError("wrong locator!'id','name','class','tag','link','plink','xpath','css',exp:'id,username'")
        return locator_dict[by], value


    def wait_element(self, locator, sec=30):
        """
        等待元素出现
        :param locator: 定位方法+定位表达式组合字符串,用逗号分隔,如'css,.username'
        :param sec:等待秒数
        """
        by, value = self.split_locator(locator)
        try:
            WebDriverWait(self.driver, sec, 1).until(lambda x: x.find_element(by=by, value=value),message='element not found!!!')
            log.info(u'等待元素:%s' % locator)
        return True
        except TimeoutException:
            return False
        except Exception, e:
            raise e

    
    def get_element(self, locator, sec=60):
        """
        获取一个元素
        :param locator: 定位方法+定位表达式组合字符串,用逗号分隔,如'css,.username'
        :param sec:等待秒数
        :return: 元素可找到返回element对象,否则返回False
        """
        if self.wait_element(locator, sec):
            by, value = self.split_locator(locator)
            try:
                element = self.driver.find_element(by=by, value=value)
                log.info(u'获取元素:%s' % locator)
                return element
            except Exception, e:
                raise e
        else:
            return False

    def get_elements(self, locator):
        """
        获取一组元素
        :param locator: 定位方法+定位表达式组合字符串,用逗号分隔,如'css,.username'
        :return: elements
        """
        by, value = self.split_locator(locator)
        try:
            elements = WebDriverWait(self.driver, 60, 1).until(lambda x: x.find_elements(by=by, value=value))
            log.info(u'获取元素列表:%s' % locator)
            return elements
        except Exception, e:
            raise e

以后调用,先定义元素botton,在用例中查找时,调用方法即可

botton="id,su"
get_element(botton)   # 页面上id为su的元素

整体框架源码:
https://github.com/songzhenhua/selenium_ui_auto/blob/master/page_object/base_page.py
参考链接:
https://www.cnblogs.com/songzhenhua/p/12902288.html

<think>嗯,用户想了解如何使用Selenium的driver.find_element方法进行元素定位,以及参数说明。首先,我需要回忆一下Selenium的版本变化。记得在Selenium 4之后,原来的find_element_by_*方法被弃用了,现在推荐使用通用的find_element()方法,结合By类来指定定位方式。用户提供的引用内容也提到了这一点,比如引用[1]到[4]都提到要导入By模块并使用By.ID等方式。 那首先得解释find_element的基本用法,语法结构。参数方面,By类有不同的属性,比如ID、NAME、XPATH等,这些都是需要导入By模块的。然后要提到必须的导入语句,比如from selenium.webdriver.common.by import By,否则会报错,像引用[3]和[4]提到的。 接下来可能需要给出示例代码,展示不同定位方式的使用,比如By.ID、By.CLASS_NAME、By.XPATH等。每个例子需要说明参数如何填写,注意事项。比如XPATH如果写错了,可能会遇到引用[5]中的错误,所以需要提醒用户检查定位表达式是否正确。 另外,用户可能想知道新旧方法的区别,为什么旧方法被弃用,所以需要简单说明原因,比如统一接口、提高灵活性等。还要注意异常处理,比如找不到元素时抛出NoSuchElementException,建议使用try-except或者find_elements来处理。 还要注意代码中的常见错误,比如没有导入By模块,或者拼写错误,比如By.ID写成了By.id,或者XPATH表达式不正确,导致invalid locator错误,如引用[5]中的情况。这时候需要强调检查导入和语法。 可能还需要提到find_elementfind_elements的区别,返回单个元素还是列表,以及隐式等待和显式等待的问题,但用户的问题可能集中在基本使用上,所以先重点讲清楚参数和基本用法,再扩展一些常见问题。 最后,总结一下步骤:导入By模块,使用find_element方法,传递By枚举和定位值,处理可能的异常,并提供代码示例。然后根据用户提供的引用内容,生成相关问题,比如版本差异、处理动态元素、常见错误解决等。</think>### Selenium中driver.find_element使用方法说明 #### 一、基本语法 Selenium 4.0+版本推荐使用统一方法`find_element()`,通过`By`枚举类指定定位方式: ```python from selenium.webdriver.common.by import By element = driver.find_element(by=By.定位类型, value="定位值") ``` #### 二、参数详解 1. **必选参数**: - `by`:指定定位类型,需使用`By`类的枚举值 - `value`:定位表达式,如ID值、XPath等 2. **支持的定位类型**: | 定位类型 | 示例值 | 对应旧方法 | |---------------------|--------------------------|--------------------------| | `By.ID` | `"toolbar-search-input"` | `find_element_by_id` | | `By.NAME` | `"username"` | `find_element_by_name` | | `By.CLASS_NAME` | `"btn-primary"` | `find_element_by_class_name`| | `By.XPATH` | `"//input[@id='kw']"` | `find_element_by_xpath` | | `By.CSS_SELECTOR` | `"#loginBtn"` | `find_element_by_css_selector`| #### 三、使用示例 1. **通过ID定位**(对应引用[3]的案例): ```python driver.find_element(By.ID, "toolbar-search-input").send_keys("python") ``` 2. **通过XPATH定位**(注意避免引用[5]的错误): ```python # 正确写法 driver.find_element(By.XPATH, '//*[@id="staffid"]') # 错误写法会导致invalid locator # driver.find_element(By.XPATH, '错误表达式') ``` 3. **通过CLASS_NAME定位**: ```python login_button = driver.find_element(By.CLASS_NAME, "submit-btn") ``` #### 四、注意事项 1. **必须导入By模块**(如引用[2][3][4]强调): ```python from selenium.webdriver.common.by import By # 缺少导入会报错 ``` 2. **新版方法优势**: - 统一API接口 - 支持链式调用 - 提高代码可维护性 3. **异常处理**: ```python try: element = driver.find_element(By.ID, "dynamic-element") except NoSuchElementException: print("元素未找到,请检查页面加载状态") ``` #### 五、最佳实践 1. 优先使用`ID`和`NAME`定位(效率最高) 2. 复杂定位使用`XPATH`或`CSS_SELECTOR` 3. 对动态元素建议配合显式等待: ```python from selenium.webdriver.support.ui import WebDriverWait element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "loading")) ) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bug 挖掘机

支持洋子

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值