当前位置: 首页 > ops >正文

Selenium

一.快速入门

Selenium是一个开源的Web自动化工具,一般用于测试、爬虫、刷票等场景。

三个组件:

  • Selenium IDE:浏览器插件,生成测试脚本(脚本录制),2021年已经停止更新

  • Selenium WebDriver:让代码控制浏览器模拟用户操作,自动化测试必备组件(最重要)

  • Selenium Grid:分布式扩展,让自动化脚本在多个机器上运行

特点:

  1. 行业标准:WebDriver成为了W3C(World Wide Web Consortium——万维网联盟)标准

  2. 兼容性强:

    1. 支持多语言:python、java、C#、ruby

    2. 支持多浏览器:chrome、Firefox、edge、safari

    3. 支持多环境:Windows、macos、Linux

  3. 生态比较成熟:

    1. 书籍、视频

    2. Appium(App自动化测试):它对外提供的 API 与 Selenium WebDriver 几乎完全一致。如果你会 Selenium,就能非常快速地上手 Appium

    3. pytest:Selenium 本身只是一个“库”,它负责浏览器操作。Selenium 可以与你所能想到的所有主流测试框架完美融合,而 pytest 是 Python 语言中最流行、最强大的代表。

二.Selenium环境搭建

在有python环境的前提下,在终端中

pip install selenium

运行测试代码,测试是否安装成功

from selenium import webdriver  # 导入Selenium的WebDriver模块
driver = webdriver.Chrome()     # 启动Chrome浏览器
driver.get("https://www.bing.com/")  # 控制浏览器访问必应网站
driver.quit()                   # 关闭浏览器

运行结果:

  • 不报错:安装成功

  • 报错:

    • 找不到浏览器Chrome:电脑上没有该浏览器或者安装的浏览器不是来自官网

    • 找不到浏览器驱动ChromeDriver:一般情况下,在找到浏览器后会自动安装ChromeDriver驱动。出现此错误多半是网络问题, 可以手动去安装驱动,或者更换浏览器。

三.Selenium应用示例

