Google Chrome nie odświeża elementów ułatwień dostępu ( AutomationElement ), gdy użytkownik przewija stronę w dół w przeglądarce.
Aby to odtworzyć:
- Włącz dostępność renderera za pomocą:
"chrome --force-render-accessibility"
lub ustawiając Globalną dostępność na"chrome://accessibility"
. - Przejdź do http://en.wikipedia.org/wiki/Google
- Otwórz inspect.exe w trybie automatyzacji interfejsu użytkownika (z zestawów Windows), poszukaj elementu „Linki do powiązanych artykułów”.
- Wróć do Chrome. Przewiń w dół, aż zobaczysz „Linki do powiązanych artykułów” u dołu
- Element „Linki do artykułów pokrewnych” jest odznaczony poza ekranem
Znalazłem ręczne rozwiązania, które mogą zmusić Chrome do odświeżenia:
- Ustaw Zoom na 90%, a następnie ustaw go z powrotem na 100% (bardzo, bardzo brzydki sposób)
- Wyłącz ułatwienia dostępu, a następnie włącz je
chrome://accessibility/
To, czego szukam, to możliwość wykonania jednej z tych operacji programowo lub dowolnej operacji, która może zmusić Chrome do odświeżenia drzewa pamięci podręcznej.
Co próbowałem:
- Zmień rozmiar okna za pomocą
PInvoke/MoveWindow
- Przerysuj okno za pomocą
PInvoke/Redrawwindow
- Zbuduj rozszerzenie chrome i wymuś powiększenie do 100% na żądanie:
chrome.tabs.setZoom(null, 0);
(działa, ale mruga i spowalnia okno)
Żadne z nich nie działa poprawnie.
EDYCJA : testowane w Google Chrome 40.XX, 41.XX, 42.XX, 43.XX, 44.XX, 45.XX, 46.XX, 47.XX.Dev, 48.XX.Dev w systemie Windows 7.
c#
google-chrome
pinvoke
accessibility
ui-automation
Idealnie 28
źródło
źródło
Odpowiedzi:
Przewijanie prostych stron jest zoptymalizowane tak, aby nie wymagało obliczeń od modułu renderującego. Do przewijania potrzebne są tylko kompozytor i GPU, dlatego drzewo renderowania, które jest aktualizowane tylko z modułu renderującego, jest nadal takie samo.
Wymaganie od renderera przechodzenia przez DOM i aktualizowania drzewa dostępności podczas przewijania jest sprzeczne z kilkuletnim wysiłkiem związanym z płynnym przewijaniem, szczególnie w przypadku urządzeń dotykowych, więc nie sądzę, abyś uzyskał przyczepność do poprawki błędu.
Twój pomysł na rozszerzenie moim zdaniem jest najlepszym (choć brzydkim) kompromisem. Ale raczej zmiana powiększenia, zrobienie małej mutacji strony (lub DOM) może być lepszym rozwiązaniem. Spróbuj na przykład dodać niewidoczny (lub prawie taki) element o małej kolejności z. Będziesz także musiał ocenić mutację, tak aby zdarzała się tylko 1 razy na sekundę lub nawet rzadziej.
źródło
Architektura wieloprocesowa Chrome różni się od architektury każdej innej przeglądarki. Ze względów bezpieczeństwa główny interfejs przeglądarki działa w ramach jednego procesu, a strony internetowe są uruchamiane w oddzielnych procesach renderowania (zwykle po jednym na kartę). Procesy Renderer są jedynymi, które reprezentują DOM strony internetowej, a tym samym wszystkie informacje o dostępności, ale procesy renderowania nie mają w szczególności zezwolenia na interakcję z systemem operacyjnym (wysyłanie lub odbieranie zdarzeń lub wiadomości) - w szczególności mechanizm renderujący procesy nie mogą wysyłać ani odbierać zdarzeń dotyczących dostępności.
źródło