硒 - 识别网络元素

时间:2017-04-17 18:46:28

标签: python css selenium xpath web-scraping

我正在使用Python从网站上抓取数据。虽然我已经能够使用Selenium登录,但我无法在登录后识别搜索字段。看来网页加载了帧(而不是iframe),但我无法使用搜索字段访问该帧。

我已经尝试将帧更改为相关帧(这似乎有效 - 没有引发错误)但是如果我尝试通过CSS / Xpath / Name / id搜索搜索元素,我会得到NoSuchElementException。我正在使用Chrome网络驱动程序。

有什么建议吗?页面源如下:

  <html>
  <head>
    <title> XYZ </title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <meta http-equiv="content-language" content="en" />
    <script type="text/javascript">
    if (navigator && navigator.appVersion && navigator.appVersion.match("Safari") && !navigator.appVersion.match("Chrome")) {
        // hack to force a window redraw
        window.onload = function() {
        document.getElementsByTagName('html')[0].style.backgroundColor = '#000000';
        }
    }
    </script>
  </head>

  <frameset id="wc-frameset" rows="82,*" frameborder="no" border="0" framespacing="0">
    <frame frameborder="0" src="/frontend/header/" name="top" marginwidth="0" marginheight="0" scrolling="no" noresize="noresize" />
      <frameset cols="*,156,850,*" frameborder="NO" border="0" framespacing="0">
        <frame frameborder="0" src="/frontend/fillbar/" name="fillbar" marginwidth="0" marginheight="0" scrolling="no"  noresize="noresize" />
        <frame frameborder="0" src="/frontend/navigation/" name="navigation" marginwidth="0" marginheight="0" scrolling="no"  noresize="noresize" />
        <frame frameborder="0" src="/frontend/frames/" name="content_area" marginwidth="0" marginheight="0" scrolling="no" noresize>
        <frame frameborder="0" src="/frontend/fillbar/" name="fillbar" marginwidth="0" marginheight="0" scrolling="no"  noresize="noresize" />
      </frameset>
  </frameset>
</html>

到目前为止我的代码是:

username = driver.find_element_by_id("username")
password = driver.find_element_by_id("password")
username.send_keys("****")
password.send_keys("****")   
driver.find_element_by_class_name("bg-left").click()
#this bit works

driver.switch_to_frame("content_area")
#this seems to work too, got the frame name from the page source

search = driver.find_element_by_id("field-name")
search.send_keys("TEST")
#this fails, no element found

目标框架源代码是:

      <div id="field-name" class="field field-StringField">
  <label for="name">Name</label>            <div class="input-con"><input id="name" name="name" type="text" value=""></div>
      </div>

2 个答案:

答案 0 :(得分:1)

在继续搜索元素之前,您可能需要等待页面完全加载。您可以尝试以下方式:

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

driver.switch_to_frame("content_area")

try:
    # this line adds wait for the element to be visible 
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located(By.ID, 'name'))
except TimeoutException:
    # display page timed out error

search = driver.find_element_by_id("name")
search.send_keys("TEST")

答案 1 :(得分:1)

页面中可能存在重复的元素。 在chrome中尝试以下内容:

  1. 在Chrome中打开网址
  2. 打开开发人员工具F12
  3. 按ESC键打开Chrome控制台
  4. 选择您的相框 enter image description here
  5. 在控制台中使用xpath搜索类似元素 $x("//input[@id='name']")
  6. 这应该列出元素的数量。