【python自动化】Playwright基础教程(十)元素拖拽元素坐标获取网页源码元素内文本

【python自动化】Playwright基础教程(十)元素拖拽&元素坐标&获取网页源码&元素内文本

本文目录

文章目录

  • 【python自动化】Playwright基础教程(十)元素拖拽&元素坐标&获取网页源码&元素内文本
    • playwright系列回顾
    • 前文代码
    • 元素拖拽drag-and-drop
    • 元素坐标bounding_box
    • 获取网页源码
    • 获取元素内文本

playwright系列回顾

playwright连接已有浏览器操作

selenium&playwright获取网站Authorization鉴权实现伪装requests请求

【python自动化】playwright长截图&切换标签页&JS注入实战

【python自动化】Playwright基础教程(二)快速入门

【python自动化】Playwright基础教程(三)定位操作

【python自动化】Playwright基础教程(四)事件操作①元素高亮&元素匹配器

【python自动化】Playwright基础教程(五)事件操作②悬停&输入&清除精讲

前文代码

直接定位指定浏览器

class Demo05:
    def __init__(self):
        """
        使用playwright连接谷歌浏览器
        :return:
        """
        self.playwright = sync_playwright().start()
        # 连接已经打开的浏览器,找好端口
        browser = self.playwright.chromium.connect_over_cdp("http://127.0.0.1:9223")
        self.default_context = browser.contexts[0]
        self.page = self.default_context.pages[0]

启动新的浏览器

class Demo06:
    def __init__(self, url):
        playwright = sync_playwright().start()
        browser = playwright.chromium.launch(headless=False)
        context = browser.new_context()
        self.page = context.new_page()
        self.page.goto(url)
       
        
if __name__ == '__main__':
    mwj = Demo05(url="指定的url")
    mwj.Locator_testid()

元素拖拽drag-and-drop

官方文档:https://playwright.dev/python/docs/api/class-page#page-drag-and-drop

此方法将指定元素拖拽到目标元素,它将首先移动到源元素,执行mousedown,再移动到目标元素执行mouseup

使用方法

page.drag_and_drop("#source", "#target")
# 或者指定相对于元素左上角的精确位置:
page.drag_and_drop(
  "#source",
  "#target",
  source_position={"x": 34, "y": 7},
  target_position={"x": 10, "y": 20}
)

测试网址:https://www.w3school.com.cn/html/html5_draganddrop.asp

我这里自己写了一个HTML进行测试。命名为draganddrop.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Drag and Drop</title>
    <style>
        #dragElement {
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            top: 0;
            left: 0;
            cursor: move;
        }

        #dropElement {
            width: 200px;
            height: 200px;
            background-color: green;
            margin: auto;
        }
    </style>
</head>
<body>
<div id="bigdiv">
    <div id="dragElement"></div>
    <div id="dropElement"></div>
    <div><span>大家好,这里是梦无矶的测试开发之路playwright教程</span></div>
    <div id="mytext"><span>这个页面是用来测试拖拽,读取元素坐标,网页文本的</span></div>
</div>

<script>
    const dragElement = document.getElementById('dragElement');
    let isDragging = false;
    let startOffset = {x: 0, y: 0};

    function startDrag(e) {
        isDragging = true;
        startOffset.x = e.clientX - dragElement.offsetLeft;
        startOffset.y = e.clientY - dragElement.offsetTop;
    }

    function endDrag() {
        isDragging = false;
    }

    function drag(e) {
        if (!isDragging) return;
        dragElement.style.left = e.clientX - startOffset.x + 'px';
        dragElement.style.top = e.clientY - startOffset.y + 'px';
    }

    dragElement.addEventListener('mousedown', startDrag);
    document.addEventListener('mouseup', endDrag);
    document.addEventListener('mousemove', drag);
</script>
</body>
</html>

页面展示

image-20230920154440303

拖拽代码

把红色的框拖拽到绿色的框里面。

from playwright.sync_api import sync_playwright
url = r"file:///D:/L_Learning/MyLearningCode/learn_playwright/playwright_demo/draganddrop"
class Demo06:
    def __init__(self, url):
        playwright = sync_playwright().start()
        browser = playwright.chromium.launch(headless=False)
        context = browser.new_context()
        self.page = context.new_page()
        self.page.goto(url)
        
    def drag_and_drop_operate(self):
        self.page.drag_and_drop(source="#dragElement", target="#dropElement")  
  1. drag_and_drop()方法中的sourcetarget参数可以是元素的选择器字符串,也可以是使用Playwright中的定位器(Locator)对象。
  2. 在执行拖拽之前,请确保要拖动的元素和目标元素都已经加载完成。

元素坐标bounding_box

官方文档:https://playwright.dev/python/docs/api/class-locator#locator-bounding-box

使用方法

