目录
- 一、web自动化测试环境搭建
- 二、web自动化测试第一个脚本
- 三、selenium 8种定位方式
- 3.1、通过id定位
- 3.2、通过name定位
- 3.3、通过tag_name(标签名)定位
- 3.4、通过class值进行定位
- 3.5、通过链接文本定位
- 3.6、通过部分链接文本定位
- 3.7、通过xpath定位
- 3.8、通过css选择器定位
- 3.9、定位动态元素
- 3.10、定位带空格的复合class属性
- 三、元素常用操作
- 四、页面常用操作
- 4.1、浏览器操作
- 4.2、键盘操作 keys
- 4.3、鼠标操作 ActionChains
- 4.4、JS操作
- 4.4.1、日期控件
- 4.4.2、滚动条
- 4.5、下拉列表
- 4.6、弹出框、警告框
- 4.7、文件上传
- 五、三大等待
- 5.1、强制等待 time.sleep()
- 5.2、智能等待(隐式等待) driver.implicitly_wait()
- 5.3、显示等待
- 六、三大切换
- 6.1、窗口切换
- 6.2、切换iframe或frame
- 6.3、
- 七、常用方法封装
一、web自动化测试环境搭建
1、安装selenium(第三方库)
cmd命令:pip install selenium
2、安装浏览器(谷歌浏览器)
常见浏览器:chrome浏览器、Firefox浏览器
3、安装浏览器驱动
谷歌浏览器驱动:chromedriver.exe
Firefox浏览器驱动:geckodirver.exe
特别注意事项:下载驱动版本必须与浏览器的版本一致
二、web自动化测试第一个脚本
from selenium import webdriver
# 创建浏览器对象
driver = webdriver.Chrome()
# 访问百度
driver.get("https://www.baidu.com")
执行后,自动访问了百度
三、selenium 8种定位方式
3.1、通过id定位
driver.find_element_by_id()
示例:
①、F12获取输入框元素的id值
②、执行代码
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 强制等待2s
time.sleep(2)
# 定位搜索框
el_select = driver.find_element_by_id("kw")
# 输入csdn
el_select.send_keys("csdn")
③、执行后效果
3.2、通过name定位
driver.find_element_by_name()
示例:还是百度的搜索框
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 强制等待2s
time.sleep(2)
# 定位搜索框
el_select = driver.find_element_by_name("wd")
# 输入csdn
el_select.send_keys("csdn")
3.3、通过tag_name(标签名)定位
该元素要么唯一,要么第一位,一般不用此方法
el_select = driver.find_element_by_tag_name("input")
3.4、通过class值进行定位
driver.find_element_by_class_name()
示例:还是百度的搜索框
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 强制等待2s
time.sleep(2)
# 定位搜索框
el_select = driver.find_element_by_class_name("s_ipt")
# 输入csdn
el_select.send_keys("csdn")
3.5、通过链接文本定位
driver.find_element_by_link_text()
示例:
①、例如想定位百度网页的新闻,并点击
②、执行代码
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 强制等待2s
time.sleep(2)
# 定位新闻
el_click = driver.find_element_by_link_text("新闻")
# 点击新闻
el_click.click()
3.6、通过部分链接文本定位
driver.find_element_by_partial_link_text()
示例:还是定位百度网页的新闻,并点击
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 强制等待2s
time.sleep(2)
# 定位含有新的链接(新闻)
el_click = driver.find_element_by_partial_link_text("新")
# 点击
el_click.click()
3.7、通过xpath定位
driver.find_elements_by_xpath()
3.8、通过css选择器定位
driver.find_element_by_css_selector()
3.9、定位动态元素
如163邮箱登录iframe标签中id值末尾是一串动态的数字
①、contains 包含某字符串的元素
//标签名[contains(@元素名, '元素值')]
el_iframe = driver.find_element_by_xpath('//*[contains(@id,"x-URS-iframe")]')
②、starts-with 以某字符串开始的元素
//标签名[starts-with(@元素名, '元素值')]
el = driver.find_element_by_xpath('//*[starts-with(@id,"x-URS-iframe")]')
③、ends-with 以某字符串结尾的元素
//标签名[ends-with(@元素名, '元素值')]
el = driver.find_element_by_xpath('//*[ends-with(@id,"xxxx")]')
3.10、定位带空格的复合class属性
下图可以看出class值有空格,如果直接用class_name的方式定位,会报错,此时可以采用css_selector方式定位
driver.find_element_by_css_selector('[class="title-content c-link c-font-medium c-line-clamp1"]')
三、元素常用操作
方法或属性 | 说明 |
---|---|
el.send_keys() | 输入数据 |
el.clear() | 清除数据 |
el.text | 获取文本内容 |
el.get_attribute | 获取属性值 |
el.submit() | 提交 |
示例代码:为了看清效果,加了好多等待😂
from selenium import webdriver
import time
driver = webdriver.Chrome()
# 访问百度
url_bd = "https://www.baidu.com"
driver.get(url_bd)
# 浏览器最大化
driver.maximize_window()
time.sleep(2)
# 定位搜索框
el = driver.find_element_by_id("kw")
# 打印元素的属性
print(el.get_attribute('id'))
time.sleep(1)
# 输入csdn
el.send_keys("csdn")
time.sleep(2)
# 清除元素的内容
el.clear()
time.sleep(1)
# 刷新浏览器
driver.refresh()
time.sleep(1)
# 定位新闻
el2 = driver.find_element_by_link_text("新闻")
# 打印元素的文本
print(el2.text)
四、页面常用操作
4.1、浏览器操作
方法 | 说明 |
---|---|
get(url) | 浏览器发送请求 |
maximize_window() | 浏览器最大化 |
back() | 浏览器后退 |
forward() | 浏览器前进 |
refresh() | 刷新浏览器 |
close() | 关闭当前页面 |
quit() | 关闭浏览器 |
示例代码:
from selenium import webdriver
import time
driver = webdriver.Chrome()
# 访问百度
url_bd = "https://www.baidu.com"
driver.get(url_bd)
# 浏览器最大化
driver.maximize_window()
time.sleep(2)
# 访问58
url_58 = "https://tj.58.com/"
driver.get(url_58)
# 页面后退
driver.back()
time.sleep(1)
# 页面前进
driver.forward()
time.sleep(1)
# 刷新页面
driver.refresh()
time.sleep(1)
# 关闭浏览器
driver.quit()
close()场景
from selenium import webdriver
import time
driver = webdriver.Chrome()
# 访问百度
url_bd = "https://www.baidu.com"
driver.get(url_bd)
# 浏览器最大化
driver.maximize_window()
time.sleep(2)
# 定位新闻
el = driver.find_element_by_link_text("新闻")
# 点击新闻
el.click()
time.sleep(1)
# 打印当前页面url
print(driver.current_url)
# 关闭当前页面
driver.close()
上述代码,虽然点击新闻后到了新页面,但通过driver.current_url可以看出当前页面还是百度首页,所以关闭当前页面操作关闭的是百度首页,执行后只剩下新闻页面
4.2、键盘操作 keys
需要先导包
from selenium.webdriver.common.keys import Keys
方法 | 说明 |
---|---|
send_keys(Keys.CONTROL,“a”) | 全选 |
send_keys(Keys.CONTROL,“c”) | 复制 |
send_keys(Keys.CONTROL,“x”) | 剪切 |
send_keys(Keys.CONTROL,“v”) | 粘贴 |
代码示例:
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
# 访问百度
url_bd = "https://www.baidu.com"
driver.get(url_bd)
# 浏览器最大化
driver.maximize_window()
time.sleep(2)
# 定位搜索框
el = driver.find_element_by_id("kw")
# 输入csdn
el.send_keys("csdn")
# ctrl+a
el.send_keys(Keys.CONTROL,"a")
time.sleep(1)
# ctrl+x
el.send_keys(Keys.CONTROL,"x")
time.sleep(1)
# ctrl+v
el.send_keys(Keys.CONTROL,"v")
time.sleep(1)
# ctrl+c
el.send_keys(Keys.CONTROL,"c")
4.3、鼠标操作 ActionChains
需要先导包
from selenium.webdriver import ActionChains
方法 | 说明 |
---|---|
ActionChains(driver).context_click(el).perform() | 点击鼠标右键,el为元素 |
ActionChains(driver).double_click(el).perform() | 鼠标双击 |
ActionChains(driver).move_to_element(el).perform() | 鼠标悬停 |
4.4、JS操作
4.4.1、日期控件
4.4.2、滚动条
# 通过JavaScript设置浏览器窗口的滚动条位置
js1 = "window.scrollTo(100, 450);"
driver.execute_script(js1)
# 实现滚动条从顶部到底部
js2 = "scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js2)
# 实现滚动条从浏览器底部到顶部
js3 = "scrollTo(document.body.scrollHeight,0)"
driver.execute_script(js3)
# 操作哪个元素,滚动条移动到元素附近(元素与页面的顶部对齐,元素与页面的底部对齐)
el = driver.find_element_by_xpath('//*[@id="3"]/h3/a/em')
# 元素与页面的底部对齐
js4 = "arguments[0].scrollIntoView(false);"
driver.execute_script(js4, el)
# 元素与页面的顶部对齐
js5 = "arguments[0].scrollIntoView(true);"
driver.execute_script(js5, el)
示例场景:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 设置浏览器窗口大小,以保证能看到横向和纵向滑动条
driver.set_window_size(800, 600)
# 定位输入框并输入selenium
driver.find_element_by_id("kw").send_keys("selenium")
# 点击百度一下按钮
driver.find_element_by_id("su").click()
time.sleep(2)
# 定位元素:selenium安装教程 - 相关博客 - 开发者搜索
el = driver.find_element_by_xpath('//*[@id="3"]/h3/a/em')
# 滑动到元素与页面的底部对齐
js4 = "arguments[0].scrollIntoView(false);"
driver.execute_script(js4, el)
# 关闭浏览器
driver.quit()
4.5、下拉列表
F12查看元素有select标签,说明可以使用下拉l列表的方法,这里使用的是自己本地的一个html文件
html文件:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
</head>
<body>
<p>今天吃什么</p>
<select name="eatwhate" id="eathow">
<option value="gbjd">宫保鸡丁</option>
<option value="mlt">麻辣烫</option>
<option value="yxrs">鱼香肉丝</option>
<option value="gbr">锅包肉</option>
<option value="hgj">火锅鸡</option>
</select>
</body>
</html>
先导入:
from selenium.webdriver.support.select import Select
# 创建对象
selsub = Select(下拉菜单元素)
方法 | 说明 |
---|---|
selsub.select_by_value() | 通过value值选择 |
selsub.select_by_visible_text() | 通过选项名称选择 |
selsub.select_by_index() | 通过选项索引值选择,从0开始 |
示例代码
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time
driver = webdriver.Chrome()
# 访问本地的html文件地址
driver.get('file:///C:/Users/Administrator/Desktop/%E4%B8%8B%E6%8B%89%E6%A1%86.html')
driver.maximize_window()
el = driver.find_element_by_xpath('//*[@id="eathow"]')
# 创建Select对象
selsub = Select(el)
# 通过value值选择
selsub.select_by_value('yxrs')
time.sleep(1)
# 通过选项名称选择
selsub.select_by_visible_text('火锅鸡')
time.sleep(1)
# 通过选项索引值选择,从0开始
selsub.select_by_index(3)
time.sleep(1)
driver.quit()
4.6、弹出框、警告框
4.7、文件上传
1、input标签
F12查看元素,如果是通过input标签实现的上传功能,可以通过输入的方法即通过send_keys()指定文件路径实现文件上传
示例代码:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get(r"file:///C:/Users/Administrator/Desktop/test.html")
time.sleep(4)
# 定位选择文件元素
el_file=driver.find_element_by_id("f1")
# 输入文件路径
el_file.send_keys(r"C:\Users\Administrator\Pictures\测试图片\滑稽.jpg")
test.html文件代码参考:
<form action="/upload" method="post" enctype="multipart/form-data">
姓名: <input type="text" name="username"><br>
年龄: <input type="text" name="age"><br>
头像: <input type="file" name="image" id="f1"><br>
<input type="submit" value="提交">
</form>
.2、非input标签
①、使用第三方库pywin32
安装命令:pip install pywin32
from selenium import webdriver
import win32con
import win32gui
from selenium.webdriver import ActionChains
import time
import os
driver = webdriver.Chrome()
driver.get(r"file:///C:/Users/Administrator/Desktop/test.html")
time.sleep(4)
# 定位选择文件元素
el_file=driver.find_element_by_id("f1")
# 点击选择文件
ActionChains(driver).move_to_element(el_file).click().perform()
def upload(filePath, browser_type="Chrome"):
if browser_type == "Chrome":
title = "打开"
else:
title = "文件上传"
# 根据spy++工具判断需要上传文件的窗口为几级窗口,输入文件路径的文本框有四级目录:#32770‐ComboBoxEx32 ‐ComboBox ‐Edit
# 定位一级窗口 ‘打开’,即弹出的Windows界面
dialog = win32gui.FindWindow("#32770", title)
# 二级窗口
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None)
# 三级窗口
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, "ComboBox", None)
# 定位到四级窗口,文件名输入框
edit = win32gui.FindWindowEx(ComboBox, 0, "Edit", None)
# 定位打开按钮,打开按钮只有两级目录:#32770‐Button 四级
button = win32gui.FindWindowEx(dialog, 0, "Button", None)
# 判断传参filePath路径是否存在
if os.path.exists(filePath):
# 文件名编辑框中输入文件路径
win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filePath)
time.sleep(2)
# 点击打开按钮
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)
else:
# 抛出异常
raise(filePath + "文件不存在")
filepath = r"C:\Users\Administrator\Pictures\测试图片\滑稽.jpg"
time.sleep(5)
# 调用upload方法并传入参数
upload(filePath=filepath)
print("文件上传成功")
time.sleep(5)
driver.quit()
②、第三方工具pyautogui
安装: pip install pyautogui
五、三大等待
5.1、强制等待 time.sleep()
使用时需先导包
import time
5.2、智能等待(隐式等待) driver.implicitly_wait()
给页面上所有的元素设置全局等待时间,只要在设置的时间范围内找到了元素,就会执行下一个代码,设置最多等待的时间
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(20)
url = 'https://www.baidu.com/'
driver.get(url)
5.3、显示等待
等待当前需要操作的元素 基于多种条件+等待元素
多种条件:等待元素可见?等待url跳转为xxx?等待新窗口出现?很多场景条件
from selenium import webdriver
# 导入By
from selenium.webdriver.common.by import By
# 导入webdriver等待类
from selenium.webdriver.support.ui import WebDriverWait
# 导入预期条件设置类
from selenium.webdriver.support import expected_conditions as EC
# 创建一个浏览器
driver = webdriver.Chrome()
# 访问百度
url = 'http://www.baidu.com'
driver.get(url)
# 浏览器总共等待10秒,在10秒内,每隔0.5秒去使用id的方式定位一下元素,如果定位到,就结束等待,如果定位不到同时没有大于10秒,则继续等待
el = WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID,'lg')))
以显示等待为主,以强制等待为辅
六、三大切换
6.1、窗口切换
在页面点击某个链接后,会再打开一个标签页,想在新标签页上进行操作,需要先切换窗口,句柄是窗口的唯一标识,所以只需要切换句柄,就能到对应的标签页进行操作
# 获取窗口句柄列表
wins = driver.window_handles
# 切换到对应窗口
driver.switch_to.window(wins[0])
代码示例:
from selenium import webdriver
import time
# 创建一个浏览器对象
driver = webdriver.Chrome()
# 访问58
url = "https://tj.58.com/"
driver.get(url)
el = driver.find_element_by_link_text("租房")
# 打印当前浏览器句柄
print("点击之前的浏览器句柄是:", driver.window_handles)
print("点击之前的url地址是:", driver.current_url)
el.click()
print("点击之后的浏览器句柄是:", driver.window_handles)
print("点击之后的url地址是:", driver.current_url)
time.sleep(1)
wins = driver.window_handles
# 切换到之前的窗口
driver.switch_to.window(wins[0])
6.2、切换iframe或frame
方法 | 说明 |
---|---|
driver.switch_to.frame(a) | 切换框架,其中a可以是frame元素的name值、id值、索引值或 frame 对应的元素对象 |
driver.switch_to.default_content() | 切换到最外层框架 |
driver.switch_to.parent_frame() | 切换到上一层框架 |
有时候元素定位不到,可能是在iframe框架中,需要先切换到框架内,在进行定位,例如163邮箱登录页面,账号框和密码框以及登录按钮等都在iframe标签内
代码示例:
from selenium import webdriver
import time
driver = webdriver.Chrome()
# 打开163邮箱
driver.get('http://mail.163.com/')
# 浏览器最大化
driver.maximize_window()
time.sleep(5)
# 定位登录框对应的iframe元素
el_iframe = driver.find_element_by_xpath('//*[contains(@id,"x-URS-iframe")]')
# 切换到iframe中
driver.switch_to.frame(el_iframe)
# 定位账号输入框
email = driver.find_element_by_name('email')
# 输入邮箱账号
email.send_keys('ceshi@163.com')
# 定位密码输入框
password = driver.find_element_by_name('password')
# 输入密码
password.send_keys('123456')
# 定位登录按钮
login_btn = driver.find_element_by_id('dologin')
# 点击登陆按钮
login_btn.click()
time.sleep(3)