文章目录
- (一)元素操作
-
- [1. 为什么要学习操作元素的方法?](#1. 为什么要学习操作元素的方法?)
- [2. 元素常用操作方法](#2. 元素常用操作方法)
- [3. 案例](#3. 案例)
- (二)操作浏览器
- (三)获取元素信息
- (四)鼠标和键盘操作
- (五)元素等待
(一)元素操作
1. 为什么要学习操作元素的方法?
① 需要让脚本模拟用户给指定元素输入值
② 需要让脚本模拟人为删除元素的内容
③ 需要让脚本模拟点击操作
2. 元素常用操作方法
① click()------单击元素
② send_keys(value)------模拟输入
③ clear()------清除文本
3. 案例
需求:打开注册A.html页面,完成以下操作:
-
通过脚本执行输入用户名:
admin;密码:123456;电话号码:18611111111;电子邮件:123@qq.com -
间隔 3 秒,修改电话号码为:
18622222222 -
间隔 3 秒,点击"注册"按钮
-
元素定位方法不限
- 修改电话号码,先清除在输入新的号码
clear()- 点击按钮
click()
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)
try:
driver.find_element(By.CSS_SELECTOR, '#userA').send_keys('admin')
driver.find_element(By.CSS_SELECTOR, '#passwordA').send_keys('123456')
driver.find_element(By.CSS_SELECTOR, '.telA').send_keys('18611112222')
driver.find_element(By.CSS_SELECTOR, '#emailA').send_keys('123@qq.com')
sleep(2)
driver.find_element(By.CSS_SELECTOR, '.telA').clear()
driver.find_element(By.CSS_SELECTOR, '.telA').send_keys('18622223333')
sleep(2)
driver.find_element(By.CSS_SELECTOR, 'button').click()
sleep(2)
finally:
driver.quit()

2秒后:

2秒后:

2秒后关闭
(二)操作浏览器
| 方法 | 效果 |
|---|---|
maximize_window() |
最大化浏览器窗口 |
set_window_size(width,height) |
设置浏览器窗口大小(像素) |
set_window_position(x,y) |
设置浏览器窗口位置 |
back() |
后退 |
forward() |
前进 |
refresh() |
刷新 |
close() |
关闭当前窗口 |
quit() |
关闭浏览器驱动对象 |
title |
获取页面title |
current_url |
获取当前页面URL |
案例1:
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)
try:
# 将浏览器最大化
driver.maximize_window()
# 暂停2秒
sleep(2)
# 设置固定大小 300*200
driver.set_window_size(300,200)
# 暂停2秒
sleep(2)
# 移动浏览器窗口位置 x:320,y:150
driver.set_window_position(320,150)
# 暂停2秒
sleep(2)
# 最大化
driver.maximize_window()
# 点击访问新浪网站。注意:要演示后退功能,必须先打开新的网站
driver.find_element(By.PARTIAL_LINK_TEXT, '访问').click()
# 暂停2秒
sleep(2)
# 后退------> 注册A.html
driver.back()
# 暂停2秒
sleep(2)
# 前进------>新浪
driver.forward()
# sleep(2)
finally:
driver.quit()
案例2:
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
url = r"E:\CODE\test_study\web_source\day01\注册实例.html"
driver.get(url)
try:
driver.find_element(By.CSS_SELECTOR,'#user').send_keys('admin')
sleep(2)
# 刷新
driver.refresh()
# 获取title
title = driver.title
print('当前页面的title:',title)
# 获取当前url
current_url = driver.current_url
print('当前页面url:',current_url)
# 点击 注册A网页 打开新窗口
driver.find_element(By.PARTIAL_LINK_TEXT,'注册A网页').click()
# 暂停3秒
sleep(3)
# 关闭主窗口
driver.close()
# 暂停2秒
sleep(2)
finally:
driver.quit()

刷新:

打开注册A网页:

然后再退回去:

打印结果:

(三)获取元素信息
| 方法 | 效果 |
|---|---|
size |
返回元素大小 |
text |
获取元素的文本 |
get_attribute('xxx') |
获取属性值,传递的参数为元素的属性名 |
is_displayed() |
判断元素是否可见 |
is_enabled() |
判断元素是否可用 |
is_selected() |
判断元素是否选中,用来检查复选框或单选按钮是否被选中 |
案例:
需求:使用"注册A.html"页面,完成以下操作:
- 获取用户名输入框的大小
- 获取页面上第一个超链接的文本内容
- 获取页面上第一个超链接的地址
- 判断页面中的 span 标签是否可见
- 判断页面中取消按钮是否可用
- 判断页面中"旅游"对应的复选框是否为选中的状态
python
# 相对路径://*[@id="userA"]
# 绝对路径:/html/body/form/div/fieldset/p[1]/input
from gc import enable
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
url = r"E:\CODE\test_study\web_source\day01\注册实例.html"
driver.get(url)
try:
# 获取用户名文本框大小
size = driver.find_element(By.CSS_SELECTOR,'#user').size
print('用户名文本框大小:',size)
# 获取页面上第一个超文本连接内容
text = driver.find_element(By.CSS_SELECTOR,'a').text
print('页面上第一个超文本连接内容:',text)
# 获取页面上第一个超文本连接地址
address = driver.find_element(By.CSS_SELECTOR, 'a').get_attribute('href')
print('页面中第一个超文本连接地址:',address)
# 判断span元素是否可见
display = driver.find_element(By.CSS_SELECTOR,'span').is_displayed()
print('span元素是否可见:',display)
# 判断取消按钮是否可用
enabled = driver.find_element(By.CSS_SELECTOR,'#cancel').is_enabled()
print('取消按钮是否可用:',enabled)
# 判断旅游是否被选中
selected = driver.find_element(By.CSS_SELECTOR,'#ly').is_selected()
print('旅游是否被选中:',selected)
sleep(2)
finally:
driver.quit()

(四)鼠标和键盘操作
一、鼠标操作
常见的鼠标操作有:点击、右击、双击、悬停、拖拽等。
1.1 为什么要操作鼠标?
现在Web产品中存在丰富的鼠标交互方式,作为一个 Web 自动化测试框架,需要应对这些鼠标操作的应用场景。
1.2 鼠标操作的方法
在 Selenium 中,将操作鼠标的方法封装在 ActionChains 类中。
from selenium.webdriver.common.action_chains import ActionChains
实例化对象:
action = ActionChains(driver)
方法:
| 方法 | 效果 |
|---|---|
context_click(element) |
右击 |
double_click(element) |
双击 |
drag_and_drop(source,target) |
拖动 |
move_to_element(element) |
悬停 |
perform() |
执行 |
案例一:右击,双击,悬停,执行
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Chrome()
url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)
try:
# 实例化并获取 ActionChains类
action = ActionChains(driver)
# 定位用户名 在用户名上 右击鼠标,预期:粘贴
username = driver.find_element(By.CSS_SELECTOR,'#userA')
action.context_click(username).perform()
sleep(2)
# 发送用户名 admin,并进行双击。预期:选中 admin
username.send_keys('admin')
action.double_click(username).perform()
sleep(2)
# 移动到注册按钮上,预期:按钮变色
button = driver.find_element(By.CSS_SELECTOR,'button')
action.move_to_element(button).perform()
sleep(2)
finally:
driver.quit()


