Como podemos obter o Watir-Webdriver para trabalhar com a tela cert inválida do IE?

Provavelmente todos já vimos essa tela durante o teste, basta um site HTTPS com um certificado autoassinado e você verá a tela "Há um problema com o certificado de segurança deste site", que exige que você clique em um link para continuar.

Com Watir isso não é problema, eu automatizo a tela como faria com qualquer outra página da Web, clicando no link de acordo com seu texto ou valor de ID.

Com o Watir-Webdriver é como se nada dentro do HTML pudesse ser reconhecido. e eu não estou sozinho neste Veja esta pergunta

Não é só tentar clicar em um link, quase qualquer coisa que você tentar aqui falhará nesta página Mesmo uma função simples, como coloca o browser.text , retornará um erro.

Selenium::WebDriver::Error::NoSuchElementError: Unable to find element with tag name == body

Você pode visualizar o código-fonte, usar ferramentas de desenvolvedor ou fazer com que o elemento do navegador cuspa o código HTML e veja claramente a tag body certificada ali, mas o Webdriver está cego a ele por algum motivo.

Eu não sei se é uma pista ou um arenque vermelho, mas eu sei que o webdriver usa uma tonelada de XPATH sob o capô, e eu acredito que o XPATH faz distinção entre maiúsculas e minúsculas. e, a esse respeito, vejo algo muito incomum quando uso coloca browser.html nessa página, em que todos os nomes de tag estão em maiúsculas. HTML invulgar mas legal válido em qualquer caso. O uso de browser.html em outras páginas mostra tags em letras minúsculas. Isso pode estar causando o Webdriver com um problema tão grande nesta página?

Alguém tem alguma idéia brilhante de como eu posso conseguir o webdriver para ver o elemento link para que eu possa clicar nele?

Saída do objeto do navegador quando eu solicitar a página HTML

irb(main):019:0> puts $browser.html  #note, indentation is added later for clarity

<head>
<title>Certificate Error: Navigation Blocked</title>
<link rel=stylesheet type=text/css href="ErrorPageTemplate.css">
<meta name=MS.LOCALE content=EN-US>
<meta content="text/html; charset=utf-8" http-equiv=Content-Type>
<meta content=Yes http-equiv=MSThemeCompatible>
<script language=javascript type=text/javascript src="errorPageStrings.js">
</script>
<script language=javascript type=text/javascript src="httpErrorPagesScripts.js">
</script>
<script language=javascript type=text/javascript src="invalidcert.js">
</script>
</head>
<body onload="BodyLoad(); initMoreInfo('infoBlockID');" class=securityError>
<table border=0 cellSpacing=0 cellPadding=0 width=730>
  <!-- Main title -->
  <tbody>
  <tr>
    <td id=shieldIconAlign vAlign=top rowSpan=3 width=60 align=left>
      Shield icon 
    </td>
    <td id=mainTitleAlign vAlign=middle align=left>
      

There is a problem with this website's security certificate

    </td>
  </tr>
  <tr>
    <td>
      

<div id=linkdiv name="linkdiv"></div>

 
    </td>
  </tr>
  <tr>
  <!-- This row is for the the divider-->
    <td id=errorCodeAlign class=errorCodeAndDivider align=right> 
      <div class=divider></div>
    </td>
  </tr>
  <!-- Error Body -->
  <tr>
    <td></td>
    <td>
      

<div style="DISPLAY: block" id=CertUnknownCA name="CertUnknownCA"> The security certificate presented by this website was not issued by a trusted certificate authority. </div> <div style="DISPLAY: none" id=CertExpired name="CertExpired"></div> <div style="DISPLAY: none" id=CertCNMismatch name="CertCNMismatch"></div> <div style="DISPLAY: none" id=CertRevoked name="CertRevoked"></div>
Security certificate problems may indicate an attempt to fool you or intercept any data you send to the server.

 
    </td>
  </tr>
  <!-- Recommendation-->
  <tr>
    <td> </td>
    <td>

We recommend that you close this webpage and do not continue to this website.

 </td>
  </tr>
  <!-- close webpage-->
  <tr>
    <td> </td>
    <td id=closeWebpageAlign vAlign=middle align=left>
      

Recommended icon Click here to close this webpage.

 
    </td>
  </tr>
  <!-- continue to site-->
  <tr>
    <td> </td>
    <td id=continueToSiteAlign vAlign=middle align=left>
      

