#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
обоих. Так что не вернется.