当前位置 : 主页 > 编程语言 > python >

pywinauto自动化操作谷歌浏览器 pywinauto操作没有窗口的应用

来源:互联网 收集:自由互联 发布时间:2022-06-15
一、需求背景 需要获取微信链接卡片的链接地址,正常情况下 点开卡片 -- 复制链接 -- 读取剪切板 就好了 但是有些链接卡片没有复制链接按钮,也不允许转发: 经过调研,可以通过点

一、需求背景

需要获取微信链接卡片的链接地址,正常情况下 点开卡片 -- 复制链接 -- 读取剪切板 就好了

pywinauto自动化操作谷歌浏览器  pywinauto操作没有窗口的应用_微信

 

但是有些链接卡片没有复制链接按钮,也不允许转发:

pywinauto自动化操作谷歌浏览器  pywinauto操作没有窗口的应用_chrome_02

 

经过调研,可以通过点击 “在默认浏览器打开” 按钮在谷歌浏览器中获取

首先想到的是用selenium来读取url,后来考虑到还要下载webdriver,对浏览器版本也有要求,很麻烦,不如使用pywinauto来得快

二、技术实现

pywinauto自动化操作谷歌浏览器  pywinauto操作没有窗口的应用_chrome_03

 

 只需要定位到这个地址栏,然后获取他的值就可以了,但是实现起来有几个问题:

1.最外面的一层直接就是  窗格 ,不像微信一样是 窗口 ,可以用app.window.child_window获取

2.地址栏获取到的地址缺少缺少'https://'https://,或者 'https://www,还有http的这些开头

3.谷歌浏览器打开后进程号有一大堆

解决如下:

pywinauto自动化操作谷歌浏览器  pywinauto操作没有窗口的应用_微信_04pywinauto自动化操作谷歌浏览器  pywinauto操作没有窗口的应用_地址栏_05

def get_pid(pname):
pid_lis = []
for proc in psutil.process_iter():
#print(“pid-%d,name:%s” % (proc.pid,proc.name()))
if proc.name() == pname:
pid_lis.append(proc.pid)
# return proc.pid
return pid_lis

pid_list = get_pid('chrome.exe')
for pid in pid_list:
chrome = ChromeAuto(pid)
link = chrome.get_url()
if link:
chrome.quit()
os.system(f"taskkill /t /f /im chrome.exe")
print(link)
break
else:
logger.info(f'url get none')

脚本演示

 

class ChromeAuto:
"""链接点开默认浏览器打开后的谷歌界面
"""
def __init__(self, process=None):
self.app = None
self._start(process=process)

def _start(self, process=None):
if process:
self.app = Application(backend='uia').connect(process=process)
else:
logger.debug(f'IeAuto _start err')
return

def quit(self):
if self.app:
self.app.kill()
self.app = None

def get_url(self):
try:
# print(self.app.top_window()) # pywinauto.application.WindowSpecification
# print(self.app.window()) # pywinauto.application.WindowSpecification
# print(self.app.windows()) # [] 不能再往下进行查找操作了

for i in self.app.windows(): # 下面的流程比较耗时,进程号不对的没有self.app.windows()不会走下面的逻辑,优化速度
edit_ctrl = self.app.top_window().child_window(title='地址和搜索栏', control_type='Edit')
# print(edit_ctrl.texts) # 控件信息: # print(edit_ctrl.get_value())

edit_ctrl.double_click_input() # 地址栏显示的不是全链接,缺少'https://'https://,或者 'https://www,还有http的等等,双击后显示全链接
time.sleep(0.5)
url = edit_ctrl.get_value() # uia_controls.py中有各种类型的控件类,可查看各自的方法属性
if url:
# if not 'url'.startswith('https://'):
# url = 'https://' + url
return url
except:
logger.info(f'ChromeAuto get_url err')

 


上一篇:pyinstaller打包项目报错总结
下一篇:没有了
网友评论