Se estamos apenas coletando maneiras básicas de detectar visibilidade, não esqueço:
opacity > 0.01; // probably more like .1 to actually be visible, but YMMV
E sobre como obter atributos:
element.getAttribute(attributename);
Então, no seu exemplo:
document.getElementById('snDealsPanel').getAttribute('visibility');
Mas o que? Não funciona aqui. Olhe mais de perto e você verá que a visibilidade está sendo atualizada não como um atributo no elemento, mas usando a style
propriedade Esse é um dos muitos problemas ao tentar fazer o que você está fazendo. Entre outros: você não pode garantir que realmente haja algo para ver em um elemento, apenas porque sua visibilidade, exibição e opacidade têm os valores corretos. Ele ainda pode não ter conteúdo ou pode não ter altura e largura. Outro objeto pode obscurecê-lo. Para mais detalhes, uma rápida pesquisa no Google revela isso e até inclui uma biblioteca para tentar resolver o problema. (YMMV)
Confira o seguinte, que são possíveis duplicatas desta pergunta, com excelentes respostas, incluindo algumas dicas do poderoso John Resig. No entanto, seu caso de uso específico é um pouco diferente do padrão, portanto evitarei sinalizar:
(EDIT: OP diz que ele está raspando páginas, não as criando, então abaixo não é aplicável) Uma opção melhor? Vincule a visibilidade dos elementos às propriedades do modelo e sempre torne a visibilidade contingente nesse modelo, da mesma forma que o Angular faz com o ng-show. Você pode fazer isso usando qualquer ferramenta que desejar: JS angular e simples, qualquer que seja. Melhor ainda, você pode alterar a implementação do DOM ao longo do tempo, mas sempre poderá ler o estado do modelo, em vez do DOM. Ler a sua verdade a partir do DOM é ruim. E devagar. Muito melhor verificar o modelo e confiar na sua implementação para garantir que o estado do DOM reflita o modelo. (E use o teste automatizado para confirmar essa suposição.)
document.getElementById('snDealsPanel').style.visibility