掘地攀登
100.61M · 2026-03-29
pip install selenium
Edge: developer.microsoft.com/zh-cn/micro…
官方文档:www.selenium.dev/zh-cn/docum…
driver.implicitly_wait(10) # 等待10秒(推荐值)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 等待10秒,直到"登录按钮"可见
login_button = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, "login-btn")))
代码整体结构拆解:
Selenium 提供了多种等待条件:
presence_of_element_located(存在即可):只要 HTML 里有这个标签就算成功。
风险:元素可能还在加载动画中,或者被 CSS 隐藏了 (display: none)。此时如果立刻去 .click(),会报错 ElementNotInteractableException。
visibility_of_element_located (存在且可见) :不仅要求 HTML 里有,还要求元素对用户可见(能看见,且能交互)。
优势:这是最安全的等待方式,确保元素准备好被点击或输入了。
element_to_be_clickable(存在、可见且可点击):比上面更严格,还要求元素没有被其他元素遮挡(Overlay),且 enabled 属性为真。
场景:专门用于点击按钮前。
driver.switch_to在网页自动化中,浏览器可能同时打开多个标签页,或者页面中嵌套了多个 <iframe>(内嵌框架)。默认情况下,Selenium 只能操作当前聚焦的窗口或框架。如果你想操作其他窗口或 iframe 里的元素,必须先使用 driver.switch_to 切换“焦点”。
find_element用于在网页中定位并返回单个 Web 元素。如果找到匹配的元素,它返回一个 WebElement 对象;如果找不到,它会抛出 NoSuchElementException 异常。
from selenium.webdriver.common.by import By
# 语法
element = driver.find_element(By.定位策略, "定位值")
参数说明:
"定位值"):具体的定位字符串(如 "kw" ,"//div[@id='app']")。| 定位策略 | 代码示例 | 说明 |
|---|---|---|
| ID | By.ID, "kw" | 最快、最稳定。HTML 中 id 属性必须唯一。 |
| CSS Selector | By.CSS_SELECTOR, ".class-name" | 语法简洁,性能优秀,比 XPath 更易读。 |
| Name | By.NAME, "wd" | 常用于表单输入框,但 name 不一定唯一。 |
| XPath | By.XPATH, "//input[@id='kw']" | 最强大,可以定位任何节点(包括父子关系、文本内容),但性能稍慢且易受页面结构变化影响。 |
| Class Name | By.CLASS_NAME, "btn-submit" | 仅支持单个类名。如果元素有多个类(class="a b"),只能传 "a" 或 "b",不能传 "a b"。 |
| Tag Name | By.TAG_NAME, "input" | 通过标签名查找(如 div, a),通常用于获取页面上所有某类标签中的第一个。 |
| Link Text | By.LINK_TEXT, "登录" | 精确匹配链接的完整文本。 |
| Partial Link Text | By.PARTIAL_LINK_TEXT, "登" | 模糊匹配链接文本(包含“登”字的链接)。 |
# Handle the email input field
email_input = driver.find_element(By.NAME, "email_input")
email_input.clear() # Clear field
email = "admin@localhost.dev"
email_input.send_keys(email) # Enter text
Boolean 值, 如果连接的元素显示在当前的浏览器上下文中,则为True,否则返回false。is_email_visible = driver.find_element(By.NAME, "email_input").is_displayed()
is_enabled_button = driver.find_element(By.NAME, "button_input").is_enabled()
is_selected_check = driver.find_element(By.NAME, "checkbox_input").is_selected()
tag_name_inp = driver.find_element(By.NAME, "email_input").tag_name
rect = driver.find_element(By.NAME, "range_input").rect
assert rect["x"] == 10
text = driver.find_element(By.TAG_NAME, "h1").text
email_txt = driver.find_element(By.NAME, "email_input")
value_info = email_txt.get_attribute("value")
由于 Selenium 不能与文件上传对话框交互,因此它提供了一种无需打开对话框即可上传文件的方法。 如果该元素是一个类型为 file 的 input 元素,则可以使用 send keys 方法发送将要上传文件的完整路径。
def test_uploads(driver):
driver.get("https://the-internet.herokuapp.com/upload")
upload_file = os.path.abspath(
os.path.join(os.path.dirname(__file__), "..", "selenium-snapshot.png"))
file_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
file_input.send_keys(upload_file)
driver.find_element(By.ID, "file-submit").click()
如果 iframe 之外没有按钮,那么您可能会得到一个 _no such element无此元素 的错误。 这是因为 Selenium 只知道顶层文档中的元素。为了与按钮进行交互,我们需要首先切换到框架, 这与切换窗口的方式类似。
window.frames进行查询.driver.switch_to.frame(0)
driver.switch_to.default_content()
# 存储原始窗口的 ID
original_window = driver.current_window_handle
# 检查一下,我们还没有打开其他的窗口
assert len(driver.window_handles) == 1
# 单击在新窗口中打开的链接
driver.find_element(By.LINK_TEXT, "new window").click()
# 等待新窗口或标签页
wait.until(EC.number_of_windows_to_be(2))
# 循环执行,直到找到一个新的窗口句柄
for window_handle in driver.window_handles:
if window_handle != original_window:
driver.switch_to.window(window_handle)
break
#关闭标签页或窗口
driver.close()
#切回到之前的标签页或窗口
driver.switch_to.window(original_window)
# 打开新标签页并切换到新标签页
driver.switch_to.new_window('tab')
# 打开一个新窗口并切换到新窗口
driver.switch_to.new_window('window')
driver.fullscreen_window()
driver.maximize_window()
# 将 Cookie 添加到当前浏览器上下文
driver.add_cookie({"name": "key", "value": "value"})
driver.get_cookies()
driver.add_cookie({"name": "test1", "value": "cookie1"})
# Delete cookie with name 'test1'
driver.delete_cookie("test1")
# Delete all cookies
driver.delete_all_cookies()
driver.add_cookie({"name": "foo", "value": "value", "sameSite": "Strict"})
driver.add_cookie({"name": "foo1", "value": "value", "sameSite": "Lax"})