《最新出炉》系列初窥篇-Python+Playwright自动化测试-63 - Canvas和SVG元素定位

news2024/12/24 19:46:10

软件测试微信群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 

1.简介

今天宏哥分享的在实际测试工作中很少遇到,比较生僻,如果突然遇到我们可能会脑大、懵逼,一时之间不知道怎么办?所以宏哥这里提供一种思路供大家学习和参考。

2.SVG简介

svg也是html5新增的一个标签,它跟canvas很相似。都可以实现绘图、动画。但是svg绘制出来的都是矢量图,不像canvas是以像素为单位的,放大会模糊。svg绘制出来的图是不会的。SVG英文全称为Scalable vector Graphics,意思为可缩放的矢量图,这种元素比较特殊,需要通过 ​name​() 函数来进行定位。

3.svg的基本使用

svg是在html和css里面操作的,不是在js里面。

<body>
  <svg width="500" height="500"> </svg>
</body>
3.1 绘制直线

1.参考代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>北京-宏哥</title>
  <style>
      svg {
            margin-left: 100px;
            margin-top: 100px;
            border: 1px solid black
        }
    </style>
</head>
<body>
  <svg width="500" height="500">
        <!-- line(直线)前面两个值是起始点坐标,后面两个值是终点坐标 -->
        <line x1="100" y1="100" x2="200" y2="200" stroke="red"></line>
      </svg>
</body>
</html>

2.浏览器打开如下图所示:

3.2 绘制矩形

1.参考代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>北京-宏哥</title>
  <style>
      svg {
            margin-left: 100px;
            margin-top: 100px;
            border: 1px solid black
        }
    </style>
</head>
<body>
  <svg width="500" height="500">
        <!-- rect(矩形)前面两个值是位置,中间两个值是圆角,后面两个值是设置宽高 -->
        <rect x="50" y="20" rx="10" ry="10" width="150" height="150"></rect>
      </svg>
</body>
</html>

2.浏览器打开如下图所示:

3.我们来看看加上css样式,空心矩形

        rect{
            fill:transparent;  //设置为透明色
            stroke: red;    //描边为红色
        }

 

3.3 绘制圆弧

1.参考代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>北京-宏哥</title>
  <style>
      svg {
            margin-left: 100px;
            margin-top: 100px;
            border: 1px solid black
        }
    </style>
</head>
<body>
  <svg width="500" height="500">
        <!-- cirle(圆弧)前面第一个值是设置圆的半径,后面值是位置。实心圆-->
         <!-- 可以在css设置为透明再设置描边,就会成空心圆 -->
         <circle r="50" cx="200" cy="100"></circle>
      </svg>
</body>
</html>

2.浏览器打开如下图所示:

3.4 绘制椭圆

1.参考代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>北京-宏哥</title>
  <style>
      svg {
            margin-left: 100px;
            margin-top: 100px;
            border: 1px solid black
        }
    </style>
</head>
<body>
  <svg width="500" height="500">
        <!-- ellipse(椭圆) 第一个值为圆的宽度,第二个为圆的高度,后两值为圆的位置-->
          <!-- 可以在css设置为透明再设置描边,就会成空心 -->
          <ellipse rx="60" ry="30" cx="100" cy="100"></ellipse>
      </svg>
</body>
</html>

2.浏览器打开如下图所示:

3.5 绘制折线

1.参考代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>北京-宏哥</title>
  <style>
      svg {
            margin-left: 100px;
            margin-top: 100px;
            border: 1px solid black
        }
     polygon,polyline{
         fill:transparent;  //设置为透明色
          
       }
       .bi{
            fill: transparent;
             stroke: red;    //描边为红色
            stroke-width: 3px;
        }
    </style>
</head>
<body>
  <svg width="500" height="500">
       <!-- polugon(折线) 起点会跟终点相连接 -->
        <!-- 可以在css设置为透明再设置描边,就会成空心 -->
        <polygon class="bi" points="100 100, 200 50, 300 100, 400 50"  stroke-width="3"></polygon>

        <!-- poluline(折线) 起点会跟终点相连接 -->
        <!-- 可以在css设置为透明再设置描边,就会成空心 -->
        <polyline class="bi" points="100 200, 200 150, 300 200, 400 150"  stroke-width="3"></polyline>
      </svg>
</body>
</html>

2.浏览器打开如下图所示:

