什么是 Selenium
Selenium是一个开源的Web应用程序自动化测试工具集。它允许开发者和测试人员编写自动化脚本来测试Web应用程序在不同浏览器和操作系统上的行为。
Selenium 组件
1. Selenium WebDriver
WebDriver是Selenium的核心组件,它直接与浏览器进行交互。WebDriver的主要特点是支持多种浏览器,包括Chrome、Firefox、Edge、Safari等。
功能特点
- 支持多种编程语言:Java、Python、C#、Ruby、JavaScript等。
- 能够模拟用户操作:如点击、输入、滚动、选择下拉框、提交表单等。
- 支持浏览器扩展:可以在浏览器中执行JavaScript、管理Cookie等。
- 提供丰富的等待机制:如显式等待、隐式等待、FluentWait等。
2. Selenium IDE
Selenium IDE是一款浏览器扩展(支持Chrome和Firefox),用于录制和回放测试用例。它主要适用于创建简单的测试脚本和快速原型设计。
功能特点
- 录制用户操作并生成脚本。
- 支持调试和测试脚本回放。
- 生成的脚本可以导出为多种编程语言格式,供WebDriver使用。
3. Selenium Grid
Selenium Grid允许用户将测试分布到多台机器上并行运行,极大地提高了测试效率。它由一个Hub和多个Node组成,Hub负责分配任务,Node负责执行测试。
功能特点
- 支持分布式测试:可以在不同的操作系统和浏览器组合上执行测试。
- 提高测试效率:通过并行运行测试缩短测试时间。
- 易于扩展:可以根据需要添加更多的Node以增加并行测试能力。
4. Selenium RC(Remote Control)
Selenium RC是Selenium的早期版本,它通过注入JavaScript代码来与浏览器交互。由于其复杂性和较低的性能,Selenium RC逐渐被Selenium WebDriver取代。
功能特点
- 支持多浏览器和多平台测试。
- 需要启动Selenium Server来管理浏览器会话。
- 由于其架构上的限制,执行速度较慢。
Selenium 应用场景
- 功能测试:验证Web应用程序的各项功能是否按预期工作。
- 回归测试:在应用程序更新后,验证以前的功能是否仍然正常工作。
- 跨浏览器测试:验证应用程序在不同浏览器上的表现是否一致。
- 性能测试:测量应用程序在不同负载条件下的响应时间和稳定性。
安装 Selenium
pip install selenium
使用之前,例如Google Chrome需要安装Chrome Driver。
Selenium 常用方法
打开一个浏览器,返回driver对象
- webdriver.Chrome():初始化webdriver,并打开一个谷歌浏览器窗口。
- webdriver.Firefox():初始化webdriver,并打开一个火狐浏览器窗口。
- webdriver.Edge():初始化webdriver,并打开一个Microsoft Edge浏览器窗口。
- webdriver.Ie():初始化webdriver,并打开一个IE浏览器窗口。
- webdriver.Safari():初始化webdriver,并打开一个Safari浏览器窗口。
打开一个网页
- driver.get("https://www.baidu.com"):打开一个网页。
查找网页元素标签,返回element对象
driver.find_element():查找一个元素。
driver.find_elements():查找多个元素,返回一个列表。
---driver.find_element(By.ID, "要查找的id"):通过 ID 查找元素。
driver.find_element(By.NAME, "要查找的name"):通过 Name 查找元素。
driver.find_element(By.CLASS_NAME, "要查找的class"):通过类名查找元素。
driver.find_element(By.TAG_NAME, "要查找的标签"):通过标签名查找元素。
driver.find_element(By.CSS_SELECTOR, "css选择器"):通过 CSS 选择器查找元素。
driver.find_element(By.XPATH, "XPath语法"):通过 XPath 查找元素。
driver.find_elements(By.LINK_TEXT, "a标签的全部文本"):通过 a标签的全部文本 查找a标签。
driver.find_element(By.PARTIAL_LINK_TEXT, "a标签的部分文本"):通过 a标签的部分文本 查找a标签。
打印 element 对象的原始文本内容(包括html),用于确认查到的元素是否正确
- element.get_attribute('outerHTML'):获取元素的完整HTML。
- element.get_attribute('innerHTML'):获取元素的内部HTML。
操作元素,如点击、输入文本等
- element.click():点击元素。
- element.send_keys():向元素发送键盘输入。
- element.clear():清除文本框内容。
- element.submit():提交表单。
获取元素属性
- element.text:获取元素的文本内容。
- element.get_attribute("属性名"):获取元素的属性值。
- element.is_displayed():判断元素是否可见。
- element.is_enabled():判断元素是否可用。
- element.is_selected():判断元素是否被选中。
警告框操作
- alert = driver.switch_to.alert alert.accept() # 接受警告框。 alert.dismiss() # 取消警告框。 alert.send_keys("text") # 向警告框发送文本。 alert_text = alert.text # 获取警告框文本。
窗口管理
- driver.maximize_window():最大化窗口。
- driver.minimize_window():最小化窗口。
- driver.fullscreen_window():全屏窗口。
- driver.switch_to.window():切换窗口。
- driver.switch_to.frame():切换到iframe内嵌框架中。
页面内容
- driver.title:获取当前页面的标题。
- driver.current_url:获取当前页面的URL。
- driver.save_screenshot("123.png"):截图并保存为文件,用于处理验证码。
- driver.get_screenshot_as_file("123.png"):截图并保存为文件,用于处理验证码。
- driver.page_source:获取浏览器渲染过的当前页面的网页源代码。
浏览器操作
- driver.back():后退到上一个页面。
- driver.forward():前进到下一个页面。
- driver.refresh():刷新当前页面。
- driver.close():关闭当前标签页。
- driver.quit():关闭整个浏览器。
cookie操作
- driver.get_cookies():获取所有cookie,返回一个列表。当登录很难通过自动化跳过的时候,我们可以先手动登录后,然后拿到登录后的cookie再进行自动化操作。
- driver.add_cookie({"name": "my_cookie", "value": "my_value"}):添加一个cookie。
- driver.delete_cookie("CookieName"):删除一个cookie。
- driver.delete_all_cookies():删除所有cookie。
js操作
- driver.execute_script():执行js脚本。
等待
- 隐式等待,全局配置。
- 显示等待,特定条件。
使用 Selenium
示例:点击操作
打开谷歌浏览器,打开百度,搜索Python,点击搜索按钮
代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 初始化webdriver,并打开一个谷歌浏览器窗口。
driver = webdriver.Chrome()
# 打开百度网页
driver.get("https://www.baidu.com")
# 找到输入框,输入Python
driver.find_element(By.ID, "kw").send_keys("Python")
# 找到点击按钮,点击搜索
driver.find_element(By.ID, "su").click()
# 等待10秒看到效果后再关闭浏览器
time.sleep(10)
# 关闭浏览器
driver.quit()
效果
示例:切换标签页
有些网页按钮点击后会打开一个新的标签页,这时就需要对标签也进行切换。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 初始化webdriver,并打开一个谷歌浏览器窗口。
driver = webdriver.Chrome()
# 打开58同城页面
driver.get("https://58.com/")
# 获取当前标签页句柄
current_window_handle = driver.current_window_handle
print(current_window_handle) # FCBC3DAA1F89B4DEA4010D4B23B492BD
# 找到租房标签,并点击
driver.find_element(By.LINK_TEXT, "整租").click()
# 获取所有打开的窗口句柄
window_handles = driver.window_handles
print(window_handles) # ['FCBC3DAA1F89B4DEA4010D4B23B492BD', '7A354E5F0DEB387FC70DBC44B32FE826']
time.sleep(2)
# 切换标签, 通过下标的方式切换到第二个标签
driver.switch_to.window(window_handles[1])
time.sleep(2)
# 再切回原来的标签
driver.switch_to.window(current_window_handle)
# 等待5秒看到效果后再关闭浏览器
time.sleep(5)
# 关闭浏览器
driver.quit()
示例:切换iframe
A网页中有iframe标签,Selenium只能操作A网页中的标签,不能操作A网页中的iframe内容,这是就需要切换到iframe中对iframe进行操作。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 初始化webdriver,并打开一个谷歌浏览器窗口。
driver = webdriver.Chrome()
# 打开qq空间登录页面
driver.get("https://qzone.qq.com")
# 找到 iframe 内嵌框架
iframe = driver.find_element(By.ID, "login_frame")
# 切换到 iframe 中
driver.switch_to.frame(iframe)
# ### 对 iframe 中的标签进行操作。进行登录操作
# 找到密码登录按钮,并点击
driver.find_element(By.ID, "switcher_plogin").click()
# 找到账号密码输入框
driver.find_element(By.ID, "u").send_keys("123456") # 输入账号
driver.find_element(By.ID, "p").send_keys("******") # 输入密码
# 点击登录按钮
driver.find_element(By.ID, "login_button").click()
# 等待5秒看到效果后再关闭浏览器
time.sleep(5)
# 关闭浏览器
driver.quit()
示例:设置Cookie,让页面保持登录状态
from selenium import webdriver
# 初始化webdriver,并打开一个谷歌浏览器窗口。
driver = webdriver.Chrome()
# 打开百度网页
driver.get("https://www.baidu.com")
# 手动登录成功后得到的cookies
cookies_str = """
BIDUPSID=CC4827F65EB646623A40EA983422;
PSTM=1721888622;
BAIDUID=1A44143B308E4D3654CD7F55D4A14DAE:FG=1;
BD_UPN=12314753;
H_WISE_SIDS_BFESS=60359_60467_60492_60498;
BDUSS=JqVHVDZFE3TmhXTX5WRGpHLUlCem9RbnNraFlWL0oWai9KFmT3;
BDUSS_BFESS=Jq3TmhXTX5WRGpHLUlCem9RbnNraFlWY0Et0oWai9KFmT3;
H_PS_PSSID=60359_60467_60492_60498_60525;
BDORZ=B490B5EBF6F3CD402E515D22BCDA1598;
H_WISE_SIDS=60359_60467_60492_60498_60525;
BAIDUID_BFESS=1A44143B308E4D3654CD7F55D4A14DAE:FG=1;
BA_HECTOR=002ka0a42ha4ah0k840k80802pca6s1ja76221v;
ZFY=:BtGYakqjwNMcMZ0x1hnTXHE:BTMhqWCcHBiy8WR613xA:C;
baikeVisitId=062f74cc-27fa-40f9-9339-f74429b6c28a;
COOKIE_SESSION=4_1_7_10_2_4351_0_0_3_1722021600_1722021597%7C9%2324409_3_1722021597%7C2
"""
# 添加cookie
cookie_dict = {item.split("=")[0].strip(): item.split("=")[1].strip() for item in cookies_str.split("; ")}
for cookie in cookie_dict.items():
driver.add_cookie({"name": cookie[0], "value": cookie[1]})
# 刷新当前页面
driver.refresh()
# 等待10秒看到效果后再关闭浏览器
# time.sleep(10)
# 关闭浏览器
# driver.quit()
示例:对标签执行js脚本
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 初始化WebDriver(以Chrome为例)
driver = webdriver.Chrome()
try:
# 打开百度网站
driver.get("https://www.baidu.com")
# 获取元素并使用JavaScript设置属性
element = driver.find_element(By.ID, "kw")
driver.execute_script("arguments[0].setAttribute('style', 'background: yellow;');", element)
# 使用JavaScript获取元素属性
style = driver.execute_script("return arguments[0].getAttribute('style');", element)
print("Element style:", style)
finally:
time.sleep(10)
# 关闭浏览器
driver.quit()
示例:使用js设置Cookie
from selenium import webdriver
import time
# 初始化WebDriver(以Chrome为例)
driver = webdriver.Chrome()
try:
# 打开百度网站
driver.get("https://www.baidu.com")
# 使用JavaScript添加Cookie
driver.execute_script("document.cookie = 'my_test_cookie=test_value';")
# 使用JavaScript获取所有Cookies
cookies = driver.execute_script("return document.cookie;")
print("添加新cookie后的所有cookie:", cookies)
# 使用JavaScript删除Cookie
driver.execute_script("document.cookie = 'my_test_cookie=test_value; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'")
# 使用JavaScript再次获取所有Cookies
cookies = driver.execute_script("return document.cookie;")
print("删除测试cookie后的所有cookie:", cookies)
finally:
time.sleep(200)
# 关闭浏览器
driver.quit()
示例:使用js让页面滚动
from selenium import webdriver
import time
# 初始化WebDriver
driver = webdriver.Chrome()
# 打开一个网站
driver.get("https://58.com")
# js代码
js = """
window.scrollTo(0, 500);
"""
# 使用JavaScript让页面向下滚动500个像素
driver.execute_script(js)
time.sleep(5)
# 关闭浏览器
driver.quit()
示例:隐式等待
隐式等待是一种全局设置,它会告诉 WebDriver 在查找元素时等待一段固定的时间。在此期间,如果元素找到了,操作会立即继续;如果在指定时间内没有找到,WebDriver 会抛出
NoSuchElementException。
from selenium import webdriver
from selenium.webdriver.common.by import By
# 初始化 WebDriver
driver = webdriver.Chrome()
try:
# 设置隐式等待时间为10秒
driver.implicitly_wait(10)
# 打开淘宝网页
driver.get("https://taobao.com")
# 尝试查找一个晚些出现的元素
element = driver.find_element(By.XPATH, '//*[@id="J_TbPicks"]/div/div[2]/div[7]/a/div[5]')
except Exception as e:
print(e)
finally:
driver.quit()
示例:显示等待
显示等待是一种针对特定条件的等待机制,它会等待直到某个条件成立(例如,某个元素在页面中出现、可见、可点击)。显示等待使用
WebDriverWait
类和
expected_conditions
模块来实现。
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
# 初始化 WebDriver
driver = webdriver.Chrome()
# 打开一个网页
driver.get("https://baidu.com")
# 设置显示等待时间为10秒
wait = WebDriverWait(driver, 10)
# =====================================================================
# 等待某个元素的出现
element1 = wait.until(EC.presence_of_element_located((By.ID, "元素id")))
# =====================================================================
# 等待元素可点击
element2 = wait.until(EC.element_to_be_clickable((By.ID, '元素id')))
# 对元素进行点击操作
element2.click()
# =====================================================================
# 等待元素可见
element3 = wait.until(EC.visibility_of_element_located((By.ID, '元素id')))
# 获取元素的文本内容
element_text = element3.text
print(f'Element text: {element_text}')
示例:启用无头模式
无头模式(即不显示浏览器窗口)。
from selenium import webdriver
# 设置 Chrome 选项以启用无头模式
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu') # 如果你使用的是 Windows 系统,需要加上这行
# 初始化webdriver
driver = webdriver.Chrome(options=options)
# 打开百度网页
driver.get("https://www.baidu.com")
# 打印 title
print(driver.title)
# 关闭浏览器
driver.quit()
示例:设置代理
from selenium import webdriver
# 设置代理服务器地址和端口
proxy = "http://111.111.111.xxx:port"
# 设置代理
options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=%s' % proxy)
# 初始化webdriver
driver = webdriver.Chrome(options=options)
# 打开百度网页
driver.get("https://www.baidu.com")
# 打印 title
print(driver.title)
# 关闭浏览器
driver.quit()
示例:修改User-Agent请求头
from selenium import webdriver
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/25'
# 修改 User-Agent
options = webdriver.ChromeOptions()
options.add_argument('--user-agent=%s' % user_agent)
# 初始化webdriver
driver = webdriver.Chrome(options=options)
# 打开百度网页
driver.get("https://www.baidu.com")
# 打印 title
print(driver.title)
# 关闭浏览器
# driver.quit()
版权归原作者 又逢乱世 所有, 如有侵权,请联系我们删除。