2017-04-17 126 views
2

我正在使用Python从网站上抓取数据。虽然我能够使用Selenium登录,但登录后无法识别搜索字段。它显示网页加载了帧(不是iframe),但我无法使用搜索字段访问该帧。我试图改变帧到相关的框架(这似乎工作 - 没有错误抛出),但如果我尝试通过CSS/Xpath /名称/ ID搜索搜索元素我得到一个NoSuchElementException。我正在使用Chrome Webdriver。硒 - 识别网络元素

有什么建议吗?该页面的源代码如下:

<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> 
+0

我错了吗?当你搜索'id''field-name'时,你会得到'div'元素,但是你想发送击键到'input'元素。那会不会是带'id''name'的元素? –

+0

我试过这种方式,但仍然有一个异常:selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“method”:“id”,“selector”:“ name“} –

+0

你的意思是'name = driver.find_element_by_id(”name“)'引发了异常? –

回答

1

页面中可能存在重复元素。 尝试在镀铬以下:

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

这应该列出元素的数量。

+1

谢谢!这有帮助。该框架内还有另一个框架,我只能使用控制台进行检测。它现在似乎正在工作。我不得不切换到content_area框架,然后切换到该框架内的“主”框架! –

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")