def bouding_box_operate(self):
    bounding = self.page.locator("#dragElement").bounding_box()
    print(bounding)  # {'x': 0, 'y': 0, 'width': 100, 'height': 100}

这里我们使用的还是前面拖拽使用的网页代码。

可以看到,他的返回值是有四个,xy的值表示该元素左上角的坐标,width和height分别表示这个元素的宽高。

定位该元素的中心点可以通过如下方式计算获得。

x,y = box["x"] + box["width"] / 2, box["y"] + box["height"] / 2

获取网页源码

playwright获取网页源代码和selenium获取源代码的方式类似。

# selenium获取网页源码
page_source = self.driver.page_source
# playwright获取网页源码
page_source = self.page.content()

使用这个方法,如果接触过爬虫的同学应该就知道了,网页上的所有信息都可以拿出来,使用正则进行提取相关数据。

获取元素内文本

比如在一些表格,样式比较规范,内容比较统一的页面,我们需要把文本进行输出或存储,可以直接使用playwright提取相关元素下面的文本。

playwright提供了挺多方法进行提取文本的,常用的有如下这些。

使用方法

locator.all_inner_texts()
locator.all_text_contents()
locator.inner_text()
locator.text_content()
locator.inner_html()

使用前文的html进行测试

def element_text(self):
    mytext1 = self.page.locator("#bigdiv").all_inner_texts()
    mytext2= self.page.locator("#bigdiv").all_text_contents()
    mytext3 = self.page.locator("#bigdiv").inner_text()
    mytext4 = self.page.locator("#bigdiv").text_content()
    mytext5 = self.page.locator("#bigdiv").inner_html()

区别

  1. locator.all_inner_texts():返回值为列表,返回匹配定位器的所有元素的内部文本内容,并可以包含子元素的文本内容。返回的是包含所有元素内部文本的数组。
  2. locator.all_text_contents():返回值为列表,返回匹配定位器的所有元素的全文本内容,包括所有子元素的文本内容。返回的是包含所有元素全文本内容的数组。
  3. locator.inner_text():返回值为字符串,返回匹配定位器的第一个元素的内部文本内容,并可以包含子元素的文本内容。
  4. locator.text_content():返回值为字符串,返回匹配定位器的第一个元素及其所有子元素的全文本内容。
  5. locator.inner_html():返回值为字符串,返回匹配定位器的第一个元素的内部HTML代码,包括所有子元素。

效果展示

image-20230920163208320

完整代码

def element_text(self):
    mytext1 = self.page.locator("#bigdiv").all_inner_texts()
    print(type(mytext1), "all_inner_texts:\n", mytext1)
    print("=============================")
    mytext2 = self.page.locator("#bigdiv").all_text_contents()
    print(type(mytext2), "all_text_contents:\n", mytext2)
    print("=============================")
    mytext3 = self.page.locator("#bigdiv").inner_text()
    print(type(mytext3), "inner_text:\n", mytext3)
    print("=============================")
    mytext4 = self.page.locator("#bigdiv").text_content()
    print(type(mytext4), "text_content:\n", mytext4)
    print("=============================")
    mytext5 = self.page.locator("#bigdiv").inner_html()
    print(type(mytext5), "inner_html:\n", mytext5)
    print("=============================")

playwright不想写了,累了!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开发vue3 UI组件库,并且发布到NPM

目录 1.创建vue3工程 2.创建package文件 3.编写组件&#xff0c;并且导出 4.编写package.json 5.npm账号注册登录并发布 6.从npm安装使用 7.注意事项 1.创建vue3工程 &#xff08;1&#xff09;初始化Vue项目 cnpm create vite &#xff08;2&#xff09;进入文件夹…

LeetCode(10)跳跃游戏 II【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 45. 跳跃游戏 II 1.题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nu…

桥接模式(结构型)

目录 一、前言 二、桥接模式 三、总结 一、前言 桥接模式&#xff08;Bridge Pattern&#xff09;是一种常用的设计模式&#xff0c;它可以将抽象部分与它的实现部分分离&#xff0c;使它们可以独立地变化。桥接模式通常用于需要在多个维度上扩展一个类的情况&#xff0c;或…

牛客网上错题总结及重写(C语言)(2)

每日一言 空不是无&#xff0c;空是一种存在&#xff0c;你得用空这种存在填满自己。 --三体 题目BC43 我当时为什么把它收藏起来呢?? 正确代码 #include <stdio.h> int main() {int n 0;scanf("%d",&n);printf("%d",n/12*42);return 0; }题…

分发饼干(贪心算法+图解)

455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 题目描述 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最…

AI:72-基于深度学习的火灾检测

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

C++网络编程库编写自动爬虫程序

首先&#xff0c;我们需要使用 C 的网络编程库来编写这个爬虫程序。以下是一个简单的示例&#xff1a; #include <iostream> #include <string> #include <curl/curl.h> #include <openssl/ssl.h>const char* proxy_host "duoip"; const in…

