Análisis del código fuente de la API de Selenium3 Python WebDriver (20) Descripción general del protocolo WebDriver

Protocolo WebDriver

Al principio Selenium, WebDrivereran dos proyectos independientes. Al Seleniumprincipio, se basaban principalmente en convertir las operaciones en JavaScript y luego inyectarlas en el navegador para automatizar WebDriverel navegador, encapsulando la API nativa del navegador en un conjunto de API más orientadas a objetos. , pero debido a las diferencias en los núcleos de los diferentes navegadores, por lo tanto, para adaptarse, se deben implementar diferentes API para diferentes navegadores. En los Selenium2siguientes dos elementos se pueden combinar, a menudo decimos Seleniumque se refiere principalmente a la WebDriverAPI. SeleniumLa versión principal de la versión estable actual es la 3, y la versión beta Selenium4ya está en camino.

SeleniumO WebDriverla base de la interacción con el navegador es el WebDriverprotocolo (estándar recomendado por W3C). WebDriverEl protocolo es un servicio web RESTful que utiliza JSON como formato de transmisión a través del protocolo HTTP y no tiene nada que ver con el sistema operativo y el lenguaje de programación.

WebDriverActualmente existen dos versiones del acuerdo:

WebDriverHay un acuerdo abandonado antes del JsonWireProtocolacuerdo, consultehttps://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol

WebDriverTres objetos están involucrados en el modelo de acuerdo:

  • Cliente (cliente o extremo local): se puede considerar simplemente como el programa o máquina que llama a la API de WebDriver. Nuestra API Python WebDriver de uso común es un enlace de lenguaje Python del cliente.
  • Servidor (servidor o extremo remoto): la RemoteWebDrivermáquina en ejecución o WebDriverel navegador que admite el protocolo , como el geckodrivernavegador Firefox compatible y el chromedrivernavegador Chrome compatible . WebDriverEn realidad, el protocolo solo define el comportamiento del servidor.
  • WebDriver: El diversos navegadores WebDriverprotocolo, como geckodriver, chromedriver, WebDriveres equivalente al intermediario cliente y el servidor, proporcionando WebDriverservicios RESTful de protocolo. El cliente WebDrivercontrola el servidor (navegador). Por ejemplo, Firefox se basa en webdriver.xpiextensiones para controlar el navegador.

Después de que el cliente se ejecuta, se inicia una sesión. En esta sesión, el WebDrivercliente solicita al servidor a través del protocolo RESTful service endpoint (endpoint, que puede entenderse simplemente como url), y el servidor devuelve una respuesta al cliente después de aceptar la solicitud. .
!Inserte la descripción de la imagen aquí