3.6 绘制文本

1.参考代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>北京-宏哥</title>
  <style>
      svg {
            margin-left: 100px;
            margin-top: 100px;
            border: 1px solid black
        }
       
    </style>
</head>
<body>
  <svg width="500" height="500">
            <!-- text(文本)跟绝对定位一个道理 -->
            <text x="400" y="150">123</text>
      </svg>
</body>
</html>

2.浏览器打开如下图所示:

4.样式属性

4.1fill: 填充色 (默认为黑色)

4.2stroke: 线条的颜色(默认为黑色)

4.3stroke-width: 线条的宽度

4.4stroke-linecap

stroke-linecap: 线条末尾的样式 (默认)butt (圆角)round (方形)square ,round和square会影响线条的长度

默认的样式就不设置了,设置跟设置没上面两样

round(圆角)

    

    

square(方形)

    

    

 stroke-linejoin:可使用的值是:miter, round, bevel, inherit 笔划连 接属性定义了路径拐角的形状,"miter"是默认值,"round"光滑连接,"bevel"折线连接,"inherit"继 承

round

bevel

opacity: 不透明度 0~1(可以设置填充的,也可以描边的)

  

  

用上面所学的知识来做个小demo

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        svg {
            margin-left: 100px;
            margin-top: 100px;
            border: 1px solid black;
        }
        rect{
            fill: transparent;
            stroke: black;
            stroke-width: 5px;
        }
        polygon{
            fill: black;
        }
        circle{
            fill: transparent;
            stroke: black;
            stroke-width: 4px;
        }
        .yan{
            fill: black;
        }
        .bi{
            fill: transparent;
            stroke: black;
            stroke-width: 3px;
        }
        ellipse{
            fill: transparent;
            stroke: black;
            stroke-width: 3px;
        }
        text{
            stroke: red;
        }
    </style>
</head>
<body>
    <svg width="500" height="500">
        <rect x="100" y="100" rx="15" ry="15" width="300" height="300"></rect>
        <polygon points="110 100, 130 60, 190 95, 250 60, 310 95,370 60, 390 100"></polygon>
        <circle r="20" cx="190" cy="200"></circle>
        <circle r="20" cx="320" cy="200"></circle>
        <circle class="yan" r="5" cx="198" cy="208"></circle>
        <circle class="yan" r="5" cx="328" cy="208"></circle>
        <polygon class="bi" points="240 300, 250 260, 270 300"></polygon>
        <ellipse rx="30" ry="10" cx="260" cy="330"></ellipse>
        <text x="200" y="440">屏幕前的你很帅</text>
    </svg>
</body>
</html>

好了,宏哥就是觉得好玩就简单的了解和介绍了一下SVG。下边就正式进入今天的主题。

5.SVG元素定位

 根据前边的介绍宏哥自己写了一个demo,包含svg标签,如下所示:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>北京-宏哥</title>
  <style>
      svg {
            margin-left: 100px;
            margin-top: 100px;
            border: 1px solid black
        }
       
    </style>
</head>
<body>
    <div id="app1">
      <svg width="500" height="200">
                <!-- text(文本)跟绝对定位一个道理 -->
                <text x="400" y="150">123</text>
          </svg>
     </div>
     <div id="app2">
      <svg width="500" height="200">
                <!-- text(文本)跟绝对定位一个道理 -->
                <text x="400" y="150">456</text>
          </svg>
     </div>
</body>
</html>
5.1普通定位

1.按键盘的F2或者打开浏览器的开发者模式,我们开始在控制台利用js代码进行定位。如下图所示:

2.回车后,返回结果,我们可以清楚地看到是空的,没有定位到元素。说明此法不通。

5.2name函数定位

1.按键盘的F2或者打开浏览器的开发者模式,我们开始在控制台利用js代码进行定位。如下图所示:

 2.回车后,返回结果,我们可以清楚地看到是2个svg,定位到元素。说明此法可行。

6.页面上用多个svg元素

1.如果页面上用多个svg元素,通过//*[name()="svg"] 会定位全部的svg元素,为了区分定位具体的哪个,可以通过父元素的区分。

//*[@id="box1"]//*[name()="svg"]

2.除了用父元素区分,也可以用其它属性组合,svg属性加其它属性,用 and 组合。

//*[name()="svg" and @width="500"]

7.定位svg 上的子元素

