跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Chrome Webdriver 如何将窗口设为可见,或者设为 active 状态
未分類
29 1 月 2021

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

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

資深大佬 : nznd 2

原始需求:

  • 公司使用的工单系统无法正常推送邮件通知,自己写了一个 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 请求体看的我脑壳痛,写不下去解析,最终放弃这条路
  • 最终选择在读取路径失败时右下角通知一下,然后手动打开窗口让他加载

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

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

大佬有話說 (10)

  • 資深大佬 : TimePPT

    需求是,因为工单系统邮件推送通知异常,所以写了个 python 脚本监控了本地浏览器打开的工单后台,有新 ticket 就直接本地通知?

  • 資深大佬 : luzihang

    加一个
    driver.fresh()
    time.sleep(5)

  • 主 資深大佬 : nznd

    @TimePPT #1 是的,工单系统那边说已经在做了,但是进度缓慢(上线 3 个月了还没修复) 貌似是要分配用户组,但是一直没迁移过来,领导也不知道怎么办,给的 work round 是每天看一看… 客户已经切过去了…
    (是从一个大公司里买的然后到内网部署,可能部门没划分好(? 反正很无语…

  • 主 資深大佬 : nznd

    @luzihang #2 尝试过,并不会将窗口前置,也获取不到数据,切换到窗口界面才开始加载数据

  • 資深大佬 : TimePPT

    @nznd selenium 用得不多,直接 pypeeter 操纵呢?

  • 資深大佬 : liubiantao

    你需要的可能就是一个 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

    headless 不会导致获取不到元素的。headless 可以指定窗口大小,元素基本都能找到的

  • 資深大佬 : luzihang

    三个尝试建议
    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

    @TimePPT #5 可以学习一下,这周看看
    @liubiantao #6 这个插件不能做集成,我想后续加上发送邮件功能,给 team 里每个人都发送一封邮件,刚刚试了下第一个还是存在不能加载元素的情况,第二个就没有尝试了
    @ku360517703 #7 真的没有元素,窗口大小指定了 800×600 只要有前台窗口就能获取,没有前台窗口就获取不到,100%复现
    @luzihang #8 容器的有考虑,如果没有更好的方案就尝试一下,第二个建议看着很成功,准备实践一下! 十分感谢!!

  • 資深大佬 : tisswb

    playwright 了解一下

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具