selenium自动化
8种常用元素定位方式
| 定位方式 | 语法示例 | 适用场景 |
|---|---|---|
| ID | find_element(By.ID, "id_value") | 元素有唯一ID时优先使用(最快、最稳定) |
| Name | find_element(By.NAME, "name_value") | 表单元素(如 ) |
| Class Name | find_element(By.CLASS_NAME, "class") | 通过CSS类名定位(注意类名可能重复) |
| Tag Name | find_element(By.TAG_NAME, "div") | 通过标签名定位(如 、) |
| Link Text | find_element(By.LINK_TEXT, "登录") | 精确匹配超链接文本(全文本匹配) |
| Partial Link Text | find_element(By.PARTIAL_LINK_TEXT, "登") | 超链接文本模糊匹配(部分文本) |
| CSS Selector | find_element(By.CSS_SELECTOR, "#id .class") | 复杂结构定位(灵活性强) |
| XPath | find_element(By.XPATH, "//div[@id='id']") | 层级复杂或缺少其他属性的元素 |
id定位
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com")
element = driver.find_element(By.ID, "username") # 定位ID为username的元素
css selector
# 定位ID为container下的第一个button
button = driver.find_element(By.CSS_SELECTOR, "#container > button")
# 定位包含特定class的div
div = driver.find_element(By.CSS_SELECTOR, "div.error-message")
xpath定位
# 绝对路径(不推荐,易受页面结构调整影响)
abs_path = driver.find_element(By.XPATH, "/html/body/div[1]/form/input")
# 相对路径(推荐)
rel_path = driver.find_element(By.XPATH, "//input[@name='email']")
# 包含文本定位
text_element = driver.find_element(By.XPATH, "//button[contains(text(),'提交')]")
element = driver.find_element(By.XPATH,"//input[@name='email']")
若ID是动态生成的(如 id="button-12345"),可使用 部分属性匹配:
# CSS Selector模糊匹配
element = driver.find_element(By.CSS_SELECTOR, "[id^='button-']") # id以button-开头
# XPath模糊匹配
element = driver.find_element(By.XPATH, "//*[contains(@id, 'button-')]")
登录页面代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com/login")
# 显式等待用户名输入框
username = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "username"))
)
username.send_keys("testuser")
# 定位密码输入框(通过name属性)
password = driver.find_element(By.NAME, "password")
password.send_keys("mypassword")
# 定位登录按钮(通过CSS Selector)
login_button = driver.find_element(By.CSS_SELECTOR, "button.login-btn")
login_button.click()
# 验证登录成功
assert "Dashboard" in driver.title
文本输入与清除指令
| send_keys(text) | 向输入框输入文本 | element.send_keys("Hello") |
|---|---|---|
| clear() | 清空输入框内容 | element.clear() |
| send_keys(Keys.RETURN) | 模拟回车键 | element.send_keys(Keys.RETURN) |
| send_keys(Keys.TAB) | 模拟Tab键跳转 | element.send_keys(Keys.TAB) |
点击与交互
| click() | 点击元素(按钮/链接等) | button.click() |
|---|---|---|
| submit() | 提交表单(适用于 | form_element.submit() |
| double_click() | 双击元素(需ActionChains) | ActionChains(driver).double_click(element).perform() |
| context_click() | 右键点击(需ActionChains) | ActionChains(driver).context_click(element).perform() |
元素状态获取
is_displayed() 检查元素是否可见 if element.is_displayed():
is_enabled() 检查元素是否可交互 if element.is_enabled():
is_selected() 检查复选框/单选框是否选中 if checkbox.is_selected():
get_attribute("attr") 获取元素属性值 href = link.get_attribute("href")
text 获取元素文本内容 print(element.text)
value_of_css_property() 获取CSS属性值 color = element.value_of_css_property("color")
浙公网安备 33010602011771号