Chrome Webdriver 如何将窗口设为可见,或者设为 active 状态 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
nznd
V2EX    Python

Chrome Webdriver 如何将窗口设为可见,或者设为 active 状态

  •  
  •   nznd 2021-02-01 14:25:14 +08:00 2771 次点击
    这是一个创建于 1715 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原始需求:

    • 公司使用的工单系统无法正常推送邮件通知,自己写了一个 python 脚本检测 ticket 列表,如果有新的,就通知

    实现过程:

    • 使用 selenium 进行网页监测,通过执行 js 的 querySelector 查找元素,返回值丢给 python 处理

    遇到困难:

    • shadowroot不能在 webdriver 直接处理,改用 js 语句处理,算是已解决
    • 网页如果不 active (包括但不限于被最小化,按压 win+d,有窗口被最大化)页面元素不会刷新,目前不知道是什么原因导致的,推测与 shadowroot 有关,但是无相关资料查实( ps: 使用 --headless 也会导致获取不到元素)

    试图解决:

    • 尝试使用 win32gui 的 SetForegroundWindow 解决,但是会随机选择 chrome 窗口前置,查找进程使用的进程名,和普通 chrome 一样,均为 Google Chrome
    • 尝试直接抓包请求,但是使用证书单点登录,直接用证书路径需要管理员权限而且有安全隐患,转头尝试 chrome 插件传输 cookie 到 python,算解决一半;网站使用的是 graphql 请求体看的我脑壳痛,写不下去解析,最终放弃这条路
    • 最终选择在读取路径失败时右下角通知一下,然后手动打开窗口让他加载

    页面地址只限内网访问,还需要什么信息尽管提,我会尽快回复

    有没有熟练的老哥指点一下哪里可以优化

    第 1 条附言    2021-02-04 14:38:38 +08:00

    感谢@luzihang #8 提供的第二个方法,花费了最小资源使监控脚本能正常运行, 此贴问题解决,当然也欢迎更多的讨论或者大佬指点更好的姿势

    11 条回复    2021-02-04 14:36:06 +08:00
    TimePPT
        1
    TimePPT  
    PRO
       2021-02-01 14:30:08 +08:00
    需求是,因为工单系统邮件推送通知异常,所以写了个 python 脚本监控了本地浏览器打开的工单后台,有新 ticket 就直接本地通知?
    luzihang
        2
    luzihang  
       2021-02-01 14:32:21 +08:00
    加一个
    driver.fresh()
    time.sleep(5)
    nznd
        3
    nznd  
    OP
       2021-02-01 14:34:40 +08:00
    @TimePPT #1 是的,工单系统那边说已经在做了,但是进度缓慢(上线 3 个月了还没修复) 貌似是要分配用户组,但是一直没迁移过来,领导也不知道怎么办,给的 work round 是每天看一看... 客户已经切过去了...
    (是从一个大公司里买的然后到内网部署,可能部门没划分好(? 反正很无语...
    nznd
        4
    nznd  
    OP
       2021-02-01 14:35:36 +08:00
    @luzihang #2 尝试过,并不会将窗口前置,也获取不到数据,切换到窗口界面才开始加载数据
    TimePPT
        5
    TimePPT  
    PRO
       2021-02-01 14:52:12 +08:00 via Android
    @nznd selenium 用得不多,直接 pypeeter 操纵呢?
    liubiantao
        6
    liubiantao  
       2021-02-01 14:54:42 +08:00
    你需要的可能就是一个 chrome 插件
    [Distill Web Monitor - Chrome 网上应用店]( https://chrome.google.com/webstore/detail/distill-web-monitor/inlikjemeeknofckkjolnjbpehgadgge )
    [Web Scraper - Free Web Scraping - Chrome 网上应用店]( https://chrome.google.com/webstore/detail/web-scraper-free-web-scra/jnhgnonknehpejjnehehllkliplmbmhn )
    ku360517703
        7
    ku360517703  
       2021-02-01 15:00:24 +08:00
    headless 不会导致获取不到元素的。headless 可以指定窗口大小,元素基本都能找到的
    luzihang
        8
    luzihang  
       2021-02-01 15:05:26 +08:00   1
    三个尝试建议
    driver 就是你当前的任务 Webdriver
    1 、使用容器版本 Chrome,比 headless 感觉功能完整

    2 、使用切换句柄
    windows = driver.window_handles # 获取打开的多个窗口句柄
    driver.switch_to.window(windows[-1]) # 切换到当前最新打开的窗口

    3 、试试用 pyautogui ?先获取 webdriver 的顶点坐标,用 pyautogui 去模拟键鼠点击那里,就可以置顶。
    x = driver.get_window_rect().get('x')
    y = driver.get_window_rect().get('y')
    pyautogui.moveTo(x + 2, y + 2)
    pyautogui.click()
    nznd
        9
    nznd  
    OP
       2021-02-01 16:12:39 +08:00
    @TimePPT #5 可以学习一下,这周看看
    @liubiantao #6 这个插件不能做集成,我想后续加上发送邮件功能,给 team 里每个人都发送一封邮件,刚刚试了下第一个还是存在不能加载元素的情况,第二个就没有尝试了
    @ku360517703 #7 真的没有元素,窗口大小指定了 800x600 只要有前台窗口就能获取,没有前台窗口就获取不到,100%复现
    @luzihang #8 容器的有考虑,如果没有更好的方案就尝试一下,第二个建议看着很成功,准备实践一下! 十分感谢!!
    tisswb
        10
    tisswb  
       2021-02-04 11:07:00 +08:00
    playwright 了解一下
    nznd
        11
    nznd  
    OP
       2021-02-04 14:36:06 +08:00
    @tisswb #10 这个不行的,必须用公司提供的 chrome 版本,不然无法加入域控,不能使用证书登录
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5476 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 08:33 PVG 16:33 LAX 01:33 JFK 04:33
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86