Protocolo WebDriver
No início Selenium
, eles WebDriver
eram dois projetos independentes. No Selenium
início, eles dependiam principalmente da conversão de operações em JavaScript e, em seguida, injetá-los no navegador para automatizar WebDriver
o navegador, encapsulando a API nativa do navegador em um conjunto de APIs mais orientadas a objetos , mas devido às diferenças nos núcleos dos diferentes navegadores, portanto, para se adaptar, diferentes APIs devem ser implementadas para diferentes navegadores. Nos Selenium2
seguintes dois itens podem ser combinados, costumamos dizer Selenium
que se refere principalmente à WebDriver
API. Selenium
A versão principal da versão estável atual é a 3, e a versão beta Selenium4
já está a caminho.
Selenium
Ou WebDriver
a base da interação com o navegador é o WebDriver
protocolo (padrão recomendado pelo W3C). WebDriver
O protocolo é um serviço da Web RESTful que usa JSON como formato de transmissão por meio do protocolo HTTP e não tem nenhuma relação com o sistema operacional e a linguagem de programação.
WebDriver
Atualmente, existem duas versões do contrato:
WebDriver 1
:Https://www.w3.org/TR/webdriver1/WebDriver 2
:Https://www.w3.org/TR/webdriver/
WebDriver
Existe um acordo abandonado antes do JsonWireProtocol
acordo, consultehttps://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
WebDriver
Três objetos estão envolvidos no modelo de acordo:
- Cliente (cliente ou extremidade local): pode ser considerado simplesmente como o programa ou máquina que chama a API WebDriver. Nossa API Python WebDriver comumente usada é uma ligação de linguagem Python do cliente.
- Servidor (servidor ou extremidade remota): a
RemoteWebDriver
máquina em execução ouWebDriver
o navegador que oferece suporte ao protocolo , como ogeckodriver
navegador Firefox compatível e ochromedriver
navegador Chrome compatível .WebDriver
Na verdade, o protocolo apenas define o comportamento do servidor. WebDriver
: A vários navegadoresWebDriver
protocolo, comogeckodriver
,chromedriver
,WebDriver
é equivalente ao intermediário cliente e servidor, fornecendoWebDriver
serviços RESTful protocolo. O clienteWebDriver
controla o servidor (navegador). Por exemplo, o Firefox depende dewebdriver.xpi
extensões para controlar o navegador.
Após a execução do cliente, uma sessão é iniciada. Nessa sessão, o WebDriver
cliente solicita o servidor por meio do protocolo RESTful service endpoint (endpoint, que pode ser simplesmente entendido como url), e o servidor retorna uma resposta ao cliente após aceitar a solicitação .
!
WebDriver
O protocolo mapeia pontos de extremidade para comandos. A relação entre endpoints e comandos é a seguinte ( https://www.w3.org/TR/webdriver/#endpoints ):
Método | Modelo URI | Comando |
---|---|---|
PUBLICAR | /sessão | Nova Sessão |
EXCLUIR | / sessão / {id da sessão} | Apagar Sessão |
OBTER | /status | Status |
OBTER | / sessão / {id da sessão} / tempo limite | Obter tempo limite |
PUBLICAR | / sessão / {id da sessão} / tempo limite | Definir tempos limite |
PUBLICAR | / sessão / {id da sessão} / url | Navegar para |
OBTER | / sessão / {id da sessão} / url | Obter URL atual |
PUBLICAR | / sessão / {id da sessão} / voltar | De volta |
PUBLICAR | / sessão / {id da sessão} / encaminhar | Avançar |
PUBLICAR | / sessão / {id da sessão} / atualização | Atualizar |
OBTER | / sessão / {id da sessão} / título | Obter Título |
OBTER | / sessão / {id da sessão} / janela | Obter puxador de janela |
EXCLUIR | / sessão / {id da sessão} / janela | Janela fechada |
PUBLICAR | / sessão / {id da sessão} / janela | Mudar para a janela |
OBTER | / sessão / {id da sessão} / janela / alças | Obter alças de janela |
PUBLICAR | / sessão / {id da sessão} / janela / novo | Nova janela |
PUBLICAR | / sessão / {id da sessão} / frame | Mudar para quadro |
PUBLICAR | / sessão / {id da sessão} / frame / pai | Mudar para quadro pai |
OBTER | / sessão / {id da sessão} / janela / rect | Obter Window Rect |
PUBLICAR | / sessão / {id da sessão} / janela / rect | Definir janela reta |
PUBLICAR | / sessão / {id da sessão} / janela / maximizar | Maximize Window |
PUBLICAR | / sessão / {id da sessão} / janela / minimizar | Minimize Window |
PUBLICAR | / sessão / {id da sessão} / janela / tela inteira | Janela em tela cheia |
OBTER | / sessão / {id da sessão} / elemento / ativo | Obter elemento ativo |
PUBLICAR | / sessão / {id da sessão} / elemento | Encontre o Elemento |
PUBLICAR | / sessão / {id da sessão} / elementos | Encontrar Elementos |
PUBLICAR | / sessão / {id da sessão} / elemento / {id do elemento} / elemento | Encontrar o elemento do elemento |
PUBLICAR | / sessão / {id da sessão} / elemento / {id do elemento} / elementos | Encontrar elementos do elemento |
OBTER | / sessão / {id da sessão} / elemento / {id do elemento} / selecionado | É um elemento selecionado |
OBTER | / sessão / {id da sessão} / elemento / {id do elemento} / atributo / {nome} | Obter atributo de elemento |
OBTER | / sessão / {id da sessão} / elemento / {id do elemento} / propriedade / {nome} | Obter propriedade do elemento |
OBTER | / sessão / {id da sessão} / elemento / {id do elemento} / css / {nome da propriedade} | Obter valor CSS do elemento |
OBTER | / sessão / {id da sessão} / elemento / {id do elemento} / texto | Obter Texto do Elemento |
OBTER | / sessão / {id da sessão} / elemento / {id do elemento} / nome | Obter o nome da tag do elemento |
OBTER | / sessão / {id da sessão} / elemento / {id do elemento} / rect | Obter Elemento Rect |
OBTER | / sessão / {id da sessão} / elemento / {id do elemento} / habilitado | O elemento está ativado |
OBTER | / sessão / {id da sessão} / elemento / {id do elemento} / computedrole | Obtenha uma função computada |
OBTER | / sessão / {id da sessão} / elemento / {id do elemento} / computedlabel | Get Computed Label |
PUBLICAR | / sessão / {id da sessão} / elemento / {id do elemento} / clique | Clique no Elemento |
PUBLICAR | / sessão / {id da sessão} / elemento / {id do elemento} / claro | 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 exemplo: WebDriver
as current_url
características da classe
-
current_url
A característica é na verdadeCommand.GET_CURRENT_URL
o resultado da execução do comando .@property def current_url(self): return self.execute(Command.GET_CURRENT_URL)['value']
-
WebDriver
Oexecute
método da classe écommand_executor.execute(driver_command, params)
executado pelo comando.
command_executor
É uma string (URL do servidor) ouremote_connection.RemoteConnection
objeto. -
remote_connection.RemoteConnection
A classe está localizadaselenium\webdriver\remote\remote_connection.py
.
remote_connection.RemoteConnection
Os_commands
atributos da classe definem o relacionamento entre o comando e o terminal.
Command.GET_CURRENT_URL: ('GET', '/session/$sessionId/url')
remote_connection.RemoteConnection
Oexecute
método da classe controla o servidor para executar comandos. -
WebDriver
Quando a classe é instanciadacommand_executor
, oscommand_executor
parâmetros são passados e os parâmetros são o endereço do servidor.
Processo de execução da API WebDriver Python (em andamento)
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 服务端地址
url = driver.command_executor._url
print(url)
O fluxo de execução do código acima é aproximadamente o seguinte:
-
driver = webdriver.Firefox()
Isto éselenium\webdriver\firefox\webdriver.py
, aWebDriver
classe no par é instanciado, e asWebDriver
herda uma classe a partirselenium\webdriver\remote\webdriver.py
daWebDriver
classe em.WebDriver
Ocommand_executor
parâmetro no método de construção da classe é o endereço do servidor.
Neste ponto,WebDriver
inicie o navegador, carregue awebdriver.xpi
extensão e ouça asWebDriver
solicitações baseadas em protocolo.
Um registrogeckodriver.log
semelhante pode ser visto no arquivo de log1116855012551 geckodriver INFO Listening on 127.0.0.1:54499
. -
driver.get("http://www.baidu.com")
É equivalente a executar umCommand.GET
comando.WebDriver
Objetos dependem deremote_connection.RemoteConnection
objetos paracommand_executor
executar comandos. O mapeamentoremote_connection.RemoteConnection
do comando para oWebDriver
protocolo é implementado na classeCommand.GET: ('POST', '/session/$sessionId/url')
. Executar o comando é equivalente a enviar uma solicitação correspondente ao navegador.WebDriver
Envie a solicitação para o navegador.def get(self, url): self.execute(Command.GET, { 'url': url})
-
Depois que o navegador aceita a solicitação, ele executa a operação (abre a página do Baidu) e retorna uma resposta (endereço do servidor).
WebDriver
Passe o resultado da resposta para o código.