等到元素出现后,“无法找到元素”

时间:2018-07-05 22:41:10

标签: python selenium

我正在编写一个Selenium刮板,该刮板要等到页面加载后才能尝试查找元素。当我运行脚本时,在我看来,该元素已加载到浏览器窗口中,但是Selenium认为不是。

这里是scraper.py

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


options = webdriver.ChromeOptions()
options.add_argument("--ignore-certificate-errors")
options.add_argument("--test-type")
options.binary_location = "/usr/bin/chromium"

driver = webdriver.Chrome(chrome_options=options)

startingURL = "https://pbcvssp.co.palm-beach.fl.us/webapp/vssp/AltSelfService;jsessionid=0000lH_keoPs-fzs5sSkYGLah1X:-1"
driver.get(startingURL)

driver.find_element_by_name("guest_login").click()
driver.switch_to_window(driver.window_handles[1]) # Go to window with bids

try:
    secondsToWait = 20
    wait = WebDriverWait(driver,secondsToWait)
    openBidsLinkName = "AMSBrowseOpenSolicit"
    openBidsLink = wait.until(
        EC.element_to_be_clickable(By.NAME,openBidsLinkName)
    )
finally:
    print driver.page_source
    driver.find_element_by_name(openBidsLinkName)

但是当我运行python scraper.py时,出现此错误。

Traceback (most recent call last):
  File "scraper.py", line 30, in <module>
    driver.find_element_by_name(openBidsLinkName)
  File "/home/me/ENV/pbc_vss/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 495, in find_element_by_name
    return self.find_element(by=By.NAME, value=name)
  File "/home/me/ENV/pbc_vss/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 966, in find_element
    'value': value})['value']
  File "/home/me/ENV/pbc_vss/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 320, in execute
    self.error_handler.check_response(response)
  File "/home/me/ENV/pbc_vss/local/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"name","selector":"AMSBrowseOpenSolicit"}

driver.page_source也看起来像这样:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><!-- BEGIN GENERATED HTML  --><html xmlns="http://www.w3.org/1999/xhtml" lang="en" oncontextmenu="MNU_ShowPopup('Default', event);return false"><head>
  <title>Self Service Application
  </title>
  <base href="https://pbcvssp.co.palm-beach.fl.us:443/webapp/vssp/advantage/AltSelfService/" />


  <script language="JavaScript" type="text/javascript" src="../AMSJS/ALTSS/ALTSSUtil.js">
&lt;!----&gt;

</script>
  <script language="JavaScript" type="text/javascript" src="../AMSJS/AMSMenu.js">
&lt;!----&gt;

</script>
  <script language="JavaScript" type="text/javascript" src="../AMSJS/AMSDHTMLLib.js">
&lt;!----&gt;

</script>
  <script language="JavaScript" type="text/javascript" src="../AMSJS/AMSUtils.js">
&lt;!----&gt;

</script>
 <script type="text/javascript" language="JavaScript">
 &lt;!--
 UTILS_InitPage();
 --&gt;
</script>
 </head>


    <frameset border="0" rows="33, *, 25">
      <frame name="AdditionalLinks" src="/LoginExternal/Pages/LoginAdditionalLinks.htm" marginwidth="0" title="Additional Links" frameborder="0" marginheight="0" longdesc="../AMSImages/ALTSS/SelfServiceFrameDesc.htm#AdditionalLinks" scrolling="no" />
      <frameset cols="150, *" border="0">
        <frameset border="0" rows="150, *">
          <frame name="pPrimaryNavPanel" src="pPrimaryNavPanel.htm" marginwidth="0" title="Navigation" frameborder="0" marginheight="0" longdesc="../AMSImages/ALTSS/SelfServiceFrameDesc.htm#Nav" scrolling="no" />
          <frame name="Secondary" src="../AMSImages/ALTSS/portal.htm" marginwidth="0" title="Secondary Navigation" target="Display" frameborder="0" marginheight="0" longdesc="../AMSImages/ALTSS/SelfServiceFrameDesc.htm#SecondaryNavigator" scrolling="no" />
        </frameset>
        <frameset id="AltSSLinkFrame" border="0" rows="100, *">
          <frame name="Startup" src="https://pbcvssp.co.palm-beach.fl.us/webapp/vssp/AltSelfService;jsessionid=0000CFpQkQ1YDSjZgm-4yMM0lHd:-1?session_id=CFpQkQ1YDSjZgm-4yMM0lHd&amp;page_id=pid_2712&amp;vsaction=pagetransition&amp;vsnavigation=StartPageNav&amp;frame_name=Startup" marginwidth="0" title="Welcome Area" frameborder="0" marginheight="0" longdesc="../AMSImages/ALTSS/SelfServiceFrameDesc.htm#PrimaryNav" scrolling="no" vsaction="true" />
          <frame name="Display" src="AltSSHomePage.htm" marginwidth="0" title="Display Frame" frameborder="0" marginheight="0" longdesc="../AMSImages/ALTSS/SelfServiceFrameDesc.htm#Display" scrolling="auto" />
        </frameset>
      </frameset>
      <frame name="CopyrightInfo" src="/LoginExternal/Pages/LoginCopyrightInfo.html" marginwidth="0" title="Copyright Info" frameborder="0" marginheight="0" longdesc="../AMSImages/ALTSS/SelfServiceFrameDesc.htm#CopyrightInfo" scrolling="no" />
    </frameset>
    <noframes>
          &amp;lt;body&amp;gt;
      &amp;lt;p&amp;gt;This page uses frames, but your browser does not support them.  FramesetPage requires a Frames-capable browser&amp;lt;/p&amp;gt;
    &amp;lt;/body&amp;gt;

</noframes>

如何使Selenium使用name属性"AMSBrowseOpenSolicit"定位元素?

1 个答案:

答案 0 :(得分:1)

您的表格位于frame中,因此您必须先切换到该表格,然后才能与此表格进行交互。此代码段将帮助您做到这一点:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# find frame and switch to it
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//frame[@title = 'Display Frame']")))

# do your stuff
secondsToWait = 20
wait = WebDriverWait(driver,secondsToWait)
openBidsLinkName = "AMSBrowseOpenSolicit"
openBidsLink = wait.until(
    EC.element_to_be_clickable(By.NAME,openBidsLinkName)
)
driver.find_element_by_name(openBidsLinkName)

driver.switch_to.default_content() # switch back to default content
相关问题