这是我第一次使用Selenium Web驱动程序(带有Python),并且我试图转到搜索框,在其中输入内容,然后点击Submit。

相关的HTML如下所示:

<iframe id="mainFrame" class="" width="100%" height="" frameborder="0" title="Main content frame" onload="initFrame();" scrolling

....

<tr>

    <td style="vertical-align:middle;">
         <input id="terms" type="text" onblur="RevertText(this,'Enter Search Terms');" onfocus="AllowType(this,'Enter Search Terms')" value="Enter Search Terms" style="color: rgb(164, 164, 164);"></input>
    </td>
    <td style="vertical-align:middle;">
         <input id="srchButt" class="buttAcdmicOne" type="submit" value="Search"></input>
    </td>
</tr>


我的代码如下所示:

driver.switch_to.frame("mainFrame")
elem = driver.find_element_by_id("terms")
elem.send_keys("Test")


但这是行不通的,我也不知道为什么它不...(可能会有多个带有条件ID的东西?)

编辑:

我收到的错误是:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"id","selector":"terms"}


我收到的新错误是:

selenium.common.exceptions.NoSuchFrameException: Message: no such frame: element is not a frame




<!DOCTYPE html>

<html xmlns="_http://www.w3.org/1999/xhtml" webdriver="true">

<head></head>

<body onload="init();" style="overflow:auto;">
  <div id="overlay" class="" style="height: 0px;"></div>
  <!--

         For Modal Popup

        -->
  <div style="width:938px;margin-left:30px;"></div>
  <input id="toolBarStatus" type="hidden" value="expanded" name="toolBarStatus"></input>
  <input id="hotTopictarget" type="hidden" value="" name="hotTopictarget"></input>
  <input id="idxTms" type="hidden" name="idxTms" value=""></input>
  <input id="srchWidgFrm" type="hidden" name="srchWidgFrm"></input>
  <input id="isUseRelChkd" type="hidden" name="isUseRelChkd"></input>
  <input id="actionTkn" type="hidden" name="actionTkn"></input>
  <input id="advSrcs" type="hidden" value="" name="advSrcs"></input>
  <input id="advSrcNms" type="hidden" value="" name="advSrcNms"></input>
  <input id="prevSearchTerms" type="hidden" name="prevSearchTerms"></input>
  <input id="segListAll" type="hidden" value="" name="segListAll"></input>
  <input id="isLoaded" type="hidden" name="isLoaded"></input>
  <input id="defaultSrcs" type="hidden" value="270077,11059,8411,270944" name="defaultSrcs"></input>
  <input id="prevSrcsChkd" type="hidden" name="prevSrcsChkd"></input>
  <input id="srcsChkd" type="hidden" value="270077,11059,8411,270944" name="srcsChkd"></input>
  <input id="noSrcs" type="hidden" value="" name="noSrcs"></input>
  <input id="prevDates" type="hidden" value="" name="prevDates"></input>
  <input id="prevSegs" type="hidden" value="" name="prevSegs"></input>
  <div align="left" style="width:98%;height:25px;"></div>
  <iframe id="mainFrame" class="" width="100%" height="" frameborder="0" title="Main content frame" onload="initFrame();" scrolling="no" src="form_main_search.asp" style="height: 721px;" name="mainFrame">

    #document
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" webdriver="true">

    <head></head>

    <body onunload="cleanUp();" onload="init();initAdvance();parent.resizeIframe();" style="height:98%;">
      <table style="width:100%;height:auto;">
        <tbody>
          <tr>
            <td style="width: 170px;height:100%;"></td>
            <td>
              <!--

                         Main Search Starts

                        -->
              <div align="left" style="width:668px;height:100%;">
                <!--

                             General Search Starts

                            -->
                <div id="generalSearch" align="left" style="width:662px;">
                  <form id="searchForm" autocomplete="off" onsubmit="validateSearch(this);return false;" action="" method="get" name="searchForm">

                    <table style="width:100%;height:100%;">
                      <tbody>
                        <tr></tr>
                        <tr>
                          <td style="width:662px;height:51px;" colspan="3">
                            <div id="searchDiv_2">
                              <table align="center" style="width:646px;height:100%;">
                                <tbody>
                                  <tr>
                                    <td style="vertical-align:middle;">
                                      <input id="terms" type="text" onblur="RevertText(this,'Enter Search Terms');" onfocus="AllowType(this,'Enter Search Terms')" value="Enter Search Terms" style="color: rgb(164, 164, 164);"></input>

                                    </td>
                                    <td style="vertical-align:middle;">
                                      <input id="srchButt" class="buttAcdmicOne" type="submit" value="Search"></input>
                                    </td>
                                  </tr>
                                </tbody>
                              </table>
                            </div>
                          </td>
                        </tr>
                        <tr></tr>
                      </tbody>
                    </table>
                  </form>
                </div>
                <!--

                     General Search Ends

                    -->
                <!--

                     Message Box Starts

                    -->
                <div id="bannerMessageSpace" style="height: 10px;"></div>
                <div id="bannerMessageCont" style="padding-left: 2px;"></div>
                <!--

                     Message Box Ends

                    -->
                <!--

                     Hottopics links Starts

                    -->
                <div id="hotTopics" class="" style="display:block;padding-top:14px;width:662px;height:150px;padding-left:2px;"></div>
                <!--

                     Hottopics links Ends

                    -->
                <!--

                     SearchWidgets Starts

                    -->
                <div id="SearchWidgets" style="display:block;padding-top:16px;width:100%;height:325px"></div>
                <!--

                     SearchWidgets Ends

                    -->
              </div>
              <!--

                 Main Search Ends

                -->
            </td>
          </tr>
        </tbody>

      </table>
      <!--

