Selenium无法获得iframe

时间:2016-01-15 08:03:23

标签: python html selenium iframe

我正在尝试从此链接检索作业说明和作业要求: https://www.jobsbank.gov.sg/ICMSPortal/portlets/JobBankHandler/SearchDetail.do?id=JOB-2016-0008238

使用硒。这是我的代码:

driver = webdriver.Firefox()
url = "https://www.jobsbank.gov.sg/ICMSPortal/portlets/JobBankHandler/SearchDetail.do?id=JOB-2016-0008238"
driver.get(url)
iframes = driver.find_elements_by_xpath('//*[@id="divMainJobDescription"]')
print len(iframes)
driver.switch_to_frame(iframes)
print driver.page_source

我收到以下错误:

  

Traceback(最近一次调用最后一次):文件“D:\ scraper.py”,第79行,in          main()文件“D:\ Abigail MTI Projects \ Singapore Skills \ JobsBankScraper \ jobsbank14012016_abi.py”,第74行,主要       driver.switch_to_frame(iframes)文件“C:\ Python27 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py”,   第537行,在switch_to_frame中       self._switch_to.frame(frame_reference)文件“C:\ Python27 \ lib \ site-packages \ selenium \ webdriver \ remote \ switch_to.py”,   第67行,在框架中       self._driver.execute(Command.SWITCH_TO_FRAME,{'id':frame_reference})文件   “C:\ Python27 \ LIB \站点包\硒\ webdriver的\遥控\ webdriver.py”   201行,执行中       self.error_handler.check_response(response)文件“C:\ Python27 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py”,   第181行,在check_response中       raise exception_class(message,screen,stacktrace)NoSuchFrameException:Message:无法找到frame:[object Object]   堆栈跟踪:       在FirefoxDriver.prototype.switchToFrame(file:/// c:/users/mti_wl~1/appdata/local/temp/tmpwelh3x/extensions/fxdriver@googlecode.com/components/driver-component.js:10745)       在DelayedCommand.prototype.executeInternal_ / h(file:/// c:/users/mti_wl~1/appdata/local/temp/tmpwelh3x/extensions/fxdriver@googlecode.com/components/command-processor.js:12551)       在DelayedCommand.prototype.executeInternal_(file:/// c:/users/mti_wl~1/appdata/local/temp/tmpwelh3x/extensions/fxdriver@googlecode.com/components/command-processor.js:12556)       在DelayedCommand.prototype.execute /< (文件:/// C:/users/mti_wl~1/appdata/local/temp/tmpwelh3x/extensions/fxdriver@googlecode.com/components/command-processor.js:12498)

2 个答案:

答案 0 :(得分:0)

iframes是列表,您需要切换到单个框架。

driver.find_elements返回列表,而driver.find_element返回单个网络元素(请注意元素中的'')

此外,divMainJobDescription不是iframe,我相信您正在寻找frameJobDescription

iframe = driver.find_element_by_id("frameJobDescription")

答案 1 :(得分:0)

您需要定位iframe,切换到该帧,然后您可以开始识别该帧内存在的其他元素,如div。您需要指定 iframe标记本身,而不是iframe中的元素。

所以,不要在框架内立即定位div,如

iframes = driver.find_elements_by_xpath('//*[@id="divMainJobDescription"]')

定位iframe标记,然后切换。 (如果只需要一个iframe,可以使用单数find_ 元素 _by_xpath。)

iframe = driver.find_element_by_xpath('//iframe[@id="frameJobDescription"]')
driver.switch_to_frame(iframe)
job_description = driver.find_element_by_xpath('//*[@id="divMainJobDescription"]')

奖励:您可以使用其他方法来定位iframe,例如,如果您只查看ID,则按ID查找元素而不是编写xpath。

iframe = driver.find_element_by_id('frameJobDescription')

如果您需要在脚本中获取BOTH iframe中的详细信息,则需要轮流切换帧。