【软件测试/自动化测试】WebDriver+Selenium实现浏览器自动化

news2024/10/5 12:45:14

 目录

前言

使用场景

原理

环境准备

 开发

First Script

WebDriver API

浏览器

元素

总结


前言

Selenium是一款可以自动化操作浏览器的开源项目,最初的目的是浏览器功能的自动化测试,但是随着项目的发展,人们根据它的特性也用来做一些更多的有意思的功能而不仅仅是UI的自动化测试工具。就像Selenium官方网站上描述的那样,Selenium可以自动化操纵浏览器。完了!你想用它的能力做什么事情完全取决于你。

使用场景

针对浏览器的自动化测试有三个场景:

  • Selenium WebDriver:如果您想创建健壮的、基于浏览器的回归自动化套件和测试、在许多环境中扩展和分发脚本,那么您需要使用 Selenium WebDriver,它是一组特定于语言的绑定来驱动浏览器——这就是它的本意驱动的
  • Selenium IDE:如果您想创建快速的错误重现脚本,创建脚本以帮助自动化辅助探索性测试,那么您想使用 Selenium IDE; Chrome、Firefox 和 Edge 插件,可以对与浏览器的交互进行简单的记录和回放
  • Selenium Grid:如果您想通过在多台机器上分发和运行测试来扩展并从一个中心点管理多个环境,从而可以轻松地针对大量浏览器/操作系统组合运行测试,那么您需要使用 Selenium Grid

原理

早期的Selenium目的是实现web应用的UI自动化测试,实现方式是通过三方的服务器注入js达到控制浏览器行为的目的,核心的组件叫Selenium-RC(Remote Control) 包含两个部分:

  • 客户端侧的编写控制浏览器逻辑的库
  • 实现控制浏览器启动和关闭的服务器

架构如下 

  这种架构被证明是复杂的,而且有诸多限制,比如:

  • 复杂的架构
  • 执行测试脚本非常耗时,因为 Selenium RC 使用 JavaScript 命令作为浏览器的指令。这会导致性能下降
  • API不太面向对象
  • 不支持 Headless HTMLUnit 浏览器(不可见的浏览器)

Selenium RC 的局限性导致了新的自动化框架 Selenium WebDriver 的开发。在 2006 年引入 WebDriver 后,RC 中出现的复杂问题可以得到解决和解决 Selenium 结合WebDriver简化了浏览器的控制行为,将中间环节的服务器去掉,直接在系统层级本地化控制浏览器,优化后的架构如下: 

环境准备

如果你不想在编码层实现你的功能,可以下载Selenium IDE插件,支持录制回放,过程脚本导出。 

 如果需要通过代码实现更多灵活自定义功能,建议使用python,环境准备 python3、pip3

brew install python3

selenium

pip3 install selenium

install browser drivers 设置您的系统以允许浏览器自动化。 通过 WebDriver,Selenium 支持市场上所有主流浏览器,例如 Chrome/Chromium、Firefox、Internet Explorer、Edge、Opera 和 Safari。在可能的情况下,WebDriver 使用浏览器的内置自动化支持来驱动浏览器 

 开发

First Script

通过webdriver实现控制浏览器自动访问功能

def test_eight_components():
    driver = webdriver.Chrome()
    
    driver.get("https://google.com")
    
    title = driver.title
    assert title == "Google"
    
    driver.implicitly_wait(0.5)
    
    search_box = driver.find_element(by=By.NAME, value="q")
    search_button = driver.find_element(by=By.NAME, value="btnK")
    
    search_box.send_keys("Selenium")
    search_button.click()
    
    search_box = driver.find_element(by=By.NAME, value="q")
    value = search_box.get_attribute("value")
    assert value == "Selenium"
    
    driver.quit()

WebDriver API

webDriver操纵浏览器的API大致可以分为两个部分,控制浏览器行为的比如,打开、关闭、前进、后退、刷新等和控制页面元素的如,点击、输入、获取元素内容等

浏览器

获取浏览器信息

// title driver.getTitle(); // url driver.getCurrentUrl();

导航

//打开
driver.get("https://selenium.dev");

//跳转
driver.navigate().to("https://selenium.dev");