能做什么(常见):

  • 一般操作:访问、点击、输入

  • 上下滚动

  • 左右切换

  • 大小缩放(兼容性问题)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import timedef selenium_example():# 1 初始化 Edge WebDriverprint("初始化 Edge 浏览器...")options = webdriver.EdgeOptions()options.add_argument('--disable-blink-features=AutomationControlled')options.add_experimental_option("excludeSwitches", ["enable-automation"])options.add_experimental_option('useAutomationExtension', False)driver = webdriver.Edge(options=options)try:# 设置窗口大小driver.set_window_size(1200, 800)print("浏览器窗口已设置")# 2 访问示例网站(避免百度复杂的反爬机制)print("访问示例网站...")driver.get("https://www.selenium.dev")# 等待页面加载wait = WebDriverWait(driver, 10)wait.until(EC.presence_of_element_located((By.TAG_NAME, "body")))print("页面加载完成")# 3 点击操作 - 点击导航菜单print("尝试点击导航菜单...")try:# 尝试点击文档链接docs_link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Documentation")))docs_link.click()print("成功点击文档链接")time.sleep(2)except Exception as e:print(f"点击文档链接失败: {e}")# 如果点击失败,继续执行其他操作# 4 输入文本 - 在支持输入的页面上操作print("访问有输入框的示例页面...")driver.get("https://www.selenium.dev/selenium/web/web-form.html")# 等待输入框加载text_input = wait.until(EC.element_to_be_clickable((By.NAME, "my-text")))print("输入框已就绪")# 使用JavaScript设置值,避免交互问题driver.execute_script("arguments[0].value = 'Selenium测试文本';", text_input)print("文本输入完成")time.sleep(1)# 5 上下滚动print("执行页面滚动操作...")# 滚动到页面底部driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")print("滚动到底部")time.sleep(1)# 滚动到页面顶部driver.execute_script("window.scrollTo(0, 0);")print("滚动到顶部")time.sleep(1)# 滚动到中间位置driver.execute_script("window.scrollTo(0, 300);")print("滚动到中间")time.sleep(1)# 6 点击提交按钮(使用JavaScript避免交互问题)print("点击提交按钮...")submit_button = driver.find_element(By.CSS_SELECTOR, "button")driver.execute_script("arguments[0].click();", submit_button)print("提交按钮点击完成")time.sleep(2)# 7 左右切换 - 访问不同页面模拟标签页切换print("访问不同页面演示导航...")driver.get("https://www.example.com")print("访问example.com")time.sleep(2)# 执行JavaScript在新标签页打开页面driver.execute_script("window.open('https://www.wikipedia.org', '_blank');")print("新标签页已打开")time.sleep(2)# 获取所有窗口句柄并切换windows = driver.window_handlesif len(windows) > 1:driver.switch_to.window(windows[1])print("切换到新标签页")time.sleep(2)# 在新标签页中操作search_input = wait.until(EC.presence_of_element_located((By.NAME, "search")))driver.execute_script("arguments[0].value = 'Python编程';", search_input)print("在新标签页中输入文本")time.sleep(2)# 切换回原始标签页driver.switch_to.window(windows[0])print("切换回原始标签页")time.sleep(2)# 8 大小缩放 - 使用键盘快捷键print("执行缩放操作...")# 确保页面有焦点body = driver.find_element(By.TAG_NAME, "body")body.click()time.sleep(1)# 使用ActionChains进行缩放actions = ActionChains(driver)actions.key_down(Keys.CONTROL).send_keys(Keys.ADD).key_up(Keys.CONTROL).perform()print("页面放大")time.sleep(1)actions.key_down(Keys.CONTROL).send_keys(Keys.SUBTRACT).key_up(Keys.CONTROL).perform()print("页面缩小")time.sleep(1)# 重置缩放actions.key_down(Keys.CONTROL).send_keys('0').key_up(Keys.CONTROL).perform()print("重置缩放")time.sleep(1)# 9 演示更多滚动操作print("演示更多滚动操作...")driver.get("https://www.selenium.dev/documentation/")# 缓慢滚动演示for i in range(0, 1000, 100):driver.execute_script(f"window.scrollTo(0, {i});")time.sleep(0.2)print("所有操作成功完成!")except Exception as e:print(f"执行过程中出现错误: {e}")# 打印更详细的错误信息import tracebacktraceback.print_exc()finally:# 等待一会儿然后关闭浏览器time.sleep(3)driver.quit()print("Edge 浏览器已关闭")if __name__ == "__main__":print("使用 Edge 浏览器运行 Selenium 示例 ---")selenium_example()

四.两大对象

对象:面向对象

Selenium最开始使用Java开发,几乎所有的用法都是面向对象的风格。

两大对象

  • WebDriver:浏览器操作,浏览器的驱动对象,用来和浏览器交互。

    • 打开网页

    • 页面跳转

    • 大小调整

    • 截图

    • 滚动窗口

    • 切换窗口

    • 获取网页标题、内容、网址

  • WebElement:元素的操作,通过 WebDriver 找到的 页面元素对象

    • 输入

    • 点击

    • 截图

    • 获取内容、大小、位置

五.八种定位

class By:    ID = "id"          # 通过元素的id属性定位XPATH = "xpath"          # 通过元素的XPath路径表达式来定位LINK_TEXT = "link text"             # 通过超链接文本(a标签里的文字)定位PARTIAL_LINK_TEXT = "partial link text"           # 通过超链接文本的一部分定位NAME = "name"        # 通过元素的name属性定位。TAG_NAME = "tag name"           # 通过元素的HTML标签名来定位CLASS_NAME = "class name"            # 通过元素的class属性定位CSS_SELECTOR = "css selector"          # 通过CSS选择器语法定位
  1. 针对链接

    • LINK_TEXT

    • PARTIAL_LINK_TEXT

  2. 针对元素属性

    • ID

    • NAME

    • TAG_NAME

    • CLASS_NAME

  3. 万能方法(最常用)

    • XPATH

    • CSS_SELECTOR

同一个元素可以使用不同的方式进行定位。

六.三大等待

