【问题标题】:Selenium cannot get iframeSelenium 无法获取 iframe
【发布时间】:2016-04-20 18:48:18
【问题描述】:

我正在尝试从此链接检索职位描述和职位要求: 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 行,在 main() 文件“D:\Abigail MTI Projects\Singapore Skills\JobsBankScraper\jobsbank14012016_abi.py”,第 74 行,在 main 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\site-packages\selenium\webdriver\remote\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: Unable to locate 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/

【问题讨论】:

    标签: python html selenium iframe


    【解决方案1】:

    iframes是列表,需要切换到单帧。

    driver.find_elements 返回列表,driver.find_element 返回单个 Web 元素(注意元素中的“s”)。

    另外,divMainJobDescription不是iframe,相信你在找frameJobDescription

    iframe = driver.find_element_by_id("frameJobDescription")
    

    【讨论】:

      【解决方案2】:

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

      所以,与其直接在框架内定位一个 div,不如

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

      定位 iframe 标记,然后切换。 (如果只需要一个 iframe,可以使用单数 find_element_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"]')
      

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

      iframe = driver.find_element_by_id('frameJobDescription')
      

      如果您需要在编写脚本期间获取两个 iframe 中的详细信息,则需要在帧之间轮流切换。

      【讨论】:

        猜你喜欢
        • 2021-08-14
        • 1970-01-01
        • 2022-01-09
        • 2017-05-30
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        相关资源
        最近更新 更多