""" 目標: driver.find_element() 需求: 1. 使用driver.find_element()方法 2. 輸入用戶名:admin 3. 輸入密碼:123456
""" # 導包
from selenium import webdriver
from time import sleep # 獲取 瀏覽器驅動對象
from selenium.webdriver.common.by import By driver = webdriver.Edge() # 打開 注冊A.html
url = r"E:\前端和測試 外包\測試學習\8天web自動化全套測試—資料\web自動化_day01_課件+筆記+資料+代碼\web自動化_day01_課件+筆記+資料+代碼\02_其他資料\注冊A.html"
driver.get(url) # 使用find_element()定位用戶名
driver.find_element(By.ID, "userA").send_keys("admin")
# 使用find_element()定位密碼
driver.find_element(By.CSS_SELECTOR, "#passwordA").send_keys("123456") # 暫停 3秒
sleep(3)
# 退出瀏覽器驅動
driver.quit()
driver.find_element()
-
用于查找網頁上的一個元素,返回一個
WebElement
對象 -
需要傳入兩個參數:
-
定位方式(
By
提供的枚舉常量) -
定位值(對應的選擇器)
-
By
定位方式
By
是 Selenium 提供的一個類,封裝了各種元素定位方式。常用有:
-
By.ID("id值")
→ 通過元素的 id 屬性定位 -
By.NAME("name值")
→ 通過 name 屬性定位 -
By.CLASS_NAME("class值")
→ 通過 class 屬性定位 -
By.TAG_NAME("tag值")
→ 通過標簽名定位(如"input"
,"button"
) -
By.LINK_TEXT("文本")
→ 通過完整文本定位, 比如這種
-
By.PARTIAL_LINK_TEXT("部分文本")
→ 通過鏈接的部分文本定位 -
By.CSS_SELECTOR("css選擇器")
→ 通過 CSS 選擇器定位 -
By.XPATH("xpath表達式")
→ 通過 XPath 表達式定位(最萬能)
link_text
和 partial_link_text
的區別
方法 | 含義 | 匹配方式 |
---|---|---|
link_text | 按超鏈接的完整文本定位 | 完全匹配,文本必須完全一樣 |
partial_link_text | 按超鏈接文本的部分定位 | 模糊匹配,只要包含指定子串即可 |
?? 都只能用于 <a>
標簽(超鏈接)
.send_keys()
-
作用:模擬鍵盤輸入
-
參數:字符串或者特殊鍵(如回車鍵
Keys.ENTER
)
element.send_keys("hello") # 輸入字符串
element.send_keys(Keys.ENTER) # 模擬回車
element.send_keys("123", Keys.TAB) # 輸入 123 后按下 TAB
XPath基本語法
假設有 HTML:
<div id="loginBox"><input id="userA" type="text" placeholder="用戶名"><input id="passwordA" type="password" placeholder="密碼"><button>登錄</button>
</div>
(1) 按標簽定位
driver.find_element(By.XPATH, "//input") # 找第一個 input 元素
-
//
表示 從任意位置開始查找 -
input
是標簽名
(2) 按屬性定位
driver.find_element(By.XPATH, "//input[@id='userA']").send_keys("admin")
driver.find_element(By.XPATH, "//input[@type='password']").send_keys("123456")
-
[@屬性名='值']
→ 根據屬性過濾 -
可以定位 id、name、class、placeholder 等屬性
(3) 按文本定位
driver.find_element(By.XPATH, "//button[text()='登錄']").click()
text()
用于匹配標簽的可見文本
(4) 模糊匹配 / contains
driver.find_element(By.XPATH, "//input[contains(@id, 'user')]").send_keys("admin")
driver.find_element(By.XPATH, "//button[contains(text(), '登')]").click()
-
contains(@屬性, '值')
→ 屬性包含某字符串 -
contains(text(), '值')
→ 文本包含某字符串
CSS Selector 基本語法
假設 HTML:
<div id="loginBox"><input id="userA" type="text" class="input-text" placeholder="用戶名"><input id="passwordA" type="password" class="input-text" placeholder="密碼"><button class="btn login-btn">登錄</button>
</div>
(1) 按 id 定位
driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("admin")
#userA
→ 選擇 id 為userA
的元素
(2) 按 class 定位
driver.find_element(By.CSS_SELECTOR, ".login-btn").click()
.login-btn
→ 選擇 class 包含login-btn
的元素
(3) 按標簽+class
driver.find_element(By.CSS_SELECTOR, "button.login-btn").click()
button.login-btn
→ 限制標簽為<button>
且 class 包含login-btn
(4) 按屬性定位
driver.find_element(By.CSS_SELECTOR, "input[placeholder='用戶名']").send_keys("admin")
driver.find_element(By.CSS_SELECTOR, "input[type='password']").send_keys("123456")
-
[屬性名='值']
→ 匹配屬性值 -
也可以模糊匹配:
input[placeholder*='用'] # 屬性值包含“用”
input[type^='pass'] # 屬性值以“pass”開頭
input[type$='word'] # 屬性值以“word”結尾
瀏覽器操作方法
方法 | 功能描述 |
---|---|
maximize_window() | 最大化瀏覽器窗口 |
set_window_size(width, height) | 設置窗口寬高(像素) |
set_window_position(x, y) | 設置窗口在屏幕的坐標位置 |
back() | 瀏覽器后退(模擬點擊后退按鈕) |
forward() | 瀏覽器前進(模擬點擊前進按鈕) |
refresh() | 刷新頁面(模擬 F5 按鍵) |
close() | 關閉當前窗口 |
quit() | 關閉瀏覽器驅動(結束所有窗口、釋放資源) |
title | 獲取頁面標題(屬性,調用無括號,如 driver.title ) |
current_url | 獲取當前頁面 URL(屬性,調用無括號,如 driver.current_url ) |
元素基礎操作
方法 | 功能描述 |
---|---|
click() | 單擊元素(模擬鼠標左鍵點擊) |
send_keys(value) | 向輸入框等元素模擬輸入文本 |
clear() | 清除輸入框已填文本 |
元素信息獲取方法
方法 | 功能描述 |
---|---|
size | 獲取元素尺寸(寬高,屬性,調用無括號,如 element.size ) |
text | 獲取元素文本內容(屬性,調用無括號,如 element.text ) |
get_attribute("xxx") | 獲取元素指定屬性值(xxx 為屬性名,如 get_attribute("id") ) |
is_displayed() | 判斷元素是否可見(返回布爾值) |
is_enabled() | 判斷元素是否可用(如按鈕是否可點擊,返回布爾值) |
is_selected() | 判斷元素是否被選中(復選框、單選框專用,返回布爾值 ) |
常用鼠標操作
使用 ActionChains
后必須調用 .perform()
執行
# 導包
from selenium.webdriver import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("https://www.baidu.com")element = driver.find_element(By.ID, "kw") # 搜索框
#注冊
actions = ActionChains(driver)
方法 | 作用 | 示例 |
---|---|---|
click() | 單擊元素 | actions.click(element).perform() |
double_click() | 雙擊元素 | actions.double_click(element).perform() |
context_click() | 右擊元素 | actions.context_click(element).perform() |
move_to_element() | 鼠標懸停到元素 | actions.move_to_element(element).perform() |
click_and_hold() | 鼠標按下不放 | actions.click_and_hold(element).perform() |
release() | 鼠標釋放 | actions.release(element).perform() |
drag_and_drop(source, target) | 拖拽元素 | actions.drag_and_drop(source, target).perform() |
drag_and_drop_by_offset(source, x, y) | 按偏移拖拽 | actions.drag_and_drop_by_offset(source, 100, 0).perform() |
鍵盤操作
from selenium.webdriver.common.keys import Keyselement = driver.find_element(By.ID, "kw")# 輸入文字 + 回車
element.send_keys("Selenium", Keys.ENTER)# 組合操作
actions = ActionChains(driver)
actions.key_down(Keys.SHIFT).send_keys("selenium").key_up(Keys.SHIFT).perform() # 大寫輸入
鍵 | 描述 |
---|---|
Keys.ENTER | 回車 |
Keys.TAB | Tab 鍵 |
Keys.ESCAPE | Esc |
Keys.BACKSPACE | 刪除 |
Keys.CONTROL | Ctrl |
Keys.ALT | Alt |
Keys.SHIFT | Shift |
Keys.ARROW_UP/DOWN/LEFT/RIGHT | 上下左右方向鍵 |
Keys.DELETE | 刪除鍵 |
Keys.COPY | Ctrl+C(復制) |
Keys.PASTE | Ctrl+V(粘貼) |
元素等待
隱式等待(全局等待)
from selenium import webdriverdriver = webdriver.Chrome()
driver.implicitly_wait(10) # 設置全局等待時間 10 秒driver.get("https://www.baidu.com")
driver.find_element("id", "kw").send_keys("ChatGPT")
顯式等待
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 ECdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")# 顯式等待:最多等待 10 秒,直到元素出現
search_box = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "kw"))
)
search_box.send_keys("ChatGPT")
顯式與隱式區別:
-
作用域:隱式為全局元素,顯式等待為單個元素有效
-
使用方法:隱式等待直接通過驅動對象調用,而顯式等待方法封裝在
WebDriverWait
類中 -
達到最大超時時長后拋出的異常不同:隱式為
NoSuchElementException
,顯式等待為TimeoutException
下拉框
Select 類用于操作 select
標簽
#實例化對象:
select = Select (element)
element: <select>標簽對應的元素,通過元素定位方式獲取,
例如:driver.find_element_by_id ("selectA")
方法:
- select_by_index (index) --> 根據 option 索引來定位,從 0 開始
- select_by_value (value) --> 根據 option 屬性 value 值來定位
- select_by_visible_text (text) --> 根據 option 顯示文本來定位