等待元素加载完成

  1. 强制等待:让程序固定暂停一段时间,不管元素是否加载完成。

    # 在元素定位之前,强制等待
    time.sleep(2)
  2. 隐式等待:设置一个全局的等待时间,在查找元素时,如果元素没有立即出现,会在设定时间内不断尝试查找,直到超时。

    # 隐式等待
    driver.implicitly_wait(10)

七.Selenium和pytest集成

Selenium集成pytest

 pip install pytest-selenium

若文件名以test_开头则不用加文件名

pytest --driver chrome --html report.html

test_demo3.py

def test_web(selenium):selenium.get("https://www.baidu.com")assert 1==2

八.测试框架封装

  1. POM 页面对象模型

    POM:Page Object Model 页面对象模型。核心思想是将Web页面抽象成一个类(Class),将页面上的元素定位元素操作封装在这个类的方法中。

    • 使用对象:代表页面

    • 使用对象中的属性:代表页面元素

    • 使用对象中的方法:代表页面的操作

      def test_login_ok(selenium):page = LoginPage(selenium)  # 1.实例化POis_ok = page.login('beifan_1025','beifan_1205')   # 2.调用po方法assert True is is_ok   # 3.断言
  2. KDT 关键字驱动测试

    KDT 是一种自动化测试框架或方法论。它将测试逻辑(做什么)与实现细节(怎么做)彻底分离。测试用例由一系列“关键字”组成,这些关键字代表最基本的操作动作。

    • 关键字:最小的、可复用的操作单元。例如 Open Browser, Input Text, Click Button, Verify Text

    • 测试数据:与关键字配合使用的数据。例如,对于 Input Text 这个关键字,需要提供 定位器 和 要输入的文本 这两组数据。

    • 驱动/引擎:这是框架的核心。它是一个解释器,负责读取关键字和测试数据,并调用对应的代码函数来执行它们。

    • 测试脚本:通常以表格形式(如Excel, CSV)或特定DSL(领域特定语言)存在,它按顺序列出要执行的关键字和所需数据。

http://www.xdnf.cn/news/18536.html

相关文章:

  • 系统思考:突破复杂困境
  • 随机森林2——集成学习的发展
  • EPWpy 安装教程
  • 如何解决 pyqt5 程序“长时间运行失效” 问题?
  • 爬小红书图片软件:根据搜索关键词,采集笔记图片、正文、评论等
  • 在云服务器中使用tmux实现程序24小时运行
  • daily notes[4]
  • Sqlserver存储过程
  • Python入门:从零开始的编程之旅
  • git实战问题(6)git push 时发现分支已被更新,push失败了怎么办
  • GaussDB 数据库架构师修炼(十八) SQL引擎-解析器
  • 学习游戏制作记录(合并更多的技能与技能树)8.23
  • [e3nn] 模型部署 | TorchScript JIT | `@compile_mode`装饰器 | Cython
  • 老年常见疾病及健康管理建议
  • 精斗云智能开单解决方案:高效移动办公新体验
  • Qt/C++开发监控GB28181系统/录像文件回放/自动播放下一个录像文件/倍速回放/录像文件下载
  • openharmony之一多开发:产品形态配置讲解
  • 使用自制的NTC测量模块测试Plecs的热仿真效果
  • 分布式蜜罐系统的部署安装
  • 微服务统一入口——Gateway
  • Redis 从入门到精通:原理、实战与性能优化全解析
  • Flutter BLoC 全面入门与实战(含代码示例)
  • 云计算-K8s 运维:Python SDK 操作 Job/Deployment/Pod+RBAC 权限配置及自定义 Pod 调度器实战
  • 概率论基础教程第六章 随机变量的联合分布(一)
  • FastAPI + SQLAlchemy 数据库对象转字典
  • 解决coze api使用coze.workflows.runs.create运行workflow返回400,但text为空
  • SEO优化工具学习——Ahrefs进行关键词调研(包含实战)
  • 市政道路井盖缺失识别误报率↓82%!陌讯多模态融合算法实战优化与边缘部署
  • ChipCamp探索系列 -- 4. Intel CPU的十八代微架构
  • 【React Native】自定义轮盘(大转盘)组件Wheel