腾讯云服务器优惠服务器和优惠折扣,腾讯云用户优惠

腾讯云服务器提供了丰富多样的云服务产品&#xff0c;满足不同用户的需求。其中&#xff0c;推荐的产品包括轻量应用服务器和云服务器CVM&#xff0c;分别适用于不同规模和需求的用户。这些产品提供了各种配置和价格的服务器选项&#xff0c;涵盖了不同的计算需求。 实惠的价格…

8.5 矢量图层点要素分级(Graduated)渲染使用

文章目录 前言分级&#xff08;Graduated&#xff09;渲染QGis代码实现 总结 前言 前面介绍了矢量-点要素-单一符号以及矢量-点要素-分类符号的用法本章介绍分级&#xff08;Graduated&#xff09;渲染说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 分级…

图解Morris遍历

1. 简述 morris遍历是不借助栈空间实现二叉树遍历的一种方法。 其核心思想是&#xff0c;利用当前节点左子树的最右叶子节点当索引节点。 即中序遍历的前驱节点。 第一次遍历根节点的时候&#xff0c;找到该节点&#xff0c;将该节点右儿子指向根节点。 第二次回到该节点时…

说说react中引入css的方式有哪几种?区别?

一、是什么 组件式开发选择合适的css解决方案尤为重要 通常会遵循以下规则: 可以编写局部css,不会随意污染其他组件内的原生;可以编写动态的css,可以获取当前组件的一些状态,根据状态的变化生成不同的css样式;支持所有的css特性:伪类、动画、媒体查询等;编写起来简洁…

‘XXX‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 系统找不到指定的路径。

目录 问题复现解决方案 问题复现 只要一打开cmd就提示“‘LT’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。” 或许大家都遇到过这样的问题&#xff0c;但本篇解决的是和运行项目无关&#xff0c;而是cmd命令行自带的一个bug 解决方案 如果是执行java…

nodejs+vue+python+PHP+微信小程序-安卓-校园贴吧管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

arcgis--NoData数据处理

方法一&#xff1a;利用【栅格计算器】可以对NoData的值进行修改。【Spatial Analyst工具】-【地图代数】-【栅格计算器】&#xff0c;将NoData修改为某一个值。 方法二&#xff1a;先对原始数据进行重分类&#xff0c;分成1类&#xff0c;将NoData赋值为2,。然后&#xff0c;将…

外贸SEO是什么意思?谷歌优化有哪些平台?

外贸SEO优化最新指南&#xff1f;独立站谷歌SEO优化怎么做&#xff1f; 通过有效的外贸SEO策略&#xff0c;企业可以在国际市场上取得竞争优势&#xff0c;吸引更多的目标客户&#xff0c;并增加销售额。顺风船将探讨外贸SEO的重要性以及如何实施这一战略&#xff0c;以帮助您…

SDL2 加载图片

1.简介 在SDL中&#xff0c;本身只支持加载BMP格式的图片SDL_LoadBMP&#xff0c;如果想要加载别的格式图片&#xff0c;需要编译SDL_image库。 SDL_image库中IMG_Load和都是IMG_LoadTexture用于加载图片的函数&#xff0c;但是它们的使用方式和返回值有所不同。 IMG_Load和…

android studio新版本gradle Tasks找不到assemble

最近需要打包arr&#xff0c;但android studio新版本为了加快编译速度&#xff0c;取消了gradle下的assemble任务&#xff0c;网上还没有博主更新解决方案&#xff0c;因此一直找不到解决方案&#xff0c;后来尝试如下操作才解决&#xff0c;方便后来者解决。 先将这里勾选上&…

51单片机应用从零开始(二)

目录 1. 什么是单片机系统 1.1 单片机本身 1.2 构成单片机系统——单片机外围器件 2. 如何控制一个发光二极管 2.1 硬件设计&#xff08;系统电路图 &#xff09; 2.2 硬件设计&#xff08;搭建硬件电路的器材 &#xff09; 2.3 软件设计&#xff08;中文描述的程…

麒麟KYLINOS中使用Ghost镜像文件还原系统

原文链接&#xff1a;麒麟KYLINOS中使用Ghost镜像文件还原系统 hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟KYLINOS备份还原的第三篇文章&#xff0c;使用Ghost镜像文件还原系统&#xff0c;将之前做好的Ghost镜像文件拷贝到u盘里&#xff0c;然后在另一台终端上…

使用SQL分析数据科学职业发展趋势

大家好&#xff0c;在数据成为新石油的今天&#xff0c;了解数据科学职业的细微差别比以往任何时候都更加重要。无论你是正在寻找机会的数据爱好者&#xff0c;还是资深数据专家&#xff0c;使用SQL都可以让你深入了解数据科学就业市场。 本文可以带你了解哪些数据科学职位最具…