1.如果需要定位svg 下的子元素,如下图的text属性。

 2.跟前面定位方式一样,还是通过name() 函数来定位子元素的标签。

//*[@id="app1"]//*[name()="svg"]/*[name()="text"]

8.Canvas定位

Canvas定位和SVG的方法类似,宏哥就不在这里赘述了,而且一般Canvas标签中都会有id的属性,这样一来的话,定位就通过id更加方便了。

9.小结

 今天主要讲解和分享了一些Canvas和SVG的基础知识和应用,然后进入主题SVG的定位相关知识的讲解。有一种会者不难,难者不会的感觉。好了,今天时间也不早了,关于Canvas和SVG元素定位就介绍到这里,仅供小伙伴或者童鞋们参考学习。感谢您耐心的阅读!!!

 每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问)或者微信搜索: 北京宏哥  公众号提前解锁更多干货。

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

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

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

相关文章

redis高持久化、RDB、AOF

redis高可用 redis当中&#xff0c;高可用概念会更宽泛一些。 除了正常服务以外&#xff0c;数据量的扩容&#xff0c;数据安全。 实现高可用的方式&#xff1a; 1、持久化 最简单的高可用方法 主要功能&#xff1a;备份数据 把内存的数据保存到硬盘当中。 2、主从复制 3、…

【CAN通讯系列8】如何准确接收数据?

在 【CAN通讯系列7】波特率是什么&#xff1f;已经介绍了CAN位时间和采样点等概念&#xff0c;每1位由同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2)四个段组成&#xff0c;这个也成为位时序&#xff0c;采样点位置处于PBS1和PBS2的交界处&#xff0c;如…

开源跨平台SQL编辑器:Beekeeper Studio

Beekeeper Studio&#xff1a; 简化SQL体验&#xff0c;提升数据库效率。- 精选真开源&#xff0c;释放新价值。 概览 Beekeeper Studio&#xff0c;一款为现代数据库管理而生的跨平台SQL客户端&#xff0c;以其简洁直观的界面和强大的功能&#xff0c;赢得了开发者和数据库管…

betterzip免费版 betterzip破解版 betterzip注册码密钥 betterzip解压缩软件下载安装教程

基于Mac开发的解压缩软件就那么几款&#xff0c;BetterZip解压缩软件估计是Mac上非常受欢迎的压缩工具。苹果Mac电脑上虽然有自带的归档实用工具&#xff0c;但是功能过于单一&#xff0c;对很多格式的压缩文件无能为力&#xff0c;特别像使用Windows电脑的朋友压缩文件习惯使用…

搜索型和XX型注入

"Pikachu"通常是指一个安全漏洞学习平台&#xff0c;它模拟了各种Web应用中的安全漏洞&#xff0c;以便于学习者实践和了解这些漏洞的工作原理。在这个平台上&#xff0c;你可以找到不同类型的SQL注入漏洞来练习和学习如何利用与防御它们。 搜索型注入&#xff08;也…

同步交互与异步交互:深入解析与选择

同步交互与异步交互&#xff1a;深入解析与选择 1、同步交互2、异步交互3、选择策略 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在软件开发的世界里&#xff0c;交互方式主要分为两大类&#xff1a;同步与异步。下面是对这两种方式的解…

AGI思考探究过程中的意义、价值与乐趣Ⅲ

「融合RL与LLM思想&#xff0c;探寻世界模型以迈向AGI」这篇文章也探究了思维系统的两种推理模式&#xff1a;系统Ⅰ&#xff08;快思考&#xff09;和系统Ⅱ&#xff08;慢思考&#xff09;在推理过程的本质普遍性及表象差异性&#xff0c;以及尝试挖掘快慢思考是否与两类学习…

用于自动驾驶的基于立体视觉的语义 3D 对象和自我运动跟踪

Stereo Vision-based Semantic 3D Object and Ego-motion Tracking for Autonomous Driving 论文 摘要&#xff1a; 我们提出了一种基于立体视觉的方法&#xff0c;用于在动态自动驾驶场景中跟踪相机自我运动和 3D 语义对象。我们建议使用易于标记的 2D 检测和离散视点分类以及…

【SQL Server】网络通信基础

目录 网络通信基础 网络协议概述 TCP/IP 协议栈 端口和地址绑定 网络通信基础 网络协议概述 网络协议是一组规则和标准&#xff0c;定义了数据在网络中的传输方式。这些协议确保不同设备之间的通信顺畅且高效。网络协议分为多个层次&#xff0c;每个层次负责特定的任务。…

