python - Selenium - 识别网页元素

标签 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>

最佳答案

页面中可能存在重复的元素。 在 Chrome 中尝试以下操作:

  1. 在 Chrome 中打开网址
  2. 打开开发者工具 F12
  3. 按 ESC 键打开 Chrome 控制台
  4. 选择您的框架 enter image description here
  5. 在控制台中使用 xpath 搜索相似元素 $x("//输入[@id='name']")

这应该列出元素的数量。

关于python - Selenium - 识别网页元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43457540/

相关文章:

python - 在python中创建可以返回对象的lambda函数

python - 是否有带有 Pygame 模块的在线 Python 解释器?

python - 安装 "distribute": NameError: name 'sys_platform' is not defined 时遇到问题

html - 网店导航问题

node.js - 了解 Web 驱动程序 API

selenium - Selenium 的 WebElement.getRect() 是否适用于 Chrome 或 IE?

python - 屈服于...

html - 几乎相同的嵌套选择器的 CSS 规则

javascript - 水平和垂直对齐标签和文本框

jquery - 基于绝对位置在 Jquery 中选择元素?