O que "sempre" funciona é usar selênio de alguma linguagem de programação. É claro que você enfrenta o mesmo problema que os humanos enfrentam quando navega por arquivos controlados por javascript: você nunca sabe se está totalmente pronto para compilar a página.
Você não poderá usar o Ctrl + S ou o SaveButton, mas o selênio permite que você recupere o html da página. Normalmente, é bom o suficiente para esperar X segundos (X dependendo da complexidade de construir a página e sua conexão). Você também pode verificar os elementos que devem estar disponíveis na página "concluída" (ou seja, após a conclusão da construção de JavaScript suficiente da árvore DOM) e salvar o HTML com base nesse acionador.