直播狂欢下的隐忧|专题报告集

原文链接&#xff1a;https://tecdat.cn/?p37200 从草根逆袭的烤摊主郭有才&#xff0c;仅用9天便突破千万粉丝&#xff0c;日入惊人的380万&#xff0c;到菏泽因直播热潮连夜紧急修路&#xff0c;这一切看似光鲜的背后&#xff0c;实则暗流涌动。 模仿“反诈老陈”、“保安…

Yearning-MYSQL 审计平台部署

目录 一. 环境准备 二. 部署安装 三. 基础使用 1.用户管理 2. 创建SQL审计流程 3. 自定义审核规则 4. 导入数据源 5. 创建权限组 6. 登录用户申请工单 1. 创建一个DDL工单提交 2. SQL审核执行 3. SQL执行 4. 数据验证 Yearning 是一个开源的 MySQL SQL 审计平台…

CTFHUB-文件上传-文件头检查

开启题目 1.php内容&#xff1a; <?php eval($_POST[cmd]);?> 截屏截一个很小很小的图片&#xff0c;保存为 png 格式&#xff0c;把 1.png 和 1.php 放在同一文件夹&#xff0c;在此目录打开 cmd&#xff0c; 使用以下命令把 1.png 和 1.php 合成为图片马 copy 1.pn…

内存池化技术详解:提升C++程序性能的关键

目录 一. 引言 内存池化技术的概念与重要性 内存池化在现代C开发中的应用 二. 内存池化的基本原理 内存池化的工作机制 常见的内存池实现策略 三. 最新的内存池化技术 C23标准中的新特性 第三方库的最新进展 jemalloc和tcmalloc的使用和改进 四. 内存池化在多线程环…

ThreadLocal:线程本地变量的作用与应用

ThreadLocal&#xff1a;线程本地变量的作用与应用 1、简介2、作用3、应用场景4、注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、简介 ThreadLocal 是Java中一个强大的工具类&#xff0c;用于创建线程局部变量。它为每个使用该…

Python教程(十):面向对象编程(OOP)

目录 专栏列表前言一、面向对象编程概述1.1 类和对象1.2 继承1.3 多态1.4 封装 二、Python 中的类和对象2.1 定义类2.2 __init__ 函数解释2.3 创建对象 三、继承3.1 基本继承3.2 创建子类对象 四、多态五、封装六. 访问限制七、综合实例结语 专栏列表 Python教程&#xff08;一…

MySQL~SQL语法

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是用于管理和操作关系数据库管理系统&#xff08;RDBMS&#xff09;的标准化语言。 SQL 在标识符&#xff08;如表名、列名、函数名等&#xff09;的处理上通常是不区分大小写的&#xff0c;这…

如何手写一个SpringBoot框架

你好&#xff0c;我是柳岸花开。 在这篇文章中&#xff0c;我们将手写模拟SpringBoot的核心流程&#xff0c;让大家能够以一种简单的方式了解SpringBoot的大概工作原理。 项目结构 我们创建一个工程&#xff0c;包含两个模块&#xff1a; springboot模块&#xff0c;表示Spring…

Redis 有关列表的命令

List 也叫列表&#xff0c;一般用来操作和存储一组有顺序的数据&#xff1b; 索引与数组类似&#xff0c;从 0 开始&#xff1b; 1. 从列表头部添加 LPUSH 2. 获取列表内容 LRANGE LRANGE 键名称 起始位置 结束位置 注意&#xff1a; LPUSH 命令将添加的元素依次添加到列…

IEEE1801 UPF 编写指南-1.MSV设计

多电源电压&#xff08;MSV&#xff09;设计为核心技术使用多个电源电压&#xff0c;如图1-1“MSV设计示例”所示。顶层设计和实例inst_A在电压VDD1下操作&#xff0c;而实例inst_B在电压VDD2下操作&#xff0c;实例inst_C在电压VDD3下操作。 在相同操作电压下运行&#xff08;…

Chapter 23 数据可视化——地图

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、基础绘图二、视觉映射三、案例分析 前言 随着地理信息系统&#xff08;GIS&#xff09;技术的迅猛发展和大数据时代的到来&#xff0c;数据可视化已经成为分析和理…