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 · 2340 次点击
    这是一个创建于 1418 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原始需求:

    • 公司使用的工单系统无法正常推送邮件通知,自己写了一个 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  
       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  
       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   ·   实用小工具   ·   2775 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:41 · PVG 10:41 · LAX 18:41 · JFK 21:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.