Как мы можем заставить Watir-Webdriver работать с экраном недействительных сертификатов IE? - PullRequest
3 голосов
/ 12 ноября 2011

Мы, наверное, все видели этот экран при тестировании, все, что вам нужно, это сайт HTTPS с самозаверяющим сертификатом, и вы получаете экран "Есть проблема с сертификатом безопасности этого сайта", который требует, чтобы вы щелкнули ссылкудля продолжения.

С Watir это не проблема, я автоматизирую экран так же, как и любую другую веб-страницу, нажимая ссылку в соответствии с ее текстом или значением идентификатора.

С Watir-Webdriver это так же, какесли ничего внутри HTML не может быть распознано.и я не одинок в этом См. этот вопрос

Это не просто попытка щелкнуть ссылку, почти все, что вы попробуете здесь, потерпит неудачу на этой странице Даже простая функция, такая как puts browser.text вернет ошибку.

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

Вы можете просмотреть исходный код, использовать инструменты разработчика или сделать так, чтобы элемент браузера выкладывал HTML-код и прямо видеть проклятый тег body, но Webdriver не видит егопо какой-то причине.

Я не знаю, является ли это ключом или красной сельдью, но я знаю, что веб-драйвер использует тонну XPATH под капотом, и я считаю, что XPATH чувствителен к регистру.и в этом отношении я вижу что-то очень необычное, когда я использую puts browser.html против этой страницы, в том, что каждое имя тега в верхнем регистре.Несколько необычный, но законный действительный HTML в любом случае.Использование browser.html на других страницах показывает строчные теги.Может ли это быть причиной того, что у вебдрайвера возникла такая большая проблема с этой страницей?

У кого-нибудь есть какие-нибудь яркие идеи относительно того, как я могу заставить веб-драйвер видеть элемент ссылки, чтобы я мог щелкнуть по нему?

Вывод из объекта браузера, когда я запрашиваю его для страницы HTML

irb(main):019:0> puts $browser.html  #note, indentation is added later for clarity
<HTML dir=ltr>
<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>
      <IMG id=shieldIcon alt="Shield icon" src="red_shield_48.png"> 
    </TD>
    <TD id=mainTitleAlign vAlign=middle align=left>
      <H1 id=mainTitle>There is a problem with this website's security certificate</H1>
    </TD>
  </TR>
  <TR>
    <TD>
      <H3>
        <DIV id=linkdiv name="linkdiv"></DIV>
      </H3>
    </TD>
  </TR>
  <TR>
  <!-- This row is for the the divider-->
    <TD id=errorCodeAlign class=errorCodeAndDivider align=right>&nbsp;
      <DIV class=divider></DIV>
    </TD>
  </TR>
  <!-- Error Body -->
  <TR>
    <TD></TD>
    <TD>
      <H3>
        <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>
        <NOSCRIPT id=securityCert1></NOSCRIPT><BR>
          <ID id=securityCert2>
            Security certificate problems may indicate an attempt to fool you or intercept any data you send to the server.
          </ID>
      </H3>
    </TD>
  </TR>
  <!-- Recommendation-->
  <TR>
    <TD>&nbsp;</TD>
    <TD><H2 id=recommendation><B>We recommend that you close this webpage and do not continue to this website. </B></H2></TD>
  </TR>
  <!-- close webpage-->
  <TR>
    <TD>&nbsp;</TD>
    <TD id=closeWebpageAlign vAlign=middle align=left>
      <H4 id=closeWebpage>
        <IMG class=actionIcon border=0 alt="Recommended icon" src="green_shield.png">
        <A href="javascript:closePage()">Click here to close this webpage.</A> 
      </H4>
    </TD>
  </TR>
  <!-- continue to site-->
  <TR>
    <TD>&nbsp;</TD>
    <TD id=continueToSiteAlign vAlign=middle align=left>
      <H4 id=continueToSite>
        <IMG id=ImgOverride class=actionIcon border=0 alt="Not recommended icon" src="red_shield.png">
        <A id=overridelink href="http://admanager.qa-prod.local/signups/lead_form" name=overridelink>Continue to this website (not recommended).</A> 
      </H4>
    </TD>
  </TR>
  <!-- InfoBlock -->
  <TR>
    <TD id=infoBlockAlign vAlign=top align=right>&nbsp; </TD>
    <TD id=moreInformationAlign vAlign=middle align=left>
      <H4>
        <TABLE>
          <TBODY>
            <TR>
              <TD vAlign=top>
                <A onclick="javascript:expandCollapse('infoBlockID', true); return false;" href="#">
                  <IMG id=infoBlockIDImage class=actionIcon border=0 alt="More information" src="down.png">
                </A>
              </TD>
              <TD vAlign=top>
                <SPAN id=moreInfoContainer>
                  <A href="javascript:expandCollapse('infoBlockID', true);">More information</A>
                </SPAN>
                <NOSCRIPT></NOSCRIPT>
              </TD>
            </TR>
          </TBODY>
        </TABLE>
      </H4>
      <DIV style="DISPLAY: none" id=infoBlockID class=infoBlock>
        <P>
        <LI id=errorExpl1>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.
        <LI id=errorExpl2>When going to a website with an address such as https://example.com, try adding the 'www' to the address, https://www.example.com.
          <P></P>
          <P id=moreInfoSeeHelpPF>For more information, see "Certificate Errors" in Internet Explorer Help.
          </P>
        </LI>
      </DIV>
    </TD>
  </TR>
