Selenium 浏览器坐标转桌面坐标

news2024/11/26 13:58:16

背景:

做图表自动化项目需要做拖拽操作,但是selenium提供的拖拽API无效,因此借用pyautogui实现拖拽,但是pyautogui的拖拽是基于Windows桌面坐标实现的,另外浏览器中的坐标与windows桌面坐标并不是一比一对应的关系,要把浏览器中的坐标转换成桌面坐标需要考虑的因素比较多,如:屏幕的分辨率、缩放比例、浏览器窗口位置、页面是否有滚动、工具栏高度等,本文不考虑窗口内部滚动的情况,假设下图黑框表示window桌面。

下面看下浏览器中selenium识别区的构成:

浏览器窗口位置:

浏览器窗口位置为:

var win_x = window.screenX || window.screenLeft;
var win_y = window.screenY || window.screenTop;

由于我们在做自动化的时候窗口基本都会最大化,因此不考虑窗口位置也可以,如果窗口没有缩放移动位置上述两项值均为0,移动了就不为0了,如下:

浏览器工具栏高度:

浏览器工具栏高度为窗口外部高度-窗口内部高度,因为浏览器中的坐标是不包含浏览器的高度的。

var toolbarHeight = window.outerHeight - window.innerHeight;

因此浏览器在进行坐标转换时需要考虑到以上因素,还需要考虑到屏幕的分辨率,缩放比例。

分辨率,如下图:

分辨率为1920*1200缩放比例为150%实际上与分辨率1280*800的视觉效果是一样的。如果考虑缩放的话则,浏览器中的坐标(browserX,browserY)转换成桌面坐标为:

// 计算浏览器中坐标的桌面坐标
var desktopX =(win_x+ browserX) * (screenWidth/window.innerWidth) ;
var desktopY =(win_y+toolbarHeight/desktopScale+ browserY) * (screenHeight/ window.innerHeight );
console.log("桌面坐标 (x, y):", desktopX, desktopY);

这里工具栏高度需要做一个转换toolbarHeight/desktopScale,desktopScale表示屏幕缩放比例。

pyautogui实现拖拽如下:

# 移动到拖拽元素中心坐标
pyautogui.moveTo(src_center_loc_x, src_center_loc_y, duration=1, tween=pyautogui.linear)
# 落到目标位置
pyautogui.dragTo(to_center_loc_x, to_center_loc_y, duration=2, button='left')

完整代码:

def browser_2_windows_coordinates_v2(self, browserX,browserY, screenWidth=1920, screenHeight=1200, desktopScale=1.5):
	# location = self.get_element_location(element)
	# x, y = location['left_up'][0], location['left_up'][1]
	script = '''
	function getDesktopCoordinates(browserX, browserY,screenWidth,screenHeight,desktopScale) {{
	// 浏览器中的坐标(x, y)
	var browserX = browserX;
	var browserY = browserY;
	// 屏幕分辨率
	var screenWidth = screenWidth;
	var screenHeight = screenHeight;
	// 桌面缩放比例
	var desktopScale = desktopScale;
	//- 浏览器窗口左上角的桌面坐标为(win_x, win_y)。
	var win_x = window.screenX || window.screenLeft;
	var win_y = window.screenY || window.screenTop;
	//计算工具栏高度
	var toolbarHeight = window.outerHeight - window.innerHeight;
	// 计算桌面坐标
	var desktopX =(win_x+ browserX) * (screenWidth/window.innerWidth) ;
	var desktopY =(win_y+toolbarHeight/desktopScale+ browserY) * (screenHeight/ window.innerHeight );
	console.log("桌面坐标 (x, y):", desktopX, desktopY);
	// 创建包含坐标的对象
	var desktopCoordinates = {{
	desktopX: desktopX,
	desktopY: desktopY
	}};
	return desktopCoordinates;
	}}
	var coordinates = getDesktopCoordinates({browserX}, {browserY},{screenWidth},{screenHeight},{desktopScale});
	return coordinates;
	'''.format(browserX=browserX, browserY=browserY, screenWidth=screenWidth, screenHeight=screenHeight,
	desktopScale=desktopScale)
	logging.info(script)
	desktopCoordinates = self.driver.execute_script(script)
	logging.info(desktopCoordinates)
	return desktopCoordinates

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

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

相关文章

【计算机网络】因特网中的电子邮件

文章目录 简单邮件传送协议SMTP邮件访问协议POP3IMAPHTTP 参考资料 电子邮件为异步通信媒介 因特网电子邮件系统 电子邮件系统的三个构件:用户代理、邮件服务器、邮件发送和读取协议 用户代理 User Agent 即UA 电子邮件客户端软件,用户与电子邮件系统的接…

【从入门到起飞】JavaSE—网络编程三要素,软件架构,UDP协议

文章目录 🎄什么是网络编程🌺常见的软件架构⭐BS架构的优缺点⭐CS架构的优缺点 🍔网络编程三要素🛸InetAddress类的使用⭐确定主机名称的IP地址✨查看主机名 ⭐获取此IP地址的主机名⭐返回文本显示中的IP地址字符串⭐IP&#x1f3…

Llama2-Chinese项目:3.1-全量参数微调

提供LoRA微调和全量参数微调代码&#xff0c;训练数据为data/train_sft.csv&#xff0c;验证数据为data/dev_sft.csv&#xff0c;数据格式如下所示&#xff1a; "<s>Human: "问题"\n</s><s>Assistant: "答案举个例子&#xff0c;如下所…

机器学习西瓜书+南瓜书吃瓜教程学习笔记第六章支持向量机

