python
"""
目标:
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
)
python
element.send_keys("hello") # 输入字符串
element.send_keys(Keys.ENTER) # 模拟回车
element.send_keys("123", Keys.TAB) # 输入 123 后按下 TAB
XPath基本语法
假设有 HTML:
html
<div id="loginBox">
<input id="userA" type="text" placeholder="用户名">
<input id="passwordA" type="password" placeholder="密码">
<button>登录</button>
</div>
(1) 按标签定位
python
driver.find_element(By.XPATH, "//input") # 找第一个 input 元素
-
//
表示 从任意位置开始查找 -
input
是标签名
(2) 按属性定位
python
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) 按文本定位
python
driver.find_element(By.XPATH, "//button[text()='登录']").click()
text()
用于匹配标签的可见文本
(4) 模糊匹配 / contains
python
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:
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 定位
python
driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("admin")
#userA
→ 选择 id 为userA
的元素
(2) 按 class 定位
python
driver.find_element(By.CSS_SELECTOR, ".login-btn").click()
.login-btn
→ 选择 class 包含login-btn
的元素
(3) 按标签+class
python
driver.find_element(By.CSS_SELECTOR, "button.login-btn").click()
button.login-btn
→ 限制标签为<button>
且 class 包含login-btn
(4) 按属性定位
python
driver.find_element(By.CSS_SELECTOR, "input[placeholder='用户名']").send_keys("admin")
driver.find_element(By.CSS_SELECTOR, "input[type='password']").send_keys("123456")
-
[属性名='值']
→ 匹配属性值 -
也可以模糊匹配:
python
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()
执行
python
# 导包
from selenium.webdriver import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = 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() |
键盘操作
python
from selenium.webdriver.common.keys import Keys
element = 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(粘贴) |
元素等待
隐式等待(全局等待)
python
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 设置全局等待时间 10 秒
driver.get("https://www.baidu.com")
driver.find_element("id", "kw").send_keys("ChatGPT")
显式等待
python
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://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
标签
python
#实例化对象:
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 显示文本来定位