Footer Starts

-->

      <div style="margin-bottom: 35px; padding-top: 20px; padding-left: 30px; width: 98%;"></div>

      <!--

Footer Ends

-->

      <!--

 Advance Search Option Starts

-->

      <div id="advanceDiv" style="display:none;background-color: White;border:1px solid #99999…;top:97px;left:184px;width:646px;height:auto;border-top:0px;"></div>

      <!--

 Advance Search Option Ends

-->

      <!--

 For Modal Popup Starts

-->

      <div id="divBackground" class="ModalBackground"></div>

      <!--

 For Modal Popup Ends

-->

      <!--

 Search By Content Type Starts

-->

      <div id="addnlSrchForm" style="display:none;overflow: hidden;position:absolute;top:34px;lef…width:570px;background-color:white;border:solid 1px #999999;"></div>

      <!--

 Search By Content Type Ends

-->

      <div id="loading1" class="loading2"></div>

      <div style="position: absolute; width: 210px; z-index: 10; display: none; background-color: White;"></div>

      <script src="js/commonForm.js" type="text/javascript"></script>

      <script src="js/AS.js" type="text/javascript"></script>

      <script src="js/ASadv.js" type="text/javascript"></script>

      <script src="js/suggestSource.js" type="text/javascript"></script>

      <script type="text/javascript"></script>

      <div id="ui-datepicker-div" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>

    </body>

    </html>

</html>

</iframe>
<div id="one" class="connectors" style="display:none;"></div>

<script src="js/GAnalytics.js" type="text/javascript"></script>

<script type="text/javascript" src="http://app.ubertags.com/javascripts/ubertags.js"></script>

<div id="ui-datepicker-div" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>

<script type="text/javascript"></script>

<!--

 Google Code for Remarketing Tag - ECOMMERCE Accou…

-->

<!--

------------------------------------------------
R…

-->

<script type="text/javascript"></script>

<script src="//www.googleadservices.com/pagead/conversion.js" type="text/javascript"></script>

<iframe width="300" height="13" frameborder="0" scrolling="no" allowtransparency="true" hspace="0" vspace="0" marginheight="0" marginwidth="0" src="http://googleads.g.doubleclick.net/pagead/viewthroughconvers…&frm=0&url=http%3A//www.lexisnexis.com/hottopics/lnacademic/"
title="Google conversion frame" name="google_conversion_frame"></iframe>

<noscript></noscript>

<script type="text/javascript"></script>

<!--

 Google Code for Remarketing Tag - LEAD GEN Accoun…

-->

<!--

------------------------------------------------
R…

-->

<script type="text/javascript"></script>

<script src="//www.googleadservices.com/pagead/conversion.js" type="text/javascript"></script>

<img width="1" border="0" height="1" src="http://googleads.g.doubleclick.net/pagead/viewthroughconvers…&frm=0&url=http%3A//www.lexisnexis.com/hottopics/lnacademic/" alt=""></img>

<noscript></noscript>

<script type="text/javascript"></script>

<!--

 Google Code for Remarketing Tag

-->

<!--

------------------------------------------------
R…

-->

<script type="text/javascript"></script>

<script src="//www.googleadservices.com/pagead/conversion.js" type="text/javascript"></script>

<script type="text/javascript"></script>

<!--

 Google Code for Remarketing Tag

-->

<!--

------------------------------------------------
R…

-->

<script type="text/javascript"></script>

<script src="//www.googleadservices.com/pagead/conversion.js" type="text/javascript"></script>

<script type="text/javascript"></script>

<script type="text/javascript" src="//platform.twitter.com/oct.js"></script>

<img width="1" border="0" height="1" src="http://googleads.g.doubleclick.net/pagead/viewthroughconvers…&frm=0&url=http%3A//www.lexisnexis.com/hottopics/lnacademic/" alt=""></img>

<noscript></noscript>

<noscript></noscript>

<script type="text/javascript"></script>

<script type="text/javascript"></script>

<script type="text/javascript"></script>

<noscript></noscript>

<script type="text/javascript"></script>

<noscript></noscript>

<script type="text/javascript"></script>

<script src="http://7205084.collect.igodigital.com/collect.js" type="text/javascript"></script>

<script src="http://www.bizographics.com/collect/?time=1438024251782&pid=…2Fwww.lexisnexis.com%2Fhottopics%2Flnacademic%2F&ref=&fmt=js" type="text/javascript"></script>

<script type="text/javascript"></script>

<div style="display: none;"></div>

<img width="1" border="0" height="1" src="https://imp2.bizographics.com/l" alt="" style="display: none;"></img>

</body>

</html>

最佳答案

以下是获得NoSuchElementException的2个常见原因(包括解决方案):


元素在iframe内部,您需要在搜索之前切换到它:

driver.switch_to.frame("my_frame_id_or_name")
elem = driver.find_element_by_id("terms")
elem.send_keys("Test")

执行搜索时,该元素尚不存在。 Wait for it

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
terms = wait.until(EC.presence_of_element_located((By.ID, "terms")))
terms.send_keys("test")





或者,甚至两个解决方案也应结合使用:

wait = WebDriverWait(driver, 10)
iframe = wait.until(EC.presence_of_element_located((By.ID, "mainFrame")))
driver.switch_to.frame(iframe)

terms = wait.until(EC.visibility_of_element_located((By.ID, "terms")))
terms.send_keys("test")

10-06 09:29