// 后退
driver.navigate().back();

// 前进
driver.navigate().forward();

// 刷新
driver.navigate().refresh();

弹框

//根据条件找到页面中的弹框并点击
driver.findElement(By.linkText("See an example alert")).click();

//等待弹框展示并保存到变量中
Alert alert = wait.until(ExpectedConditions.alertIsPresent());

//获得弹框内容文本
String text = alert.getText();

//点击确定按钮
alert.accept();

Alert、Confirm、Prompt功能类似 Cookies 可以支持cookies的添加删除操作

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;

public class addCookie {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        try {
            driver.get("http://www.example.com");

            // Adds the cookie into current browser context
            driver.manage().addCookie(new Cookie("key", "value"));
        } finally {
            driver.quit();
        }
    }
}

Frames 支持针对Frames内元素的获取及操作 Windows WebDriver 不区分窗口和选项卡。如果您的站点打开一个新选项卡或窗口,Selenium 将允许您使用窗口句柄来处理它。每个窗口都有一个唯一标识符,该标识符在单个会话中保持不变。您可以使用以下方法获取当前窗口的窗口句柄:

driver.getWindowHandle();

元素

识别和使用DOM中的元素 大多数人的 Selenium 代码大部分都涉及使用 Web 元素。这部分功能和写前端代码的document.getElementById作用差不多,思想比较简单,就是找到页面中的元素然后执行模拟用户行为的操作 支持绝对定位和相对定位的策略,针对复杂页面ID,Tag,Class不好定位的情况可以使用xPath方式,非常灵活,其实也不用死记硬背,当某元素不好定位时,可以去官网查API的方式去实现

相对定位

def relative():
    # Above
    email_locator = locate_with(By.TAG_NAME, "input").above({By.ID: "password"})
    # Below
    password_locator = locate_with(By.TAG_NAME, "input").below({By.ID: "email"})
    # Left of
    cancel_locator = locate_with(By.TAG_NAME, "button").to_left_of({By.ID: "submit"})
    # Right of
    submit_locator = locate_with(By.TAG_NAME, "button").to_right_of({By.ID: "cancel"})
    # Near
    email_locator = locate_with(By.TAG_NAME, "input").near({By.ID: "lbl-email"})
    # Chaining relative locators
    submit_locator = locate_with(By.TAG_NAME, "button").below({By.ID: "email"}).to_right_of({By.ID: "cancel"})

传统定位

<ol id="vegetables" style="margin-top: 20px">
      <li class="potatoes">potatoes</li>
      <li class="onions">onions</li>
      <li class="tomatoes"><span>Tomato is a Vegetable</span></li>
    </ol>
    <ul id="fruits">
      <li class="bananas"></li>
      <li class="apples"></li>
      <li class="tomatoes"><span>Tomato is a Fruit</span></li>
     </ul>

def finders():
    # Evaluating entire DOM
    vegetable = driver.find_element(By.CLASS_NAME, "tomatoes")
    print(vegetable)
    # Evaluating a subset of the DOM
    fruits = driver.find_element(By.ID, "fruits")
    fruit = fruits.find_elements(By.CLASS_NAME, "tomatoes")
    print(fruit)
    # Optimized locator
    fruit = driver.find_element(By.CSS_SELECTOR, "#fruits .tomatoes")
    fruit2 = driver.find_element(By.CSS_SELECTOR, "ul .tomatoes")
    print(fruit == fruit2) # True
    # All matching elements
    plants = driver.find_elements(By.TAG_NAME, "li")
    print(plants)
    # Get all the elements available with tag name 'p'
    elements = driver.find_elements(By.TAG_NAME, 'span')
    for e in elements:
        print(e.text)


def xPath():
    ol = driver.find_element(By.XPATH, "/html/body/div/div/ol[1]")
    ol2 = driver.find_element(By.XPATH, "//ol[1]")
    ol3 = driver.find_element(By.XPATH, "//ol[@id='vegetables']")
    print(ol == ol2) # True
    print(ol == ol3) # True
    onions = driver.find_element(By.XPATH, "//ol[1]/li[2]")
    print(onions.text)