</TBODY>
</TABLE>
</BODY>
</HTML>
=> nil
irb(main):020:0>

Ответы [ 2 ]

2 голосов
/ 14 мая 2012
driver.goto("javascript:document.getElementById('overridelink').click()")
2 голосов
/ 15 ноября 2011

Я немного поэкспериментировал, в том числе использовал HTML-код, который я разместил для создания своей собственной страницы, без всякого JavaScript. Если я работаю с этой страницей, я обнаруживаю, что она блокирует действия JavaScript. В этом случае, когда я пытаюсь сделать что-то вроде browser.text или browser.link.exists?, Я вижу всплывающее окно с предупреждением IE, сообщающее, что IE не позволяет JS работать на этой странице. (что-то, чего я никогда не вижу на настоящей странице сертификата об ошибке) И в watir-webdriver я получаю те же ошибки, о которых сообщил. Если я выберу вариант, чтобы разрешить JS, я смогу работать со страницей в watir-webdriver.

Похоже, что что-то в самой природе страницы препятствует любой автоматизации уровня JS, которая блокирует доступ Webdriver к странице.

Я понимаю, почему MS делает это, они не хотят, чтобы фиктивный сайт каким-то образом использовал JavaScript, чтобы обойти это предупреждение. Видимо, способ, которым Watir управляет вещами (через OLE?), Не рассматривается как то, что вы могли бы сделать удаленно, и, следовательно, ему разрешен доступ к странице.

Тогда решение состоит в том, чтобы либо использовать Watir для автоматизации IE, либо сделать так, чтобы сертификат был доверенным, и, таким образом, вы не увидите предупреждение.

Если вы хотите использовать Watir-Webdriver, вам нужно добавить сертификаты, используемые на ваших тестовых серверах, в хранилище доверенных корневых центров сертификации. Обратите внимание, что это не «персональный» магазин по умолчанию! При добавлении сертификата вам нужно изменить место, куда он будет помещать сертификат, или вы в основном делаете только один раз для этой авторизации сеанса. Будет предупреждение о том, что теперь все сертификаты с этого разрешения будут доверенными. Я бы использовал это с большой осторожностью, только в тестовых системах и только для доверия сертификатам от ваших собственных внутренних тестовых серверов.

Это довольно легко сделать после перехода на страницу вручную, дважды щелкнув красное предупреждение, напоминающее, что сертификат недействителен. Если вы сделали это правильно, вы можете закрыть браузер, открыть заново, выполнить навигацию и не получить ошибку.

...