首页
Search
1
v2ray异常错误之二
3,310 阅读
2
linux时区设置
2,698 阅读
3
DB2常用操作
2,173 阅读
4
websphere修改jvm内存xmx和xms
1,929 阅读
5
nfs客户端文件属主为nobody的现象
1,552 阅读
技术
生活
运动
游戏
电影
登录
Search
标签搜索
docker
linux
troubleshooting
nginx
secure
truenas
mysql
windows
python
esxi
docker swarm
oracle
zabbix
tomcat
blog
dsm
群晖
rpa
freenas
db
yuc
累计撰写
291
篇文章
累计收到
0
条评论
首页
栏目
技术
生活
运动
游戏
电影
页面
搜索到
11
篇与
的结果
2024-05-27
tagui之click功能在Linux下无效的问题
问题 这个问题与之前的 select功能无法正常使用类似,表现为在 linux 下,特别是在 iframe 中交互元素的时候,经常无法正常点击到元素。 以前猜测过是系统某些软件或者服务依赖存在问题导致的,但是在长大几个月的使用 tagui 中发现,只安装了 tagui 的 centos、ubuntu 同样存在此问题。 原因 直到现在仍然没有排查到原因,对 tagui 的整个代码和执行逻辑还没有太了解。但是通过查看成功与不成功的场景,发现 tagui_chrome.log 中的日志有一些的区别,并且验证了在多个不同 centos、ubuntu 中可能存在同样的问题 排查过程 click成功的日志输出: [tagui] INPUT - [7] {"id":7,"method":"Runtime.evaluate","params":{"expression":"document.evaluate('(//frame|//iframe)[@name=\"MFrame\" or @id=\"MFrame\"]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotLength"}} [tagui] OUTPUT - [7] {"id":7,"result":{"result":{"type":"number","value":1,"description":"1"}}} [tagui] INPUT - [8] {"id":8,"method":"Runtime.evaluate","params":{"expression":"var result_bounds = document.evaluate('(//frame|//iframe)[@name=\"MFrame\" or @id=\"MFrame\"]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotItem(0).getBoundingClientRect(); var result_rect = {top: Math.round(result_bounds.top), left: Math.round(result_bounds.left), width: Math.round(result_bounds.width), height: Math.round(result_bounds.height)}; result_rect","returnByValue":true}} [tagui] OUTPUT - [8] {"id":8,"result":{"result":{"type":"object","value":{"top":110,"left":240,"width":1080,"height":601}}}} [tagui] INPUT - [9] {"id":9,"method":"Runtime.evaluate","params":{"expression":"mainframe_context = document.evaluate('(//frame|//iframe)[@name=\"MFrame\" or @id=\"MFrame\"]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotItem(0).contentDocument"}} [tagui] OUTPUT - [9] {"id":9,"result":{"result":{"type":"object","subtype":"node","className":"HTMLDocument","description":"#document","objectId":"-211116244302657272.5.1"}}} [tagui] INPUT - [10] {"id":10,"method":"Runtime.evaluate","params":{"expression":"(function (dom_json) {document.querySelector('iframe').contentWindow.dlClick.call(document.querySelector('iframe').contentDocument.querySelectorAll('.tdlist > div')[0]);})({})"}} [tagui] OUTPUT - [10] {"id":10,"result":{"result":{"type":"undefined"}}} click 不成功的日志输出 [tagui] INPUT - [66] {"id":66,"method":"Runtime.evaluate","params":{"expression":"document.evaluate('(//frame|//iframe)[@name=\"MFrame\" or @id=\"MFrame\"]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotLength"}} [tagui] OUTPUT - [66] {"id":66,"result":{"result":{"type":"number","value":1,"description":"1"}}} [tagui] INPUT - [67] {"id":67,"method":"Runtime.evaluate","params":{"expression":"var result_bounds = document.evaluate('(//frame|//iframe)[@name=\"MFrame\" or @id=\"MFrame\"]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotItem(0).getBoundingClientRect(); var result_rect = {top: Math.round(result_bounds.top), left: Math.round(result_bounds.left), width: Math.round(result_bounds.width), height: Math.round(result_bounds.height)}; result_rect","returnByValue":true}} [tagui] OUTPUT - [67] {"id":67,"result":{"result":{"type":"object","value":{"top":110,"left":240,"width":1080,"height":601}}}} [tagui] INPUT - [68] {"id":68,"method":"Runtime.evaluate","params":{"expression":"mainframe_context = document.evaluate('(//frame|//iframe)[@name=\"MFrame\" or @id=\"MFrame\"]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotItem(0).contentDocument"}} [tagui] OUTPUT - [68] {"id":68,"result":{"result":{"type":"object","subtype":"node","className":"HTMLDocument","description":"#document","objectId":"6526965194935895727.5.2"}}} 通过日志最后几行可以看到,click不成功的时候最后在定位到 元素 后根本没有输出点击这个元素的日志。这个到底是什么原因我们排查手段有限,也许在后续有时间更加熟悉 tagui 代码后能够帮助它排查出来,但是现在我们不得而知。 这个现象与其他 click 或者 select 点击不了有很大的类似,也有一些不同。目前观察到的问题,只要在linux下无法click或者select元素,那么基本上都是通过坐标来定位的。有时候是坐标点击出现了误差,有些(这次)是根本没有执行代码。 所以我们解决的办法是通过 js 来操作,目前经过了这多次测试验证,基本上只要通过了控制台执行,那么 rpa 的 js 调用也可以成功。 但是 js 执行对于我们来说比较复杂,因为有时候浏览器本身提供的功能无法满足,还需要查看网站是否提供了内部的方法,比如下面这个 r.dom(f"document.querySelector('iframe').contentWindow.dlClick.call(document.querySelector('iframe').contentDocument.querySelectorAll('.tdlist > div')[{x}-1])") 这里主要是想双击iframe内的元素,实测进入 iframe 后通过 dclick 不稳定,经常有很多案件进入不了,所以这里一整行都是为了 双击 进入某个案件。 前面一部分是定位到此 iframe ,中间一部分是调用此 iframe 中的 dlClick.call 方法,这是站点提供的双击方法,在 top 中不存在,所以需要第一部分定位到 iframe 中,接着我们在这个方法内还需要定位到此元素,又需要从 top 开始找,所以第一部分 定位 iframe 的代码仍然需要,最后一部分就是定位元素具体的代码,这个了解即可 PS. 方案汇总 后续一些场景下 click 点击不到的解决方案汇总: 123xx 环境点击案件详细页面的关闭按钮无效 r.frame() r.dom('MFrame.contentWindow.document.querySelector("#btnBack").click()') # 其中 MFrame 是元素所在的 iframe 名,当然在点击之前需要回到此 iframe 的上层
2024年05月27日
10 阅读
0 评论
0 点赞
2024-05-21
python3.10的安装
安装问题 python3.10 要求 openssl1.1 ,所以一般源码正常安装完后,也是有部分功能异常的,比如 requests,urllib,以及 pip 安装模块,基本上都是提示 ssl 存在问题,例如 pip 是如下错误: Could not fetch URL https://pypi.org/simple/xxx/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/xxx/ (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:997)'))) - skipping 如何解决 解决这个问题查询了很多资料,中途还有设置很多的环境变量之类,最后这里使用一个最简单的安装办法来解决这个问题: 准备操作系统,不符合 openssl1.1 的需求 准备 openssl1.1 的最新包,在 openssl 官方网站下载,20240520 首页最新最低只有3.0了,所以从归档下载吧 安装 openssl ,如下步骤 #./config --prefix=/usr/local/openssl ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl -Wl,-rpath,/usr/local/openssl/lib shared zlib make && make install 把 openssl 库文件加载到系统中 echo "/usr/local/openssl/lib/" >> /etc/ld.so.conf.d/ssl.conf && ldconfig -pv ldconfig 然后可以通过 ldconfig -pv | grep ssl 查看到是否存在 ssl1.1 的版本 5. 安装 python3.10 ./configure --prefix=/usr/local/python3.10 --with-openssl=/usr/local/openssl make && make install 通过这样安装之后,基本上在后续的使用都不会存在ssl的问题 错误之一 20240525 python3错误一,在安装完成后导入某些模块仍然可能报如下错误: ModuleNotFoundError: No module named '_ctypes' 这是因为系统依赖不完整导致,一般使用 centos 不会出现这个问题,而 ubuntu 等出现的概率较大 需要安装以下依赖,然后重新编译安装 python3 # centos yum install libffi-devel -y # ubuntu sudo apt-get install libffi-dev
2024年05月21日
17 阅读
0 评论
0 点赞
2024-04-29
python连接vertica数据库
代码 import vertica_python import ssl conn_info = {'host':'xxx.xxx.com','port':5433,'user':'dbadmin','password':'dbadmin','database':'vtc','ssl':True} with vertica_python.connect(**conn_info) as conn: cur = conn.cursor() cur.execute('select current_schema()') print(cur.fetchone()[0])
2024年04月29日
6 阅读
0 评论
0 点赞
2023-07-18
python解决模块依赖以及纯内网安装
问题背景 在互联网情况下,我们安装一个模块还是比较方便的,指定好国内的镜像源即可快速的安装了。但是如果是在纯内网的环境,并且模块较多的情况,一个一个去离线下载安装,在这个过程中发现缺失的依赖,再去处理,未免太过麻烦,所以今天来看看如何解决此类问题。 freeze和pipreqs 其实不管是别人写的脚本,还是我们自己写的脚本,关于上面模块安装和依赖的这个问题都是有办法解决的,操作如下: 先在相同版本的互联网服务器上在线安装好所有的模块,并且保证脚本能正常运行 方案一 # 使用 freeze 命令,导出全部的依赖模块 pip3 freeze > requirements.txt freeze 是有局限性的,命令只会生成通过pip install 安装的包,所以如果你不是通过这个方式安装的模块,那么很可能只会生成一个 requirements.txt 文件,而没有离线包 方案二 # 使用 pipreqs 命令,导出所需依赖 pipreqs ./ --force 下载模块和依赖 上面的方案操作后,只是生成了依赖文件,还需要根据依赖文件下载各模块 pip3 download -r requirements.txt -d packages -i https://pypi.tuna.tsinghua.edu.cn/simple 其实 freeze 的方式,如果没有导出离线包,但是生成了 requirements.txt 也是可以通过 download 来下载模块的 目的机器 把脚本和模块目录传输到对应的目的机器,执行以下脚本导入模块 pip3 install --no-index --find-links=./ -r ./requirements.txt PS. 注意事项 选择相同python否则导出的依赖包版本可能不一致 选择干净的python环境,不同模块依赖的软件版本不同,可能出现版本不兼容的情况 选择相同的操作系统版本,有些模块对系统库有依赖,比如glibc库,可能出现不兼容的情况 pip3 freeze 会导出全局所有的模块,可能会导出很多的无关模块,可以优先试试 pipreqs
2023年07月18日
10 阅读
0 评论
0 点赞
2023-03-23
Python安装模块错误之一
0x1 错误一: UserWarning: Unknown distribution option: 'install_requires' pip install --upgrade pip pip install --upgrade setuptools 错误二: Cannot uninstall 'requests'. It is a distutils installed project pip install --upgrade requests --ignore-installed
2023年03月23日
999 阅读
0 评论
0 点赞
1
2
3