视频来源&#xff1a;b站直播 周志华老师机器学习西瓜树南瓜书 以下是我的学习笔记&#xff1a; 支持向量机&#xff08;support vector machines&#xff0c;SVM&#xff09;是一种二分类模型&#xff0c;它的目的是寻找一个超平面来对样本进行分割&#xff0c;分割的原则是间…

Java进阶必会JVM-深入浅出Java虚拟机

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 文章目录 系列文章目录前言一、推荐书籍二…

LeetCode 周赛上分之旅 #48 一道简单的树上动态规划问题

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…

软件测试/测试开发丨python 多态与super 学习笔记

本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/26828 python 多态与super 多态的概念 多态&#xff1a;Polymorphism 同名方法呈现多种行为 多态的表现 号 加法&#xff1a;数字 数字拼接&#xff1a;字符串 字符串合…

2023年10月腾讯云优惠活动汇总:腾讯云最新优惠、代金券整理

腾讯云作为国内领先的云服务提供商&#xff0c;致力于为用户提供优质、稳定的云服务。为了更好地满足用户需求&#xff0c;腾讯云推出了各种优惠活动。本文将给大家分享腾讯云最新优惠活动&#xff0c;帮助用户充分利用腾讯云提供的优惠。 一、腾讯云优惠券领取【点此领取】 腾…

北京互联网公司、外企、国企大盘点

今天来盘点北京的泛互联网公司。涵盖了综合类、外企类、硬件类、电商类、游戏类、娱乐类、生活类、工具类、人工智能类、金融类、教育类、招聘类、汽车类、外包类、信息化类以及国企央企类等多个领域。 综合类 字节跳动 美团 百度 阿里巴巴 腾讯 网易 外企类 微软 谷歌 亚马逊…

CSP-J第二轮试题-2021年-4题

文章目录 参考&#xff1a;总结 [CSP-J 2021] 小熊的果篮题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示答案1答案2答案3 现场真题注意事项 参考&#xff1a; https://www.luogu.com.cn/problem/P…

Leetcode 50.Pow(x,n)

实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&#xff1a;9.26100示例…

Java大数 -- BigInteger类

在java语言中&#xff0c;每一种整数类型都有自己的上限和下限&#xff0c;如果要想对非常大的整数做运算&#xff0c;就需要使用BigInteger类。特别在做算法题传入一个数值型的字符串时。 1.包 import java.math.*; 2.构造方法 public BigInteger(String str){...} BigInte…

Go_原子操作和锁

原子操作和锁 本文先探究并发问题&#xff0c;再探究锁和原子操作解决问题的方式&#xff0c;最后进行对比。 并发问题 首先&#xff0c;我们看一下程序 num该程序表面看上去一步就可以运行完成&#xff0c;但是实际上&#xff0c;在计算机中是分三步运行的&#xff0c;如下…

让大脑自由

前言 作者写这本书的目的是什么&#xff1f; 教会我们如何让大脑更好地为自己工作。 1 大脑的运行机制是怎样的&#xff1f; 大脑的基本运行机制是神经元之间通过突触传递信息&#xff0c;神经元的兴奋和抑制状态决定了神经网络的运行和信息处理&#xff0c;神经网络可以通过…

[架构之路-226]:信息系统建模 - 实体关系图、数据流图、数据字典、流程图

目录 一、信息系统建模概述 二、常见建模工具 2.1 实体关系图 -- “实体》类” 》关注实体&#xff0c;对象 2.2 数据流图 -- 数据流动 -- 关注数据本身 2.3 业务-流程图 -- 活动步骤 -- 关注动作、活动 三、建模工具的比较 3.1 数据流图与业务流程图的区别 3.2 数据、…

Linux高性能服务器编程 学习笔记 第九章 IO复用

IO复用使程序能同时监听多个文件描述符&#xff0c;这可以提高程序的性能&#xff0c;通常网络程序在以下情况需要使用IO复用&#xff1a; 1.客户端进程需要同时处理多个socket。 2.客户端进程需要同时处理用户输入和网络连接。 3.TCP服务器要同时处理监听socket和连接socket…

网络-Ajax

文章目录 前言一、Ajax优点&#xff1a;缺点&#xff1a; 二、使用步骤XNLHttpRequest对象完整代码 总结 前言 本文主要记录Ajax技术的简介&#xff0c;以及用法。 一、Ajax Ajax是一组用于在Web浏览器和Web服务器之间进行异步通信的Web开发技术。 它代表着Asynchronous Java…

如果在 Mac 上的 Safari 浏览器中无法打开网站

使用网络管理员提供的信息更改代理设置。个人建议DNS解析&#xff0c;设置多个例如114.114.114.114 8.8.8.8 8.8.4.4 如果打不开网站&#xff0c;请尝试这些建议。 在 Mac 上的 Safari 浏览器 App 中&#xff0c;检查页面无法打开时出现的信息。 这可能会建议解决问题的…

第 114 场 LeetCode 双周赛题解

A 收集元素的最少操作次数 模拟: 反序遍历数组&#xff0c;用一个集合存当前遍历过的不超过 k k k 的正数 class Solution { public:int minOperations(vector<int> &nums, int k) {unordered_set<int> vis;int n nums.size();int i n - 1;for (;; i--) {if…

nodejs+vue活鲜物流监控系统elementui

第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;技术背景 5 3.2.2经济可行性 6 3.2.3操作可行性&#xff1a; 6 3.3 项目设计目标与原则 6 3.4系统流程分析 7 3.4.1操作流程 7 3.4.2添加信息流程 8 3.4.3删除信息流程 9 第4章 系统设计 11 …