Как исправить неизвестную ошибку: необработанная ошибка инспектора: «Не удается найти контекст с указанным идентификатором»

#python #amazon-web-services #selenium

#java #селен #selenium-webdriver #webdriver #selenium-chromedriver

Вопрос:

Следующий код иногда выдает org.openqa.selenium.WebDriverException .

 WebElement element = driver.findElement(by);
element.click();
(new WebDriverWait(driver, 4, 100)).until(ExpectedConditions.stalenessOf(element));
  

Страница выглядит следующим образом (by — это селектор для <a></a> )

 <iframe name="name">
  <html id="frame">
    <head>
      ...
    </head>
    <body class="frameA">
      <table class="table">
        <tbody>
          <tr>
            <td id="83">
              <a></a>
            </td>
          </tr>
        </tbody>
      </table>
    </body>
  </html>
</iframe>
  

Сообщение unknown error: unhandled inspector error: {"code":-32000,"message":"Cannot find context with specified id"} . element является частью iframe , и щелчок может привести iframe к перезагрузке содержимого. Исключение генерируется во время ожидания. Что означает это исключение и как я могу его исправить?

Комментарии:

1. Обновите свой вопрос с помощью структуры dom вашей страницы.

2. Сначала переключитесь на iframe, затем найдите элемент и щелкните по нему.

Ответ №1:

Это сообщение об ошибке…

 unknown error: unhandled inspector error: {"code":-32000,"message":"Cannot find context with specified id"}
  

…подразумевает, что экземпляру WebDriver не удалось найти нужный элемент.

Как вы упомянули в своем вопросе, что элемент является частью <iframe> и вызов click() может привести к перезагрузке содержимого iframe в этом случае вам нужно вернуться к defaultContent и снова переключиться на желаемый iframe с помощью WebDriverWait, а затем вызвать WebDriverWait либо для stalenessOf() предыдущего элемента, либо для присутствия следующего желаемого элемента следующим образом :

 WebElement element = driver.findElement(by);
element.click();
driver.switchTo().defaultContent(); // or driver.switchTo().parentFrame();
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("xyz")));
// wait for stalenessOf previous element (visibility of next desired element preferred)
new WebDriverWait(driver, 4, 100).until(ExpectedConditions.stalenessOf(element));
// or wait for visibility of next desired element (preferred approach)
new WebDriverWait(driver, 4, 100).until(ExpectedConditions.visibilityOfElementLocated(next_desired_element));
  

Комментарии:

1. Работает, но может frameToBeAvailableAndSwitchToIt вернуться, потому что старый iframe все еще доступен?

2. @user3561614, как следует из названия frameToBeAvailableAndSwitchToIt , включает в себя официанта и switching обоих. Так что не вернется.