交互 5种基本命令:

  • click(任意元素)
  • send keys(仅用于文本块和内容可编辑元素)
  • clear(同上)
  • submit (form 元素)
  • select (选择列表元素)

获取元素信息 

总结

本次分享介绍了Selenium使用场景,简单原理和一些的基础用法。并列举了一个小例子。掌握以上内容,你已经可以实现基本的UI自动化测试了。另外可以做一些爬虫和自动化操纵浏览器的工具需求就需要根据个人场景化定制了,只要你有“懒”的天性,相信一定会找到挺多有意思场景使用去使用它。


-事必有法,然后有成- 最后祝大家早日达到测试的天花板!

如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以加入我们的Q:321255410,或是点击下方小卡片添加即可,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。

今天主要是和大家分享我的一些学习经验和网盘学习资源,后续我会继续分享一些相关测试资料,有被帮助到的朋友,大家可以点赞支持一下~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/639258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s 配置hadoop集群,nfs作为存储

目录 一、简介 二、nfs服务&nfs-provisioner配置 1、k8S服务器需安装nfs客户端 2、nfs服务端安装配置 3、使用nfs-provisioner动态创建PV &#xff08;文件已修改&#xff09; 三、hadoop配置文件 1、# cat hadoop.yaml 2、# cat hadoop-datanode.yaml 3、# cat …

fprintf 和 fscanf 、 fscanf和fgets的区别

一、fprintf与fscanf应用 #include <stdio.h> #include <windows.h>void write(){FILE *fp fopen("abc.c" , "w");if(!fp){perror("fopen error");return;}fprintf(fp , "%d%c%d%d\n",10,*,8,10*8);fclose(fp); }void r…

银行项目软件测试中都测哪些内容?怎么测

在我们的日常在金融或银行软件测试工作中都有哪些内容需要测试&#xff1f;在这些测试的内容中如何去更好的掌握测试技能保证测试质量&#xff0c;一起来学习探讨交流。 下面为银行测试点的概括&#xff1a; 根据上图&#xff0c;我们可以从以下几个方面重点关注&#xff1a; …

一些原理图设计最佳实践

要画出清晰、可读性好和整洁的电路原理图&#xff0c;应该遵守以下一般规范&#xff1a; 使用专业的绘图软件&#xff1a;使用专业的电路设计软件&#xff0c;如KiCad、Eagle、Altium Designer、OrCAD等&#xff0c;这些软件提供了丰富的元件库和绘图工具&#xff0c;可以轻松创…

使用POI实现JAVA操作Excel文件

1、POI工具介绍 1.1、POI 是用Java编写的免费开源的跨平台的 Java API&#xff0c;Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。 1.2、主要是运用其中读取和输出excel的功能。 1.3、POI官网地址&#xff1a; https://poi.apache.org/components/i…

2021 年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题

2021 年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题 一. 逻辑推理&#xff1a;第 26~55 小题&#xff0c;每小题 2 分&#xff0c;共 60 分。下列每题给出的 A、B、C、D、E 五个选项中&#xff0c;只有一项是符合试题要求的。 26.哲学是关于世界观、方法论的学问。哲…

SEC的尴尬,无法找到行踪飘忽不定的“华人首富”

圈内很多有&#xff0c;也许会有这样一幅画面。“哎呀&#xff0c;他到底跑哪儿去了&#xff1f;”美国证券交易委员会SEC主席Gensler气得拍着桌子&#xff0c;旁边还放着长达136页的对币安的起诉文件。这可真是让人头疼啊&#xff01;毕竟赵长鹏最近几年一直神出鬼没&#xff…

Mybatis学习笔记二

目录 一、MyBatis的各种查询功能1.1 查询一个实体类对象1.2 查询一个List集合1.3 查询单个数据1.4 查询一条数据为map集合1.5 查询多条数据为map集合1.5.1 方法一&#xff1a;1.5.2 方法二&#xff1a; 二、特殊SQL的执行2.1 模糊查询2.2 批量删除2.3 动态设置表名2.4 添加功能…

现代图片性能优化: 懒加载及异步图像解码方案

