与元素交互
演示 Selenium 与页面元素交互的 核心 7 个方法,覆盖点击、输入、查询三大场景。
操作前必须先定位:用 find_element(By.ID/XPATH/CSS, ...) 获取 WebElement 对象。
el.click() → 点击。被遮挡时抛 ElementClickInterceptedExceptionel.send_keys("text") → 追加输入,不是替换!要替换先 clear()el.clear() → 清空输入框el.submit() vs el.click() vs el.send_keys(Keys.ENTER):三种表单提交方式行为不同el.is_displayed() → 元素在视口可见吗?含 CSS display:none/visibility:hidden/宽高为0el.is_enabled() → disabled 属性,按钮变灰点不动el.get_attribute("value") → 读 value,不是 el.text!ElementNotInteractableException 元素存在但不可交互(被遮挡/没滚动到) |
click() 点不到时试试 driver.execute_script("arguments[0].click()", el) 用 JS 强制点击(el 就是你用 find_element() 定位到的那个元素对象,execute_script 会把它作为参数传给 JS 里的 arguments[0],相当于绕过 Selenium 的可交互性检查直接触发 DOM 事件)
element.click() 点击元素element.send_keys("text") 输入文本(配合 Keys.ENTER 可模拟回车)element.clear() 清空输入框element.submit() 表单提交(等同于在输入框按回车)element.text 获取元素可见文本element.get_attribute("href") 获取 HTML 属性element.get_property("value") 获取 DOM property(比 get_attribute 更可靠,比如读输入框当前值)element.tag_name 获取标签名(如 "input" / "button")element.size 获取尺寸 {'height': N, 'width': N}element.location 获取页面坐标 {'x': N, 'y': N}element.rect 获取完整的位置+尺寸对象element.is_displayed() 元素是否可见element.is_enabled() 元素是否可操作element.is_selected() 复选框/单选框是否选中
# ① 启动浏览器并打开元素交互演示页 from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://autotest-505.pages.dev/browser_op_tech_sections/element_interact_tech.html") # ② 定位输入框与复选框(id 与本演示页真实元素一致) username = driver.find_element(By.ID, "mockUsername") password = driver.find_element(By.ID, "mockPassword") remember = driver.find_element(By.ID, "mockRemember") # ③ 输入文本、清空后重新输入 username.send_keys("admin") username.clear() username.send_keys("admin") password.send_keys("123456") # ④ 点击复选框;submit() 模拟回车提交表单 remember.click() password.submit() # ⑤ 读取元素属性与状态(自动化断言常用) print("placeholder:", username.get_attribute("placeholder")) print("标签名:", username.tag_name) print("尺寸/坐标/矩形:", username.size, username.location, username.rect) print("选中/可见/可用:", remember.is_selected(), username.is_displayed(), username.is_enabled()) driver.quit()
| 因素 | 本地 | CI/CD 云服务器 |
| 网络 | 专线稳定 | 数据中心共享,偶发抖动 |
| CPU | 独占 | 多租户,可能被抢占 |
| 浏览器缓存 | 有 | 没有(每次全新启动) |
| 页面加载速度 | 有缓存,秒出 | 全量下载,慢 2~5 倍 |
| 并发任务 | 只跑你这一份 | 可能几十上百个同时抢资源 |
"A session has an associated session implicit wait timeout that specifies a time to wait for the implicit element location strategy"implicit=0.5s → 驱动最多等待 500ms 后必须放弃
→ 驱动在一次 findElement / findElements 调用中,最多愿意等待的总时间即为该值,不得超时。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
def test_polling(d, delay):
d.implicitly_wait(2)
d.get('about:blank')
d.execute_script(f"setTimeout(()=>{{document.body.innerHTML='t'}},{delay})")
t0 = time.perf_counter()
try:
cost = (time.perf_counter() - t0) * 1000
print(f"delay={delay:4d} 耗时={cost:6.0f} 差值={cost-delay:+5.0f}")
except: print(f"delay={delay} 超时")
driver = webdriver.Chrome()
for delay in range(10, 1550, 50): # 50ms 步进,覆盖 10~1500ms
test_polling(driver, delay)
driver.quit()
最坏 = implicit × (explicit超时 / pollFreq)try: find_element ... except NoSuchElementException:| 值 | 兜底窗口 (规范定义) |
叠加成本 explicit=15s |
白等 10次不存在 |
依据类型 | 推荐 |
| 不设(=0) | 0ms | 0 秒 | 0 秒 | 规范 | 最严谨 |
| 1s | 1000ms | 30 秒 | 10 秒 | 经验+权衡 | 默认推荐 |
| 0.5s | 500ms | 15 秒 | 5 秒 | 经验+权衡 | 确认页面 <500ms |
| 2s | 2000ms | 60 秒 | 20 秒 | 代价太大 | 谨慎 |
| ≥5s | ≥5000ms | 150 秒+ | 50 秒+ | 爆炸 | ❌ 绝对避免 |