WebDriverEl protocolo asigna los puntos finales a los comandos. La relación entre los puntos finales y los comandos es la siguiente ( https://www.w3.org/TR/webdriver/#endpoints ):

Método Plantilla de URI Mando
CORREO /sesión Nueva sesión
ELIMINAR / session / {id de sesión} Eliminar sesión
OBTENER /estado Estado
OBTENER / sesión / {id. de sesión} / tiempos de espera Obtener tiempos de espera
CORREO / sesión / {id. de sesión} / tiempos de espera Establecer tiempos de espera
CORREO / session / {id. de sesión} / url Navegar a
OBTENER / session / {id. de sesión} / url Obtener URL actual
CORREO / session / {id de sesión} / back atrás
CORREO / session / {id de sesión} / forward Adelante
CORREO / session / {id de sesión} / refresh Actualizar
OBTENER / session / {id. de sesión} / title Obtener el título
OBTENER / session / {id de sesión} / window Obtener la manija de la ventana
ELIMINAR / session / {id de sesión} / window Cerrar ventana
CORREO / session / {id de sesión} / window Cambiar a ventana
OBTENER / session / {id de sesión} / window / handle Obtener manijas de ventana
CORREO / session / {id de sesión} / window / new Nueva ventana
CORREO / session / {id de sesión} / frame Cambiar a marco
CORREO / session / {id de sesión} / frame / parent Cambiar al marco principal
OBTENER / session / {id de sesión} / window / rect Obtener Window Rect
CORREO / session / {id de sesión} / window / rect Establecer ventana rect
CORREO / session / {id de sesión} / window / maximizar Maximizar ventana
CORREO / session / {id de sesión} / window / minimizar Minimizar ventana
CORREO / session / {id de sesión} / window / fullscreen Ventana de pantalla completa
OBTENER / session / {id de sesión} / element / active Obtener elemento activo
CORREO / sesión / {id. de sesión} / elemento Encontrar elemento
CORREO / session / {id de sesión} / elementos Buscar elementos
CORREO / sesión / {id. de sesión} / elemento / {id. de elemento} / elemento Buscar elemento a partir de elemento
CORREO / sesión / {id. de sesión} / elemento / {id. de elemento} / elementos Buscar elementos a partir de elementos
OBTENER / session / {id de sesión} / element / {element id} / selected Está el elemento seleccionado
OBTENER / sesión / {id. de sesión} / elemento / {id. de elemento} / atributo / {nombre} Obtener atributo de elemento
OBTENER / sesión / {id. de sesión} / elemento / {id. de elemento} / propiedad / {nombre} Obtener propiedad de elemento
OBTENER / session / {id de sesión} / element / {id. de elemento} / css / {nombre de propiedad} Obtener el valor CSS del elemento
OBTENER / sesión / {id. de sesión} / elemento / {id. de elemento} / texto Obtener texto del elemento
OBTENER / sesión / {id. de sesión} / elemento / {id. de elemento} / nombre Obtener nombre de etiqueta de elemento
OBTENER / session / {id de sesión} / element / {id. de elemento} / rect Obtener Element Rect
OBTENER / sesión / {id. de sesión} / elemento / {id. de elemento} / habilitado ¿Está habilitado el elemento?
OBTENER / session / {id de sesión} / elemento / {id. de elemento} / computedrole Obtener rol calculado
OBTENER / session / {id. de sesión} / element / {id. de elemento} / computedlabel Obtener etiqueta calculada
CORREO / sesión / {id. de sesión} / elemento / {id. de elemento} / clic Clic de elemento
CORREO / session / {id. de sesión} / element / {id. de elemento} / clear Element Clear
POST /session/{session id}/element/{element id}/value Element Send Keys
GET /session/{session id}/source Get Page Source
POST /session/{session id}/execute/sync Execute Script
POST /session/{session id}/execute/async Execute Async Script
GET /session/{session id}/cookie Get All Cookies
GET /session/{session id}/cookie/{name} Get Named Cookie
POST /session/{session id}/cookie Add Cookie
DELETE /session/{session id}/cookie/{name} Delete Cookie
DELETE /session/{session id}/cookie Delete All Cookies
POST /session/{session id}/actions Perform Actions
DELETE /session/{session id}/actions Release Actions
POST /session/{session id}/alert/dismiss Dismiss Alert
POST /session/{session id}/alert/accept Accept Alert
GET /session/{session id}/alert/text Get Alert Text
POST /session/{session id}/alert/text Send Alert Text
GET /session/{session id}/screenshot Take Screenshot
GET /session/{session id}/element/{element id}/screenshot Take Element Screenshot
POST /session/{session id}/print Print Page

WebDriver Python API执行流程(反推)

WebDriver客户端API其实就是实现属性或方法到命令,再到WebDriver协议端点的变换过程。

Por ejemplo: WebDriverlas current_urlcaracterísticas de la clase.

  1. current_urlLa característica es en realidad Command.GET_CURRENT_URLel resultado de la ejecución del comando .

    @property
    def current_url(self):
         return self.execute(Command.GET_CURRENT_URL)['value']
    
  2. WebDriverEl executemétodo de la clase es command_executor.execute(driver_command, params)ejecutado por el comando.
    command_executorEs una cadena (URL del servidor) u remote_connection.RemoteConnectionobjeto.

  3. remote_connection.RemoteConnectionLa clase está ubicada selenium\webdriver\remote\remote_connection.py.
    remote_connection.RemoteConnectionLos _commandsatributos de la clase definen la relación entre el comando y el punto final.
    Command.GET_CURRENT_URL: ('GET', '/session/$sessionId/url')
    remote_connection.RemoteConnectionEl executemétodo de la clase controla al servidor para ejecutar comandos.

  4. WebDriverCuando se crea una instancia de la clase command_executor, se pasan command_executorparámetros y los parámetros son la dirección del servidor.

Proceso de ejecución de la API de WebDriver Python (en curso)

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 服务端地址
url = driver.command_executor._url  
print(url)

El flujo de ejecución del código anterior es aproximadamente el siguiente:

  1. driver = webdriver.Firefox()Es decir selenium\webdriver\firefox\webdriver.py, se WebDrivercrea una instancia de la clase en el par y la WebDriverclase hereda de selenium\webdriver\remote\webdriver.pyla WebDriverclase en. WebDriverEl command_executorparámetro en el método de construcción de la clase es la dirección del servidor.
    En este punto, WebDriverinicie el navegador, cargue la webdriver.xpiextensión y escuche las WebDriversolicitudes basadas en protocolos.
    Se geckodriver.logpuede ver un 1116855012551 geckodriver INFO Listening on 127.0.0.1:54499registro similar en el archivo de registro .

  2. driver.get("http://www.baidu.com")Equivale a ejecutar un Command.GETcomando. WebDriverLos objetos dependen de los remote_connection.RemoteConnectionobjetos para command_executorejecutar comandos. El mapeo remote_connection.RemoteConnectiondel comando al WebDriverprotocolo se implementa en la clase Command.GET: ('POST', '/session/$sessionId/url'). Ejecutar el comando equivale a enviar una solicitud correspondiente al navegador. WebDriverEnvíe la solicitud al navegador.

     def get(self, url):
         self.execute(Command.GET, {
          
          'url': url})
    
  3. Una vez que el navegador acepta la solicitud, realiza la operación (abre la página de Baidu) y devuelve una respuesta (dirección del servidor). WebDriverPase el resultado de la respuesta al código.

Supongo que te gusta

Origin blog.csdn.net/mighty13/article/details/115255539
Recomendado
Clasificación