c# - 使用UI自动化的Google Chrome访问者树缓存问题

当用户在浏览器中向下滚动时,Google Chrome不会刷新辅助功能元素(AutomationElement)。

重现它:

  1. 启用渲染器辅助功能:PInvoke/MoveWindow或通过设置全局辅助功能"chrome://accessibility"
  2. 转到[http://en.wikipedia.org/wiki/Google]
  3. 在UI自动化模式下打开inspect.exe(从Windows Kits),查找“链接到相关文章”元素。
  4. 回到Chrome,向下滚动,直到底部显示“链接到相关文章”
  5. 屏幕上标有“相关文章的链接”元素

我找到了一些可以强制Chrome刷新它的手动解决方案:

  1. 将缩放设置为90%然后将其设置为100%(非常非常难看)
  2. 关闭可访问性,然后在PInvoke/MoveWindow中打开

我正在寻找的是能够以编程方式执行这些操作之一,或任何可以使Chrome刷新其缓存树的操作。


我尝试过的:

  • 使用PInvoke/MoveWindow调整窗口大小
  • Redraw Window with chrome.tabs.setZoom(null, 0);
  • 构建镀铬扩展并按需强制缩放至100%:chrome.tabs.setZoom(null, 0);(工作但闪烁并减慢窗口速度)

这些都没有正常工作。

编辑:在Windows 7下使用Google Chrome 40.XX,41.XX,42.XX,43.XX,44.XX,45.XX,46.XX,47.XX.Dev,48.XX.Dev进行测试。

2个解决方案
1 votes

滚动简单页面已经过优化,无需从渲染器进行计算。 因此只需要合成器和GPU来滚动,因此仅从渲染器更新的渲染树仍然是相同的。

要求渲染器遍历DOM并在滚动期间更新辅助功能树,这与几年平滑滚动的努力相反,特别是对于触摸设备,因此我认为您不会对错误修复有所了解。

我认为你对扩展的想法是最好的(尽管是丑陋的)妥协。 而是改变缩放,对页面(或DOM)进行小的变异可能是更好的解决方案。 例如,尝试添加具有低z顺序的不可见(或接近)元素。 您还需要对变异进行速率控制,使其每秒只发生1次甚至更少。

AlienRancher answered 2019-04-22T17:25:02Z
-1 votes

Chrome的多进程架构与任何其他浏览器的架构不同。 为了安全起见,主浏览器UI在一个进程中,并且网页在单独的渲染器进程中运行(通常每个选项卡一个)。 Renderer进程是唯一具有网页DOM表示的进程,因此是所有可访问性信息,但渲染器进程特别不允许与操作系统交互(发送或接收事件或消息) - 特别是渲染器 进程无法发送或接收辅助功能事件。

Rebecca Wright answered 2019-04-22T17:25:27Z
translate from https://stackoverflow.com:/questions/30434961/google-chrome-accessible-tree-cache-issue-with-ui-automation