{"record":{"id":"0c5b004e8905dff0","repo":"angular/components","slug":"unable-to-retrieve-options-for-timepicker-timepic","errorCode":null,"errorMessage":"Unable to retrieve options for timepicker. Timepicker panel is closed.","messagePattern":"Unable to retrieve options for timepicker\\. Timepicker panel is closed\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/material/timepicker/testing/timepicker-harness.ts","lineNumber":44,"sourceCode":"   */\n  static with<T extends MatTimepickerHarness>(\n    this: ComponentHarnessConstructor<T>,\n    options: TimepickerHarnessFilters = {},\n  ): HarnessPredicate<T> {\n    return new HarnessPredicate(this, options);\n  }\n\n  /** Whether the timepicker is open. */\n  async isOpen(): Promise<boolean> {\n    const selector = await this._getPanelSelector();\n    const panel = await this._documentRootLocator.locatorForOptional(selector)();\n    return panel !== null;\n  }\n\n  /** Gets the options inside the timepicker panel. */\n  async getOptions(filters?: Omit<OptionHarnessFilters, 'ancestor'>): Promise<MatOptionHarness[]> {\n    if (!(await this.isOpen())) {\n      throw new Error('Unable to retrieve options for timepicker. Timepicker panel is closed.');\n    }\n\n    return this._documentRootLocator.locatorForAll(\n      MatOptionHarness.with({\n        ...(filters || {}),\n        ancestor: await this._getPanelSelector(),\n      } as OptionHarnessFilters),\n    )();\n  }\n\n  /** Selects the first option matching the given filters. */\n  async selectOption(filters: OptionHarnessFilters): Promise<void> {\n    const options = await this.getOptions(filters);\n    if (!options.length) {\n      throw Error(`Could not find a mat-option matching ${JSON.stringify(filters)}`);\n    }\n    await options[0].click();\n  }","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/angular/components/blob/0411926e7d8ae06b32236ec1048a888cfad5abf2/src/material/timepicker/testing/timepicker-harness.ts#L26-L62","documentation":"MatTimepickerHarness.getOptions reads the option list from the timepicker's dropdown panel; it refuses to query when the panel is closed. The harness first checks isOpen() and throws 'Timepicker panel is closed.' so consumers get a clear error instead of an empty result.","triggerScenarios":"Calling harness.getOptions() (or the `options` property) while the timepicker panel is not open — i.e. open() was never called, or it was closed via close()/backdrop click/selection before the call.","commonSituations":"Tests asserting options immediately without awaiting open(); opening the picker in one step and reading options after an intervening action closed it; forgetting that selecting an option closes the panel.","solutions":["Call await harness.open() before getOptions()","Await the harness promise / fixture.whenStable so the panel is rendered","Re-open the panel if a prior selection or close() ended the open state"],"exampleFix":"// before\nconst opts = await timepickerHarness.getOptions(); // throws if closed\n\n// after\nawait timepickerHarness.open();\nconst opts = await timepickerHarness.getOptions();","handlingStrategy":"validation","validationCode":"if (await timepickerHarness.isOpen()) {\n  const opts = await timepickerHarness.getOptions();\n} else {\n  await timepickerHarness.open();\n  const opts = await timepickerHarness.getOptions();\n}","typeGuard":null,"tryCatchPattern":"try {\n  const opts = await timepickerHarness.getOptions();\n} catch (e) {\n  if (String(e?.message).includes('panel is closed')) {\n    await timepickerHarness.open();\n    opts = await timepickerHarness.getOptions();\n  }\n}","preventionTips":["Always call open() (and await it) before reading options","Remember selecting an option closes the panel; re-open for further queries","Avoid interleaving close/backdrop clicks between open and getOptions","Use harness.waitForTasksOutsideAngular if panel rendering is async"],"tags":["angular-material","component-harness","testing","timepicker"],"backgroundTag":"panel-closed-before-query","analyzedSha":"0411926e7d8ae06b32236ec1048a888cfad5abf2","analyzedAt":"2026-08-31T11:58:23.400Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}