Not recommended icon Continue to this website (not recommended).

 
    </td>
  </tr>
  <!-- InfoBlock -->
  <tr>
    <td id=infoBlockAlign vAlign=top align=right>  </td>
    <td id=moreInformationAlign vAlign=middle align=left>
      

<table> <tbody> <tr> <td vAlign=top> More information </td> <td vAlign=top> More information </td> </tr> </tbody> </table>

 
      <div style="DISPLAY: none" id=infoBlockID class=infoBlock>
        
  • If you arrived at this page by clicking a link, check the website address in the address bar to be sure that it is the address you were expecting.
    • When going to a website with an address such as https://example.com, try adding the 'www' to the address, https://www.example.com.

      For more information, see "Certificate Errors" in Internet Explorer Help.

    • </div> </td> </tr> </tbody> </table> </body> </html> => nil irb(main):020:0>
  • 3
    Você já tentou adicionar a exceção no IE antes? Talvez haja uma configuração no IE para uma verificação de certificação menos rigorosa.
    adicionado o autor m33lky, fonte
    Algo funky pode estar acontecendo quando o IE injeta esse aviso que atrapalha o funcionamento interno do webdriver.
    adicionado o autor m33lky, fonte
    @ M33lky, suponho que isso possa funcionar como uma solução alternativa, mas francamente, já que Watir não tem nenhum problema em clicar no link, eu esperaria que ele funcionasse também no watir-webdriver. E se isso for quebrado, com certeza gostaria de saber por que, já que parece não haver nada muito especial sobre a fonte da página que eu possa ver.
    adicionado o autor Chuck van der Linden, fonte
    parece desativar o javascript, o que parece impedir o webdriver de conduzir o navegador
    adicionado o autor Chuck van der Linden, fonte

    2 Respostas

    Eu fiz um pouco de experimentação, inclusive usando o HTML que postei para criar minha própria página, sem qualquer JavaScript. Se eu trabalho com essa página, acho que bloqueia ações JavaScript. Nesse caso, quando tento fazer coisas como browser.text ou browser.link.exists ?, vejo um popup de aviso do IE que me informa que o IE está impedindo o JS de trabalhar nessa página. (algo que eu nunca vi na página de erro do certificado real) E no watir-webdriver eu recebo os mesmos erros que relatei. Se eu clicar na opção para permitir JS, posso trabalhar com a página em watir-webdriver.

    Portanto, parece que algo na natureza da página está impedindo qualquer automação de nível JS que bloqueia o acesso do Webdriver à página.

    Eu vejo porque o MS está fazendo isso, eles não querem um site falso de alguma forma usar JavaScript para contornar esse aviso. Aparentemente, a maneira como Watir dirige as coisas (via OLE?) Não é vista como algo que você poderia fazer remotamente e, portanto, é permitido o acesso à página.

    A solução, então, é usar o Watir para a sua automação do IE, ou torná-lo assim, o certificado é confiável e, portanto, você não vê o aviso.

    Se você quiser usar o Watir-Webdriver, precisará adicionar os certificados usados ​​em seus servidores de teste ao armazenamento de Autoridades de Certificação Raiz Confiáveis. Nota NÃO a loja 'pessoal' padrão! Ao adicionar o certificado, você precisa alterar o local em que colocará o certificado ou basicamente fará uma única vez para essa autorização de sessão. Haverá um aviso de que agora todos os certificados dessa autoridade serão confiáveis. Eu usaria isso com muito cuidado, somente em sistemas de teste e apenas para confiar em certificados de seus próprios servidores de teste internos.

    É muito fácil fazer isso depois de continuar manualmente para a página, clicando duas vezes no aviso vermelho, lembrando que o certificado é inválido. Se você fez isso corretamente, pode fechar o navegador, reabrir, fazer sua navegação e não receber um erro.

    2
    adicionado
    driver.goto("javascript:document.getElementById('overridelink').click()")
    
    2
    adicionado
    Interessante, posso ter que tentar da próxima vez que me deparar com essa tela. Minha solução preferida neste momento é apenas adicionar os certificados auto-assinados à lista confiável nos sistemas de teste, o que faz com que eles reajam da mesma maneira que o navegador de um usuário real reagiria quando atingisse seu site de produção, o que presumimos tem um certificado válido.
    adicionado o autor Chuck van der Linden, fonte