Ответ 1
Это сообщение об ошибке...
<class 'selenium.common.exceptions.WebDriverException'>
Message: The command 'GET /session/.../displayed' was not found.
... означает, что запрос GET на /session/{session id}/element/{element id}/displayed
сбой.
элемент отображается
Согласно редактору WebDriver W3C Draft, отображаемый элемент представляет собой логическое состояние, в котором true
означает, что элемент отображается, а false
означает, что элемент не отображается. Чтобы вычислить состояние элемента, вызовите Call(bot.dom.isShown, null, element)
. Если это не приведет к ошибке, верните возвращаемое значение из этого вызова функции. В противном случае верните ошибку с неизвестной ошибкой кода ошибки.
Эта функция обычно подвергается запросам GET с шаблоном URI
/session/{session id}/element/{element id}/displayed
Анализ
Вы вызвали:
WebDriverWait(driver, 30).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#search")))
Класс element_to_be_clickable()
внутренне вызывает visibility_of_element_located()
и определяется как:
class element_to_be_clickable(object):
""" An Expectation for checking an element is visible and enabled such that you can click it."""
def __init__(self, locator):
self.locator = locator
def __call__(self, driver):
element = visibility_of_element_located(self.locator)(driver)
if element and element.is_enabled():
return element
else:
return False
Теперь класс visibility_of_element_located()
возвращает _element_if_visible(_find_element(driver, self.locator))
который определяется как:
class visibility_of_element_located(object):
""" An expectation for checking that an element is present on the DOM of a
page and visible. Visibility means that the element is not only displayed
but also has a height and width that is greater than 0.
locator - used to find the element
returns the WebElement once it is located and visible
"""
def __init__(self, locator):
self.locator = locator
def __call__(self, driver):
try:
return _element_if_visible(_find_element(driver, self.locator))
except StaleElementReferenceException:
return False
Опять же, _element_if_visible()
возвращает element if element.is_displayed() == visibility else False
который определяется как:
def _element_if_visible(element, visibility=True):
return element if element.is_displayed() == visibility else False
Так, как if()
условие element.is_displayed() == visibility
не удалось, следовательно, вы видите ошибку как GET
запрос к /session/{session id}/element/{element id}/displayed
конечной точки не удалось.
Без соответствующих HTML и предыдущих шагов сложно угадать точную причину, но, возможно, это может быть одно из следующих:
причина
Причиной исключения NoSuchElementException может быть одно из следующих:
- Стратегия локатора, которую вы приняли, не идентифицирует ни одного элемента в HTML DOM.
- Стратегия поиска вы приняли не в состоянии идентифицировать элемент, как это не в браузере Viewport.
- Стратегия локатора, которую вы приняли, идентифицирует элемент, но невидима из-за наличия атрибута style = "display: none;" ,
- Стратегия локатора, которую вы приняли, не однозначно идентифицирует нужный элемент в HTML DOM и в настоящее время находит какой-то другой скрытый/невидимый элемент.
- WebElement, который вы пытаетесь найти, находится в
<iframe>
.
Решение
Решение для обращения к исключению NoSuchElementException может быть одним из следующих:
-
Примите стратегию локатора, которая однозначно идентифицирует желаемый WebElement. Вы можете воспользоваться инструментами разработчика (Ctrl + Shift + I или F12) и использовать Element Inspector.
Здесь вы найдете подробное обсуждение того, как проверить элемент в selenium3.6, поскольку firebug больше не является вариантом для FF 56?
-
Используйте метод
execute_script()
для прокрутки элемента для просмотра следующим образом:elem = driver.find_element_by_xpath("element_xpath") driver.execute_script("arguments[0].scrollIntoView();", elem)
Здесь вы найдете подробное обсуждение прокрутки вверху страницы в Python с использованием Selenium
-
Элемент incase имеет атрибут style = "display: none;" , удалите атрибут с помощью
executeScript()
следующим образом:elem = driver.find_element_by_xpath("element_xpath") driver.execute_script("arguments[0].removeAttribute('style')", elem) elem.send_keys("text_to_send")
-
Чтобы проверить, находится ли элемент внутри
<iframe>
switchTo()
чтобы найти соответствующий<iframe>
иswitchTo()
желаемый iframe одним из следующих способов:driver.switch_to.frame("iframe_name") driver.switch_to.frame("iframe_id") driver.switch_to.frame(1) // 1 represents frame index
Здесь вы можете найти подробное обсуждение того, как я могу выбрать элемент html независимо от того, в каком раме он находится в селене? ,