二、键盘操作
- 模拟键盘上一些按键或者组合键的输入。如:Ctrl+C,Ctrl+V
- Selenium 中把键盘的按键都封装在 Keys 类中
from selenium.webdriver.common.keys import Keys
| 方法 | 键盘 |
|---|---|
send_keys(keys.BACK_SPACE) |
删除键(BackSpace) |
send_keys(Keys.SPACE) |
空格键(Space) |
send_keys(Keys.TAB) |
制表键(Tab) |
send_keys(Keys.ESCAPE) |
回退键(Esc) |
send_keys(Keys.ENTER) |
回车键(Enter) |
send_keys(Keys.CONTROL,'a') |
全选(Ctrl+A) |
send_keys(Keys.CONTROL,'c') |
复制(Ctrl+C) |
案例:
需求:打开注册A页面,完成以下操作:
- 输入用户名:admin1,暂停2秒,删除1
- 全选用户名:admin,暂停2秒
- 复制用户名:admin,暂停2秒
- 粘贴到密码框
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep
driver = webdriver.Chrome()
url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)
try:
username = driver.find_element(By.CSS_SELECTOR, '#userA')
username.send_keys('admin1')
sleep(2)
username.send_keys(Keys.BACKSPACE)
sleep(2)
username.send_keys(Keys.CONTROL,'a')
sleep(2)
username.send_keys(Keys.CONTROL,'c')
sleep(2)
driver.find_element(By.CSS_SELECTOR, '#passwordA').send_keys(Keys.CONTROL,'v')
sleep(2)
finally:
driver.quit()
(五)元素等待
概念:在定位页面元素时如果未找到,会在指定时间内一致等待的过程。
⭐ 为什么要设置元素等待?
① 网络速度慢
② 电脑配置低
③ 服务器处理请求满
一、隐式等待
定位元素时,如果能定位到元素,则直接返回该元素,不触发等待;
如果不能定位到该元素,则间隔一段时间后再去定位元素;
如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常NoSuchElementException。
方法:driver.implicitly_wait(timeout)
(timeout:为等待最大时长,单位:秒)
说明:隐式等待为全局变量设置(只需要设置一次,就会作用于所有元素)
案例:
打开注册A页面,完成以下操作
使用隐式等待定位用户名输入框,如果元素存在,就输入admin
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
# 设置隐式等待10秒
driver.implicitly_wait(10)
url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)
try:
# 给一个错误的id,不能知道,如果直接抛出异常,说明等待失效。
# 如果在设置指定时长以外抛出异常,说明等待生效
driver.find_element(By.CSS_SELECTOR,'#user').send_keys('admin')
sleep(2)
finally:
driver.quit()
二、显式等待
定位指定元素时,如果能定位到元素,则直接返回该元素,不触发等待;
如果不能定位到该元素,则间隔一段时间后再去定位元素;
如果在达到最大时长时还没有找到指定元素,则抛出超时异常TimeoutException。
在 Selenium 中把显式等待的相关方法封装在 WebDriverWait 类中。
- 导入包:
from selenium.webdriver.support.wait import WebDriverWait WebDriverWait(driver,timeout=30,poll_frequency=0.5)- driver:浏览器驱动对象
- timeout:超时的时长,单位:秒
- poll_frequency:检测间隔时间,默认为0.5秒
- 调用方法 untill(method):直到...时
- method:函数名称,该函数用来实现对元素的定位
- 一般使用匿名函数来实现:
lambda x: x.find_element_by_id('userA')
element = WebDriverWait(driver,10,1).untill(lambda x: x.find_element(By.ID,'userA'))
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from time import sleep
driver = webdriver.Chrome()
url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)
# 调用until方法返回的一定是一个元素
WebDriverWait(driver,timeout=10,poll_frequency=0.5).until(lambda x: x.find_element(By.ID,'userA')).send_keys('admin')
# 此时 username 还不是元素,只有代码运行起来才是元素
# username.send_keys('admin')
sleep(2)
driver.quit()