图片的懒加载 懒加载是一种网页性能优化的常见方式&#xff0c;它能极大的提升用户体验。到今天&#xff0c;现在一张图片超过几 M 已经是常见事了。如果每次进入页面都需要请求页面上的所有的图片资源&#xff0c;会较大的影响用户体验&#xff0c;对用户的带宽也是一种极大的…

【id:76】【20分】B. 商旅信用卡(多重继承)

题目描述 某旅游网站&#xff08;假设旅程网&#xff09;和某银行推出旅游综合服务联名卡—旅程信用卡&#xff0c;兼具旅程会员卡和银行信用卡功能。 旅程会员卡&#xff0c;有会员卡号&#xff08;int&#xff09;、旅程积分&#xff08;int&#xff09;&#xff0c;通过会员…

Spring Cloud Kubernetes详解

目录 一、 为什么你需要 Spring Cloud Kubernetes&#xff1f; 二、 Starter 三、 用于 Kubernetes 的 DiscoveryClient 四、Kubernetes 原生服务发现&#xff08;service discovery&#xff09; 五、Kubernetes PropertySource 的实现 1、使用 ConfigMap PropertySource …

ssg标识符

1. 关键字&#xff08;keyword&#xff09; 定义&#xff1a;被Java语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;或单词&#xff09; HelloWorld案例中&#xff0c;出现的关键字有 class、public 、 static 、 void 等&#xff0c;这些单词已经被Java定义…

【appium】appium自动化入门之API(上)

这个系列预计会讲启动APP—元素定位—初步使用—API命令详解 本系列没提过的知识点也不用急&#xff0c;大家可以点击文末小卡片进群来一起交流 目录 第 2 章 初步使用 2.1 启动 app&#xff08;淘宝&#xff09; 前言 2.1.1 下载 aapt 2.1.2 获取 apk 包名 2.1.3 获取 launch…

Linux之通配符、引号的使用

目录 Linux之通配符、引号的使用 通配符 定义 范围 用法及含义 案例 引号使用 案例 Linux之通配符、引号的使用 通配符 定义 通配符是一种特殊语句&#xff0c;主要有星号(*)、问号(?)等表示&#xff0c;用来模糊搜索文件&#xff0c;当查找目录或文件时&#xff0c;…

Gin微服务框架_golang web框架_完整示例Demo

Gin简介 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有快速灵活&…

Spark入门

Spark概述 1.1 什么是Spark 回顾&#xff1a;Hadoop主要解决&#xff0c;海量数据的存储和海量数据的分析计算。 Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 1.2 Hadoop与Spark历史 MR是进程模型&#xff0c;ResourceManager NodeManager都是进程&…

107-Spring的底层原理(上篇)

Spring的底层原理 之前说明的都是Spring的应用&#xff08;64章博客开始&#xff08;包括其后面的相关博客&#xff09;&#xff09;&#xff0c;现在来说明他为什么可以那样做 在说明之前&#xff0c;这里需要对64章博客中的spring的了解需要再次的说明&#xff1a; Spring…

Unity中UI方案。IMGUI、UIElement、UGUI、NGUI

引言 unity中有很多ui方案&#xff0c;各种方案有什么优势劣势&#xff0c;这里一一列举一下&#xff0c;知识扩充一下。 UI方案适用范围IMGUI仅用于Editor扩展&#xff0c;或运行时DebugUIElement可用于发布运行时和EditorUGUIRuntime&#xff0c;两大主流 UI 解决方案之一NG…

python语法-MySQL数据库(综合案例:读取文件,写入MySQL数据库中)

python语法-MySQL数据库 综合案例&#xff1a;读取文件&#xff0c;写入MySQL数据库中 &#xff08;项目数据见文章末参考内容&#xff09; 解析&#xff1a; sql代码如下&#xff1a; create database pysql charset utf8;use pysql;select database();create table orders…

华为OD机试真题 JavaScript 实现【求小球落地5次后所经历的路程和第5次反弹的高度】【牛客练习题 HJ38】

一、题目描述 假设一个球从任意高度自由落下&#xff0c;每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时&#xff0c;共经历多少米?第5次反弹多高&#xff1f; 数据范围&#xff1a;输入的小球初始高度满足 1 \le n \le 1000 \1≤n≤1000 &#xff0c;且保证是一…