O Google Chrome não atualiza elementos de acessibilidade ( AutomationElement ) quando um usuário rola para baixo no navegador.
Para reproduzi-lo:
- Ative a acessibilidade do renderizador com:
"chrome --force-render-accessibility"
ou configurando Global Accessibility em"chrome://accessibility"
. - Acesse http://en.wikipedia.org/wiki/Google
- Abra o inspect.exe no modo de automação da interface do usuário (no Windows Kits), procure o elemento "Links para artigos relacionados".
- Volte ao Chrome, role para baixo até que "Links para artigos relacionados" na parte inferior fique visível
- O elemento "Links para artigos relacionados" está marcado fora da tela
Encontrei algumas soluções manuais que podem forçar o Chrome a atualizá-lo:
- Defina o zoom para 90% e depois para 100% (muito, muito feio)
- Desligue a acessibilidade e ligue-a
chrome://accessibility/
O que estou procurando é a capacidade de executar uma dessas operações programaticamente ou qualquer operação que possa fazer o Chrome atualizar sua árvore de cache.
O que eu tentei:
- Redimensione a janela com
PInvoke/MoveWindow
- Redesenhar janela com
PInvoke/Redrawwindow
- Crie uma extensão do Chrome e force o zoom a 100% sob demanda:
chrome.tabs.setZoom(null, 0);
(funcionando, mas pisque e diminua a velocidade da janela)
Nenhuma delas está funcionando corretamente.
Edição : Testado com Google Chrome 40.XX, 41.XX, 42.XX, 43.XX, 44.XX, 45.XX, 46.XX, 47.XX.Dev, 48.XX.Dev no Windows 7.
c#
google-chrome
pinvoke
accessibility
ui-automation
Perfeito28
fonte
fonte
Respostas:
A rolagem em páginas simples é otimizada para não exigir computação do renderizador. Somente o compositor e a GPU são necessários para rolar, portanto, a árvore de renderização que é atualizada apenas a partir do renderizador ainda é a mesma.
Exigir que o renderizador atravesse o DOM e atualize a árvore Acessibilidade durante uma rolagem é contrário ao esforço de vários anos de rolagem suave, especialmente para dispositivos sensíveis ao toque, para que eu não ache que você irá obter tração em uma correção de bug.
Sua idéia de uma extensão, eu acho, é o melhor (embora feio) compromisso. Mas, em vez disso, mudar o zoom, fazer uma pequena mutação na página (ou DOM) pode ser uma solução melhor. Tente, por exemplo, adicionar um elemento invisível (ou quase isso) com uma ordem z baixa. Você também precisará controlar a taxa de mutação, para que ela aconteça apenas uma vez por segundo ou com menos frequência.
fonte
A arquitetura de múltiplos processos do Chrome é diferente da de qualquer outro navegador. Por segurança, a interface do usuário principal do navegador está em um processo e as páginas da Web são executadas em processos separados do renderizador (normalmente um por guia). Os processos do renderizador são os únicos com uma representação do DOM da página da web e, portanto, de todas as informações de acessibilidade, mas especificamente os processos do renderizador não podem interagir com o sistema operacional (enviando ou recebendo eventos ou mensagens) - em particular, o renderizador processos não podem enviar ou receber eventos de acessibilidade.
fonte