Идентификация элемента из вложенного HTML-кода под фреймом с использованием Selenium (подтверждено без iframe) - PullRequest
1 голос
/ 27 июня 2019

Я изучаю Selenium, используя python, и пытался автоматизировать заполнение форм на каком-то сайте.

Однако я не могу определить какой-либо элемент под фреймом, и он выдал ошибку NoSuchElementException.Я попытался использовать другую функцию find_element, например CSS, XPATH (почти уверен, что XPATH правильный, поскольку я скопировал его из Firebug), а также попытался включить явное ожидание, используя WebDriverWait.Однако ничего не произошло.

Команда, которую я пробовал ранее:

driver.find_element_by_id("testFormNumForLastAttempt"); 
driver.find_element_by_xpath("//input[@type='text' and @name='testFormNumForLastAttempt']");

wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.ID, "testFormNumForLastAttempt")));

Я пытался переключиться на другой кадр

    driver.switch_to.frame("main")
        raise exception_class(message, screen, stacktrace)
    NoSuchFrameException: Message: No frame found

Я извлек соответствующий код HTML ниже и искалдля решения определить входной параметр testFormNumForLastAttempt.

Заранее спасибо.Любая помощь будет очень признательна.

<html>

<frameset rows="0,0,*" frameborder="no" border="0">

  <frame name="applet_container" scrolling="no" marginwidth="0" marginheight="0" noresize src="">
    <frame name="javascript_container" scrolling="no" marginwidth="0" marginheight="0" noresize src="/repoes/td-es-app517/RETJSContainer_WOC.do?__AUTHENTICATION_REQUEST_PARAMETER_MECHANISM__=applet">
      <frame name="main" scrolling="yes" noresize src="/repoes/td-es-app517/Loading.do" marginwidth="0" marginheight="0" frameborder="0">

        <html>

        <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <meta http-equiv="Cache-Control" content="no-cache">
          <meta http-equiv="Expires" content="0">
          <meta http-equiv="Pragma" content="no-cache">


          <div id="authByTestForm">
            <table width="100%" cellspacing="0" cellpadding="0" border="0">
              <tbody>
                <tr>
                  <td>Test Form No. for Last Attempt <span class="star">*</span> </td>
                  <td>
                    <input type="text" size="10" maxlength="8" name="testFormNumForLastAttempt" id="testFormNumForLastAttempt" value="" class="uppercase" autocomplete="off">

                  </td>
                </tr>
                <tr>
                  <td valign="top">Date of Birth <span class="star">*</span></td>
                  <td>
                    <table class="example_table">
                      <tbody>
                        <tr>
                          <td colspan="7">
                            <input type="text" size="4" maxlength="4" id="testFormBirthYear" name="testFormBirthYear" onkeyup="moveOnMax(this,'testFormBirthMonth')" value="" autocomplete="off"> Year

                            <input type="text" size="2" maxlength="2" id="testFormBirthMonth" name="testFormBirthMonth" onkeyup="moveOnMax(this,'testFormBirthDay')" value="" autocomplete="off"> Month

                            <input type="text" size="2" maxlength="2" id="testFormBirthDay" name="testFormBirthDay" value="" autocomplete="off"> Day

                          </td>
                        </tr>
                        <tr>
                          <td>Example:</td>
                          <td class="example_cell">1995</td>
                          <td>Year</td>
                          <td class="example_cell">09</td>
                          <td>Month</td>
                          <td class="example_cell">08</td>
                          <td>Day</td>
                        </tr>
                      </tbody>
                    </table>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>

1 Ответ

1 голос
/ 27 июня 2019

Тег <input> с id как testFormNumForLastAttempt , кажется, вложен в 3 слоя <frame>.

То есть click() внутри элемента, который вы должны:

  • Игнорировать (безопасно) присутствие тегов parent или child <frameset>.
  • Induce WebDriverWait для первого слоя frame_to_be_available_and_switch_to_it().
  • Induce WebDriverWait для второго слоя _ frame_to_be_available_and_switch_to_it().
  • Induce WebDriverWait для третьегослой frame_to_be_available_and_switch_to_it().
  • Индуцируйте WebDriverWait для нужного element_to_be_clickable().
  • Можно использовать следующее решение:

    • Блок кода:

      from selenium import webdriver
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.common.by import By
      
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"applet_container")))
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"frame[name='javascript_container'][src$='__AUTHENTICATION_REQUEST_PARAMETER_MECHANISM__=applet']")))
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//frame[@name='main' and contains(@src, 'Loading')]")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#testFormNumForLastAttempt[name='testFormNumForLastAttempt']"))).click()
      

Соответствующее обсуждение можно найти в Как найти и щелкнуть элементкоторый вложен в несколько фреймов и набор фреймов через Selenium с помощью Webdriver и C #


Outro

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...