ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在 Web 自动化测试中,**元素定位**是最基础、也最关键的能力

在 Web 自动化测试中,**元素定位**是最基础、也最关键的能力 在 Web 自动化测试中元素定位是最基础、也最关键的能力。Selenium WebDriver 提供了 8 种内置定位策略通过selenium.webdriver.common.by.By类调用。 例如driver.find_element(By.ID,kw)这行代码的含义是在当前页面中查找idkw的元素并返回第一个匹配结果。除了By.IDSelenium 还支持By.NAME、By.CSS_SELECTOR、By.XPATH、By.CLASS_NAME、By.TAG_NAME、By.LINK_TEXT、By.PARTIAL_LINK_TEXT等多种方式。下面从原理、代码、解析和亮点四个部分展开。二、核心代码示例fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.common.keysimportKeysfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.chrome.optionsimportOptions# 1. 创建浏览器实例optionsOptions()options.add_argument(--disable-gpu)driverwebdriver.Chrome(optionsoptions)# 2. 打开页面driver.get(https://www.baidu.com)# 3. 使用 ID 定位搜索框search_boxdriver.find_element(By.ID,kw)search_box.send_keys(Selenium 元素定位)search_box.send_keys(Keys.RETURN)# 4. 使用 CSS_SELECTOR 定位搜索结果resultsdriver.find_elements(By.CSS_SELECTOR,h3.t a)forrinresults[:3]:print(r.text,r.get_attribute(href))# 5. 使用 XPATH 定位“下一页”next_pagedriver.find_element(By.XPATH,//a[contains(text(),下一页)])next_page.click()# 6. 使用 NAME 定位表单元素# driver.find_element(By.NAME, wd)# 7. 使用 LINK_TEXT 定位链接# driver.find_element(By.LINK_TEXT, 新闻)# 8. 显式等待提升稳定性waitWebDriverWait(driver,10)wait.until(EC.presence_of_element_located((By.ID,su)))driver.quit()三、八种定位方式解析定位方式示例特点By.IDBy.ID, kw唯一、快速、最稳定首选By.NAMEBy.NAME, wd常用于表单字段可能重名By.CSS_SELECTORBy.CSS_SELECTOR, #kw语法灵活性能较好工业界常用By.XPATHBy.XPATH, //input[idkw]表达力最强可跨层级、按文本查找By.CLASS_NAMEBy.CLASS_NAME, s_ipt只能传单个类名不能含空格By.TAG_NAMEBy.TAG_NAME, input通常用于批量获取同类标签By.LINK_TEXTBy.LINK_TEXT, 新闻仅用于a标签需完全匹配By.PARTIAL_LINK_TEXTBy.PARTIAL_LINK_TEXT, 新模糊匹配链接文本1.By.ID首选定位ID 定位之所以推荐优先级最高是因为 HTML 规范要求id在单页内唯一浏览器可通过原生getElementById()快速解析。 例如搜索框idkw就是典型场景。2.By.NAME表单场景常用name属性常见于input、select、button等表单元素。它比 ID 稳定性略低因为name可能重复但在登录、注册、搜索等表单中通常仍然可靠。3.By.CSS_SELECTOR现代前端推荐CSS 选择器支持 ID、类、属性、层级、伪类等多种组合driver.find_element(By.CSS_SELECTOR,#kw)# IDdriver.find_element(By.CSS_SELECTOR,.s_ipt)# 类driver.find_element(By.CSS_SELECTOR,input[namekw])# 属性driver.find_element(By.CSS_SELECTOR,form input)# 子代它的优势是语法简洁、浏览器原生支持度高执行速度通常优于 XPath。4.By.XPATH最灵活但需谨慎XPath 支持属性匹配、文本匹配、逻辑组合、轴定位等driver.find_element(By.XPATH,//input[idkw])driver.find_element(By.XPATH,//button[contains(text(),提交)])driver.find_element(By.XPATH,//div[classnav]//a[text()登录])XPath 的弱点是语法复杂且绝对路径如/html/body/div[1]/form/input非常脆弱页面结构稍有变化就会失效。 因此应优先使用相对路径和属性定位。四、报告亮点亮点一定位策略有优先级不是“越复杂越好”推荐顺序通常是ID NAME CSS_SELECTOR XPATH 其他方式有唯一 ID 时直接使用 ID没有 ID 时优先 CSS Selector只有在需要文本匹配、跨层级查找或向上遍历 DOM 时才使用 XPath。亮点二find_element与find_elements的区别driver.find_element(By.ID,kw)# 返回单个元素driver.find_elements(By.CSS_SELECTOR,a)# 返回元素列表单数形式找不到元素会抛出NoSuchElementException复数形式找不到则返回空列表。批量提取数据、遍历列表时应使用find_elements。亮点三显式等待比time.sleep()更可靠页面加载、Ajax 请求、动态渲染都会导致元素暂时不可见。使用显式等待可以显著提升脚本稳定性fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC waitWebDriverWait(driver,10)elementwait.until(EC.element_to_be_clickable((By.ID,su)))element.click()这比硬编码time.sleep(3)更智能也更节省执行时间。亮点四避免使用废弃 API旧写法driver.find_element_by_id(kw)driver.find_element_by_xpath(//input[idkw])新写法driver.find_element(By.ID,kw)driver.find_element(By.XPATH,//input[idkw])find_element_by_*系列方法在新版 Selenium 中已被废弃推荐统一使用find_element(By.策略, 值)。亮点五定位器应集中管理在真实项目中不建议把定位字符串散落在各处。可以集中维护classBaiduLocators:SEARCH_INPUT(By.ID,kw)SEARCH_BUTTON(By.ID,su)RESULT_LINKS(By.CSS_SELECTOR,h3.t a)这样页面结构变化时只需修改一处降低维护成本。五、总结driver.find_element(By.ID, kw)是 Selenium 元素定位的典型写法。实际项目中应根据页面结构选择合适策略优先 ID其次 NAME 和 CSS Selector复杂场景再使用 XPath。配合显式等待、集中管理定位器、避免绝对路径和废弃 API可以显著提升自动化脚本的稳定性、可读性和可维护性。
返回列表