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

web UI自动化测试笔记

在当今数字化转型的浪潮中,Web 应用已经无处不在,而其质量保障的关键之一就是自动化测试。想象一下,如果每次都手动验证 UI 功能,不仅耗时耗力,还容易遗漏问题。Python 的强大生态为 Web UI 自动化测试提供了高效的解决方案。

如何用 Python 高效实现 Web UI 自动化测试?有哪些工具和最佳实践可以让测试变得更加简单和可靠?

随着 DevOps 和 CI/CD 的普及,Web UI 自动化测试已经成为企业构建高效开发和测试流程的核心环节之一。越来越多的公司要求测试人员掌握自动化技能,而 Python 作为易学易用的语言,成为测试工程师的首选。

Selenium WebDriver API

(一):元素定位

  1. id定位find_element_by_id();
  2. name定位find_element_by_name();
  3. class属性定位find_element_by_class_name();
  4. tag属性定位find_element_by_tag_name();
  5. 元素标签之前的文本信息来定位find_element_by_link_text();
  6. 取文本链接的一部分来定位find_element_by_partial_link_text();
  7. xpath多种定位策略 find_element_by_xpath();
  8.  css选择器定位

①绝对路径:

find_element_by_xpath("html/body/div[2]/div[2]/div[3]/div[2]/form/input[1]"); 1

②元素属性:

find_element_by_xpath("//input[@id='qwe']"); find_element_by_xpath("//input[@name='qwe']"); find_element_by_xpath("//input[@class='qwe']"); find_element_by_xpath("//*[@id='qwe']"); 1 2 3 4

③层级属性:

find_element_by_xpath("//span[@class='qwe']/input"); find_element_by_xpath("//form[@id='qwe']/span[2]/input"); 1 2

④运算逻辑:

find_element_by_xpath("//input[@id='qwe' and @class='qwer']/span/input");

① css选择器定位

find_element_by_css_selector(); 1 其中css也有多种策略:

①class属性:

find_element_by_css_selector(".qwe"); 1

②id属性: find_element_by_css_selector("#qwe");

③标签名:find_element_by_css_selector("input");

A.父子关系:find_element_by_css_selector("span>input");

B.属性定位:find_element_by_css_selector('[type="submit"]');

C.组合定位:find_element_by_css_selector(" form.fm>span>input>input.qwe");

9.BY元素定位

以上提到的8种定位方法,webdriver还提供了另一套写法,即统一调用find_element()方法,通过BY来声明定位的方法,并且传入对应定位方法的定位参数。 使用BY之前需要插入BY类:

