Selenium

目录

什么是 Selenium

Selenium 组件

1. Selenium WebDriver

2. Selenium IDE

3. Selenium Grid

4. Selenium RC(Remote Control)

Selenium 应用场景

安装 Selenium

Selenium 常用方法

使用 Selenium

示例:点击操作

示例:切换标签页

示例:切换iframe

示例:对标签执行js脚本

示例:使用js设置Cookie

示例:使用js让页面滚动

示例:隐式等待

示例:显示等待

示例:启用无头模式


什么是 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()

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又逢乱世

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值