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

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

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

运行结果:

  • 不报错:安装成功

  • 报错:

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

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

三.Selenium应用示例

能做什么(常见):

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

  • 上下滚动

  • 左右切换

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

python 复制代码
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 time


def selenium_example():
    # 1 初始化 Edge WebDriver
    print("初始化 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_handles
        if 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 traceback
        traceback.print_exc()

    finally:
        # 等待一会儿然后关闭浏览器
        time.sleep(3)
        driver.quit()
        print("Edge 浏览器已关闭")


if __name__ == "__main__":
    print("使用 Edge 浏览器运行 Selenium 示例 ---")
    selenium_example()

四.两大对象

**对象:**面向对象

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

两大对象

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

    • 打开网页

    • 页面跳转

    • 大小调整

    • 截图

    • 滚动窗口

    • 切换窗口

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

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

    • 输入

    • 点击

    • 截图

    • 获取内容、大小、位置

五.八种定位

python 复制代码
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. 强制等待:让程序固定暂停一段时间,不管元素是否加载完成。

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

    python 复制代码
    # 隐式等待
    driver.implicitly_wait(10)

七.Selenium和pytest集成

Selenium集成pytest

pip install pytest-selenium

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

pytest --driver chrome --html report.html

test_demo3.py

python 复制代码
def test_web(selenium):
    selenium.get("https://www.baidu.com")
    assert 1==2

八.测试框架封装

  1. POM 页面对象模型

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

    • 使用对象:代表页面

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

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

      python 复制代码
      def test_login_ok(selenium):
      	page = LoginPage(selenium)  # 1.实例化PO
      	is_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(领域特定语言)存在,它按顺序列出要执行的关键字和所需数据。

相关推荐
IT19959 小时前
Wireshark笔记-DHCP流程与数据包解析
笔记·测试工具·wireshark
Python大数据分析@2 天前
selenium采集数据怎么应对反爬机制?
selenium·测试工具·网络爬虫
测试老哥4 天前
Jmeter自动化性能测试常见问题汇总
自动化测试·软件测试·测试工具·jmeter·接口测试·压力测试·性能测试
苦逼IT运维4 天前
Jenkins + SonarQube 从原理到实战四:Jenkins 与 Gerrit 集成并实现自动任务
运维·git·测试工具·ci/cd·jenkins
测试19984 天前
Web自动化测试:测试用例流程设计
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
敬业小码哥5 天前
记一次:postman请求下载文件的使用方法
测试工具·postman
测试老哥6 天前
pytest+requests+allure自动化测试接入Jenkins学习
自动化测试·软件测试·学习·测试工具·职场和发展·jenkins·pytest
Mike_Wuzy6 天前
【音频信号发生器】基本应用
测试工具