Protocolo WebDriver
Al principio Selenium
, WebDriver
eran dos proyectos independientes. Al Selenium
principio, se basaban principalmente en convertir las operaciones en JavaScript y luego inyectarlas en el navegador para automatizar WebDriver
el 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 Selenium2
siguientes dos elementos se pueden combinar, a menudo decimos Selenium
que se refiere principalmente a la WebDriver
API. Selenium
La versión principal de la versión estable actual es la 3, y la versión beta Selenium4
ya está en camino.
Selenium
O WebDriver
la base de la interacción con el navegador es el WebDriver
protocolo (estándar recomendado por W3C). WebDriver
El 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.
WebDriver
Actualmente existen dos versiones del acuerdo:
WebDriver 1
:Https://www.w3.org/TR/webdriver1/WebDriver 2
:Https://www.w3.org/TR/webdriver/
WebDriver
Hay un acuerdo abandonado antes del JsonWireProtocol
acuerdo, consultehttps://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
WebDriver
Tres 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
RemoteWebDriver
máquina en ejecución oWebDriver
el navegador que admite el protocolo , como elgeckodriver
navegador Firefox compatible y elchromedriver
navegador Chrome compatible .WebDriver
En realidad, el protocolo solo define el comportamiento del servidor. WebDriver
: El diversos navegadoresWebDriver
protocolo, comogeckodriver
,chromedriver
,WebDriver
es equivalente al intermediario cliente y el servidor, proporcionandoWebDriver
servicios RESTful de protocolo. El clienteWebDriver
controla el servidor (navegador). Por ejemplo, Firefox se basa enwebdriver.xpi
extensiones para controlar el navegador.
Después de que el cliente se ejecuta, se inicia una sesión. En esta sesión, el WebDriver
cliente 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. .
!
WebDriver
El 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: WebDriver
las current_url
características de la clase.
-
current_url
La característica es en realidadCommand.GET_CURRENT_URL
el resultado de la ejecución del comando .@property def current_url(self): return self.execute(Command.GET_CURRENT_URL)['value']
-
WebDriver
Elexecute
método de la clase escommand_executor.execute(driver_command, params)
ejecutado por el comando.
command_executor
Es una cadena (URL del servidor) uremote_connection.RemoteConnection
objeto. -
remote_connection.RemoteConnection
La clase está ubicadaselenium\webdriver\remote\remote_connection.py
.
remote_connection.RemoteConnection
Los_commands
atributos de la clase definen la relación entre el comando y el punto final.
Command.GET_CURRENT_URL: ('GET', '/session/$sessionId/url')
remote_connection.RemoteConnection
Elexecute
método de la clase controla al servidor para ejecutar comandos. -
WebDriver
Cuando se crea una instancia de la clasecommand_executor
, se pasancommand_executor
pará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:
-
driver = webdriver.Firefox()
Es decirselenium\webdriver\firefox\webdriver.py
, seWebDriver
crea una instancia de la clase en el par y laWebDriver
clase hereda deselenium\webdriver\remote\webdriver.py
laWebDriver
clase en.WebDriver
Elcommand_executor
parámetro en el método de construcción de la clase es la dirección del servidor.
En este punto,WebDriver
inicie el navegador, cargue lawebdriver.xpi
extensión y escuche lasWebDriver
solicitudes basadas en protocolos.
Segeckodriver.log
puede ver un1116855012551 geckodriver INFO Listening on 127.0.0.1:54499
registro similar en el archivo de registro . -
driver.get("http://www.baidu.com")
Equivale a ejecutar unCommand.GET
comando.WebDriver
Los objetos dependen de losremote_connection.RemoteConnection
objetos paracommand_executor
ejecutar comandos. El mapeoremote_connection.RemoteConnection
del comando alWebDriver
protocolo se implementa en la claseCommand.GET: ('POST', '/session/$sessionId/url')
. Ejecutar el comando equivale a enviar una solicitud correspondiente al navegador.WebDriver
Envíe la solicitud al navegador.def get(self, url): self.execute(Command.GET, { 'url': url})
-
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).
WebDriver
Pase el resultado de la respuesta al código.