from selenium.webdriver.common.by import Byfind_element(BY.ID,"qwe");
find_element(BY.NAME,"qwe");
find_element(BY.CLASS_NAME,"qwe");
find_element(BY.TAG_NAME,"qwe");
find_element(BY.LINK_TEXT,"xxxxx");
find_element(BY.PARTIAL_LINK_TEXT,"dddd");
find_element(BY.XPATH,"//* [@id='qwe']");
find_element(BY.CSS_CELECTOR," span>input ");

    (二):浏览器控制1

    1.控制浏览器窗口大小

    set_window_size();

    如set_window_size(640,480); 即宽640,高480

    maximize_window(); 窗口最大化,不需要参数,直接使用

    2.控制浏览器进退、前进

    back(); 返回

    forwar(); 前进

    如 driver.back(); 其中driver=webdriver.Chrome()

    3.模拟浏览器刷新

    refresh(); 如driver.refresh()类似F5

    4.简单元素操作

    ①clear(); 清除文本

    ②send_keys(*value); 模拟按键输入

    ③click(); 单击元素

    举例:

    driver.find_element_by_id("qwe").clear()

    driver.find_element_by_id("qwe").send_keys("tyyu")

    driver.find_element_by_id("login").click()

    5.webelement接口常用方法

    size:返回元素的尺寸

    text:获取元素的文本

    get_attributte(name):获得属性

    is_displayed():设置改元素是否用户可见

    举例:

    size=driver.find_element_by_id("qwe").size    获取输入框的尺寸

    text=driver.find_element_by_id("qwe").text    获取文本信息

    attributte = driver.find_element_by_id("qwe").get_ attributte('type')  可以是id、name、type或其他任意属性

    result= driver.find_element_by_id("qwe"). is_displayed()  返回元素的结果是否可见,返回结果为Ture或者False

    6.鼠标事件

    perform(): 执行所有ActionChains中存储的行为

    context_click(): 右击

    double_click(): 双击

    drag_and_drop(element, target

    move_to_element(): 鼠标悬停

    举例:

    ①rom selenium.webdriver.common.action_chains import ActionChains   先引入ActionChains类

    driver = webdriver.Chrome()

    driver.get("http://www.baidu.com")

    #...

    #定位到要右击的元素

    right_click = driver.find_element_by_id("qwe")

    #对定位到的元素执行鼠标右击操作

    ActionChains(driver).context_click(right_click).perform()

    说明:

    ActionChains(driver):调用这个类,将浏览器驱动driver作为参数传入

    context_click(right_click):模拟邮件操作,在使用时需要指定元素定位

    perfom():将指定所有ActionChains中存储的行为。

    ②above=driver.find_element_by_id("qwer")

    ActionChains(driver).move_to_element(above).perfom()

    其他方法类似

    7.键盘事件

    Keys类提供了键盘上所有的按键方法

    from selenium.webdriver.common.keys import Keys

    send_keys(Keys.BACK_SPACE)        删除键

    send_keys(Keys. SPACE)    空格键

    send_keys(Keys.TAB)    制表键

    send_keys(Keys.ESCAPE)    回退键

    send_keys(Keys.ENTER)    回车键

    send_keys(Keys.CONTROL,'a')   全选

    send_keys(Keys.CONTROL,'c')  复制

    send_keys(Keys.CONTROL,'x')   剪贴

    send_keys(Keys.CONTROL,'v')   粘贴

    send_keys(Keys.F1)

    ...

    send_keys(Keys.F12)    F1-F12

    8.获得验证信息

    title, URL, text

    举例:

    now_url=driver.current_url 获取当前页面URL

    title=driver.title 获取当前页面title

    text前边已经提及到,不赘述

    (三):浏览器控制2

    9.设置元素等待

    ①显式等待:WebDriverWait(driver,poll_fequency=0.5,ignored_exceptions=None)

    ②隐式等待:driver.implicitly_wait(time) time可自定义

    ③sleep休眠:sleep(time)  time可自定义

    10.定位一组元素

    在之前定位单个元素的element后加s

    find_elements_by_id();        

    find_elements_by_name();    

    find_elements_by_class_name();  

    find_elements_by_tag_name();      

    find_elements_by_link_text();      

    find_elements_by_partial_link_text();  

    find_elements_by_xpath();  

    find_elements_by_css_selector();

    11.多表单切换

    driver.swtich_to.frame()

    12.多窗口切换

    driver.switch_to.widow()  用于切换到相应的窗口

    current_window_handle  获取当前窗口句柄

    window_handles   返回所有窗口的句柄到当前会话

    13.警告框处理

    text:返回 alert/confirm/prompt中的文字信息

    accept(): 接受现有警告框

    dismiss(): 解散现有警告框

    send_keys(keysToSend): 发送文本至警告框

    14.上传文件

    普通上传:将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器

    插件上传:指基于Flash,JavaScript或Ajax等技术实现上传功能

    ①send_keys()

    如:

    from selenium import webdriver

    import os

    driver = webdriver.Chrome()

    file_path='file:///' + os.path.abspath('upfile.html')

    driver.get(file_path)

    #定位上传按钮,添加本地文件

    driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')

    driver.quit()

    ②AutoIt实现上传  下载使用http://www.autoitscript.com/site/

    15.下载文件

    from selenium import webdriver

    import os

    fp=webdriver.Firefoxprofile()

    fp.set_preference("browser.download.folderList",2)#0是默认路径,2是指定路径

    fp.set_preference("browser.download.manager.showWhenStarting",False)#是否显示开始

    fp.set_preference("browser.download.dir",os.getcwd())#用于指定所下载的文件的目录

    fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")#下载文件的类型

    driver=webdriver.Firefox(firefox_profile=fp)

    driver.get("http://pypi.Python.org/pypi/selenium")

    driver.find_element_by_partial_link_text("selenium-2").click()

    16.操作Cookie

    WebDriver操作cookie的方法:

    get_cookies(): 获取所有的cookie信息

    get_cookie(name): 返回字典的key为“name”的cookie信息

    add_cookie(cookie_dict):添加cookie。cookie_dict为字典对象,必须有name,value值

    delete_cookie(name,optionsString):删除cookie信息

    delete_all_cookies():删除所有的cookie信息

    17.调用JavaScipt

    调整浏览器滚动条位置

    window.scrollTo(左边距,上边距)

    18.处理HTML5的视频播放

    load(),play(), pause()   加载,播放,暂停

    19.窗口截图

    driver.get_screenshot_as_file("D:\\xxxxx")#截取当前窗口,并指定截图图片的保存位置

    20.关闭窗口

    quit():退出相关程序和关闭所有窗口;

    close():关闭当前窗口

    21.验证码的处理

    ①去掉验证码

    ②设置万能验证码

    ③验证码识别技术

    ④记录cookie

    简单实战

    安装chromdriver.

    一个简单的自动化测试脚本,来体会一下什么是web UI自动化测试,以及元素的基本操作

    # #文件名称:test_baidu.py
    # Function:打开百度网主页,在搜索栏输入“helloworld,from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    import timedriver = webdriver.Chrome()  # 打开Chrome浏览器
    driver.get("https://www.baidu.com")  # 输入百度网址
    print("============验证浏览器的基本控制=-=======")def search():print("1、搜索helloworld.并回车......")time.sleep(2)driver.find_element_by_id("kw").send_keys("helloworld")  # 输入“helloworld”time.sleep(2)driver.find_element_by_id("kw").send_keys(Keys.ENTER)  # 回车进行搜索time.sleep(2)driver.maximize_window()  # 最大化当前窗def windows_size():print("2、浏览器窗口大小缩小为640*480......")time.sleep(2)driver.set_window_size(640, 480)  # 控制浏览器显示尺寸为640*480time.sleep(0.5)driver.maximize_window()  # 最大化当前窗time.sleep(2)def back_refresh():print("3、先进行浏览器后退,再次输入csdn进行搜索")driver.back()driver.find_element_by_id("kw").send_keys("csdn")  # 输入csdntime.sleep(1)driver.refresh()  # 刷新def serach_clear():print("4、清空输入的内容......")driver.find_element_by_id("kw").send_keys("csdn")  # 输入csdntime.sleep(2)driver.find_element_by_id("kw").clear()time.sleep(0.5)def csdn():print("5、进入csdn官网")driver.find_element_by_id("kw").send_keys("csdn")  # 输入csdntime.sleep(2)driver.find_element_by_id("kw").send_keys(Keys.ENTER)  # 回车进行搜索time.sleep(2)driver.find_element_by_xpath("//*[@id='1']/div/div[1]/h3/a[1]").click()time.sleep(2)windows = driver.window_handlesdriver.switch_to.window(windows[-1])now_url = driver.current_urlm_get_url = "https://www.csdn.net/"if now_url == m_get_url:print("经过判断,已经进入csdn官网!!")else:print("未进入到csdn官网,请检查代码!")search()
    windows_size()
    back_refresh()
    serach_clear()
    csdn()
    driver.quit()  # 关闭浏览器

     

      问题:driver.find_element_by_xpathd的参数是怎么获取到的呢?

      ("//*[@id='1']/div/div[1]/h3/a[1]").click()

      获取路径:

      web UI自动化测试_css

      Web UI 自动化测试并不是一项简单的任务,但通过 Python 强大的生态系统,以及不断实践最佳实践,测试效率和质量都将显著提升。自动化不仅节省了时间,也为开发质量提供了更强有力的保障。

      用自动化测试解放双手,让代码成为你的“眼睛”,精准发现问题,助力产品品质跃升新高度!

       

       

      相关文章:

      web UI自动化测试笔记

      在当今数字化转型的浪潮中,Web 应用已经无处不在,而其质量保障的关键之一就是自动化测试。想象一下,如果每次都手动验证 UI 功能,不仅耗时耗力,还容易遗漏问题。Python 的强大生态为 Web UI 自动化测试提供了高效的解决…...

      计算机网络 (60)蜂窝移动通信网

      一、定义与原理 蜂窝移动通信网是指将一个服务区分为若干蜂窝状相邻小区并采用频率空间复用技术的移动通信网。其原理在于,将移动通信服务区划分成许多以正六边形为基本几何图形的覆盖区域,称为蜂窝小区。每个小区设置一个基站,负责本小区内移…...

      计算机网络三张表(ARP表、MAC表、路由表)总结

      参考: 网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!_mac表、arp表、路由表-CSDN博客 网络中的三张表:ARP表、MAC表、路由表 首先要明确一件事,如果一个主机要发送数据,那么必…...

      DRF开发避坑指南01

      在当今快速发展的Web开发领域,Django REST Framework(DRF)以其强大的功能和灵活性成为了众多开发者的首选。然而,错误的使用方法不仅会导致项目进度延误,还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大…...

      批量提取多个 Excel 文件内指定单元格的数据

      这篇文章将介绍如何从多个相同格式的Excel文件中,批量提取指定单元格的数据,合并后保存到新的工作薄。 全程0代码,可视化操作。 提取前: 提取后: 准备数据 这里准备了3个测试数据 开始提取 打开的卢易表&#xff0…...

      #HarmonyOS篇:build-profile.json5里面配置productsoh-package.json5里面dependencies依赖引入

      oh-package.json5 用于描述包名、版本、入口文件和依赖项等信息。 {"license": "","devDependencies": {},"author": "","name": "entry","description": "Please describe the basic…...

      Spring集成Redis|通用Redis工具类

      一、基础使用 概述 在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。那么使用SpringBoot整合Redis需要 那些步骤呢。 1、 JedisPoolConfig (这个是配置连接池) 2、 RedisConnectionFactory 这个是配置连接信息,这里的RedisConnectionFactory是一个接 …...

      Vue中设置报错页面和“Uncaught runtime errors”弹窗关闭

      文章目录 前言操作步骤大纲1.使用Vue自带的报错捕获机制添加报错信息2.在接口报错部分添加相同机制3.把报错信息添加到Vuex中方便全局使用4.添加报错页面备用5.app页面添加if判断替换报错界面 效果备注:vue项目中Uncaught runtime errors:怎样关闭 前言 在开发Vue项…...

      【力扣】219. 存在重复元素 II

      题目 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a…...

      头歌实训作业 算法设计与分析-贪心算法(第5关:求解流水作业调度问题)

      问题描述 有 n 个作业&#xff08;编号为1&#xff5e;n&#xff09;要在由两台机器 M 1和 M 2 组成的流水线上完成加工。每个作业加工的顺序都是先在 M 1​上加工&#xff0c;然后在 M 2 上加工。 M 1 和 M 2 加工作业 i 所需的时间分别为 a i 和 b i&#xff08;1≤i≤n&am…...

      Hadoop•搭建完全分布式集群

      听说这里是目录哦 一、安装Hadoop&#x1f955;二、配置Hadoop系统环境变量&#x1f96e;三、验证Hadoop系统环境变量是否配置成功&#x1f9c1;四、修改Hadoop配置文件&#x1f36d;五、分发Hadoop安装目录&#x1f9cb;六、分发系统环境变量文件&#x1f368;七、格式化HDFS文…...

      SQL-leetcode—1141. 查询近30天活跃用户数

      1141. 查询近30天活跃用户数 表&#xff1a;Activity ---------------------- | Column Name | Type | ---------------------- | user_id | int | | session_id | int | | activity_date | date | | activity_type | enum | ---------------------- 该表没有包含重复数据。 …...

      总结与展望,龙蜥社区第 30 次运营委员会会议线上召开

      2025 年 1 月 20 日&#xff0c;龙蜥社区召开了第 30 次运营委员会线上会议&#xff0c;来自 24 家理事单位的 22 位委员及委员代表出席&#xff0c;本次会议由运营委员凝思软件李晨斌主持。会上总结和回顾了龙蜥社区 1 月运营发展情况&#xff0c;同步了龙蜥社区 3 大运营目标…...

      idea对jar包内容进行反编译

      1.先安装一下这个插件java Bytecode Decompiler 2.找到这个插件的路径&#xff0c;在idea的plugins下面的lib文件夹内&#xff1a;java-decompiler.jar。下面是我自己本地的插件路径&#xff0c;以作参考&#xff1a; D:\dev\utils\idea\IntelliJ IDEA 2020.1.3\plugins\java-d…...

      c++----------------------多态

      1.多态 1.1多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)…...

      C语言 指针_野指针 指针运算

      野指针&#xff1a; 概念&#xff1a;野指针就是指针指向的位置是不可知的&#xff08;随机的、不正确的、没有明确限制的&#xff09; 指针非法访问&#xff1a; int main() {int* p;//p没有初始化&#xff0c;就意味着没有明确的指向//一个局部变量不初始化&#xff0c;放…...

      【JavaEE进阶】Spring留言板实现

      目录 &#x1f38d;预期结果 &#x1f340;前端代码 &#x1f384;约定前后端交互接口 &#x1f6a9;需求分析 &#x1f6a9;接口定义 &#x1f333;实现服务器端代码 &#x1f6a9;lombok介绍 &#x1f6a9;代码实现 &#x1f334;运行测试 &#x1f384;前端代码实…...

      第25篇 基于ARM A9处理器用C语言实现中断<一>

      Q&#xff1a;怎样理解基于ARM A9处理器用C语言实现中断的过程呢&#xff1f; A&#xff1a;同样以一段使用C语言实现中断的主程序为例介绍&#xff0c;和汇编语言实现中断一样这段代码也使用了定时器中断和按键中断。执行该主程序会在DE1-SoC的红色LED上显示流水灯&#xf…...

      面向通感一体化的非均匀感知信号设计

      文章目录 1 非均匀信号设计的背景分析1.1 基于OFDM波形的感知信号1.2 非均匀信号设计的必要性和可行性1.2 非均匀信号设计的必要性和可行性 3 通感一体化系统中的非均匀信号设计方法3.1 非均匀信号的设计流程&#xff08;1&#xff09;均匀感知信号设计&#xff08;2&#xff0…...

      修改docker共享内存shm-size

      法1&#xff1a;在创建容器时增加共享内存大小 nvidia-docker run -it -p 10000:22 --name"zm" -v /home/zm:/data ufoym/deepo:all-cu101 /bin/bash --shm-size20G法2&#xff1a;修改正在运行的容器的共享内存设置 查看容器、共享内存 docker ps -a df -lh | gr…...

      鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

      一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

      C++ 基础特性深度解析

      目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

      Neo4j 集群管理:原理、技术与最佳实践深度解析

      Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

      C# 类和继承(抽象类)

      抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

      令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

      文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

      LLM基础1_语言模型如何处理文本

      基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

      全志A40i android7.1 调试信息打印串口由uart0改为uart3

      一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

      均衡后的SNRSINR

      本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

      Golang——7、包与接口详解

      包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

      在 Spring Boot 中使用 JSP

      jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...