WebDriverException: Сообщение: команда "GET/session/7.../displayed" не была найдена в то время как Explicit Wait с safaridriver и Selenium 3.13.0

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

WebDriverWait(driver, 30).until(
        expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#search")))

Но я получаю ошибку

 <class 'selenium.common.exceptions.WebDriverException'>
Message: The command 'GET /session/.../displayed' was not found.

Если я использую time.sleep() он отлично работает, а не explicir, подождите, пока он работает нормально. Я инициализировал драйвер сафари как

from selenium.webdriver import Safari
driver = Safari()

Вот stacktrace

  File "/Users/Library/Python/2.7/lib/python/site-packages/selenium/webdriver/support/wait.py", line 71, in until
    value = method(self._driver)
  File "/Users/Library/Python/2.7/lib/python/site-packages/selenium/webdriver/support/expected_conditions.py", line 283, in __call__
    element = visibility_of_element_located(self.locator)(driver)
  File "/Users/Library/Python/2.7/lib/python/site-packages/selenium/webdriver/support/expected_conditions.py", line 127, in __call__
    return _element_if_visible(_find_element(driver, self.locator))
  File "/Users/Library/Python/2.7/lib/python/site-packages/selenium/webdriver/support/expected_conditions.py", line 147, in _element_if_visible
    return element if element.is_displayed() == visibility else False
  File "/Users/Library/Python/2.7/lib/python/site-packages/selenium/webdriver/remote/webelement.py", line 490, in is_displayed
    return self._execute(Command.IS_ELEMENT_DISPLAYED)['value']
  File "/Users/Library/Python/2.7/lib/python/site-packages/selenium/webdriver/remote/webelement.py", line 628, in _execute
    return self._parent.execute(command, params)
  File "/Users/Library/Python/2.7/lib/python/site-packages/selenium/webdriver/remote/webdriver.py", line 314, in execute
    self.error_handler.check_response(response)
  File "/Users/Library/Python/2.7/lib/python/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
WebDriverException: Message: The command 'GET /session/7.../displayed' was not found.

Ответ 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 может быть одним из следующих: