WebDriverException: Mensaje: No se encontró el comando ‘GET / session / 7… / displays’ mientras se esperaba explícitamente con safaridriver y Selenium 3.13.0

Estoy usando la espera explícita como a continuación para verificar si se puede hacer clic en el elemento.

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

Pero me da error

   Message: The command 'GET /session/.../displayed' was not found. 

Si uso time.sleep() funciona bien en lugar de explicir, espera, funciona bien. He inicializado el controlador de safari como

 from selenium.webdriver import Safari driver = Safari() 

Aquí está el 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. 

    Este mensaje de error …

       Message: The command 'GET /session/.../displayed' was not found. 

    … implica que la solicitud GET para /session/{session id}/element/{element id}/displayed error.


    elemento mostrado

    Según el Borrador del Editor de WebDriver W3C, el elemento que se muestra es un estado booleano donde true significa que el elemento se muestra y false significa que el elemento no se muestra . Para calcular el estado en el elemento, invoque la Call(bot.dom.isShown, null, element) . Si al hacerlo no produce un error, devuelva el valor de retorno de esta llamada de función. De lo contrario, devuelve un error con el código de error error desconocido .

    Esta función suele estar expuesta a solicitudes GET con una plantilla URI de

     /session/{session id}/element/{element id}/displayed 

    Análisis

    Has invocado

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

    element_to_be_clickable() clase element_to_be_clickable() invoca de forma interna element_to_be_clickable() y se define como:

     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 

    Ahora, la clase visibility_of_element_located() devuelve _element_if_visible(_find_element(driver, self.locator)) que se define como:

     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 

    Nuevamente, _element_if_visible() devuelve el element if element.is_displayed() == visibility else False que se define como:

     def _element_if_visible(element, visibility=True): return element if element.is_displayed() == visibility else False 

    Entonces, como la condición if() de element.is_displayed() == visibility falló, por lo tanto, verá el error como una solicitud GET para el /session/{session id}/element/{element id}/displayed punto final /session/{session id}/element/{element id}/displayed falló.

    Sin el HTML relevante y los pasos anteriores , es difícil adivinar la razón exacta, pero posiblemente puede ser una de las siguientes:


    Razón

    El motivo de NoSuchElementException puede ser uno de los siguientes:

    • La estrategia de localización que ha adoptado no identifica ningún elemento en el DOM de HTML .
    • La estrategia de localización que ha adoptado no puede identificar el elemento ya que no está dentro de la vista del navegador.
    • La estrategia de localización que ha adoptado identifica el elemento pero es invisible debido a la presencia del atributo style = “display: none;” .
    • La estrategia de localización que ha adoptado no identifica de forma única el elemento deseado en el DOM HTML y actualmente encuentra algún otro elemento oculto / invisible .
    • El elemento web que intenta localizar está dentro de una etiqueta .

    Solución

    La solución para abordar la excepción NoSuchElementException puede ser una de las siguientes:

    • Adopte una estrategia de localización que identifique de forma única el elemento web deseado. Puede tomar la ayuda de las Herramientas de desarrollo ( Ctrl + Shift + I o F12 ) y usar el Inspector de elementos .

      Aquí encontrará una discusión detallada sobre cómo inspeccionar el elemento en selenium3.6, ya que Firebug ya no es una opción para el FF 56.

    • Use el método execute_script() para desplazar el elemento hacia adentro y verlo de la siguiente manera:

       elem = driver.find_element_by_xpath("element_xpath") driver.execute_script("arguments[0].scrollIntoView();", elem) 

      Aquí encontrará una discusión detallada sobre Desplazamiento hacia la parte superior de la página en Python usando Selenium

    • El elemento Incase tiene el atributo style = “display: none;” , elimine el atributo mediante el método executeScript() siguiente manera:

       elem = driver.find_element_by_xpath("element_xpath") driver.execute_script("arguments[0].removeAttribute('style')", elem) elem.send_keys("text_to_send") 
    • Para verificar si el elemento está dentro de un recorra el HTML para ubicar la etiqueta respectiva y switchTo() iframe switchTo() deseado al iframe a través de cualquiera de los siguientes métodos:

       driver.switch_to.frame("iframe_name") driver.switch_to.frame("iframe_id") driver.switch_to.frame(1) // 1 represents frame index 

      Aquí puede encontrar una discusión detallada sobre ¿Cómo puedo seleccionar un elemento html sin importar en qué marco se encuentre en selenium? .