Análise de código-fonte da API Selenium3 Python WebDriver (20) Visão geral do protocolo WebDriver

Protocolo WebDriver

No início Selenium, eles WebDrivereram dois projetos independentes. No Seleniuminício, eles dependiam principalmente da conversão de operações em JavaScript e, em seguida, injetá-los no navegador para automatizar WebDrivero 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 Selenium2seguintes dois itens podem ser combinados, costumamos dizer Seleniumque se refere principalmente à WebDriverAPI. SeleniumA versão principal da versão estável atual é a 3, e a versão beta Selenium4está a caminho.

SeleniumOu WebDrivera base da interação com o navegador é o WebDriverprotocolo (padrão recomendado pelo W3C). WebDriverO 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.

WebDriverAtualmente, existem duas versões do contrato:

WebDriverExiste um acordo abandonado antes do JsonWireProtocolacordo, consultehttps://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol

WebDriverTrê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 RemoteWebDrivermáquina em execução ou WebDrivero navegador que oferece suporte ao protocolo , como o geckodrivernavegador Firefox compatível e o chromedrivernavegador Chrome compatível . WebDriverNa verdade, o protocolo apenas define o comportamento do servidor.
  • WebDriver: A vários navegadores WebDriverprotocolo, como geckodriver, chromedriver, WebDriveré equivalente ao intermediário cliente e servidor, fornecendo WebDriverserviços RESTful protocolo. O cliente WebDrivercontrola o servidor (navegador). Por exemplo, o Firefox depende de webdriver.xpiextensões para controlar o navegador.

Após a execução do cliente, uma sessão é iniciada. Nessa sessão, o WebDrivercliente 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 .
!Insira a descrição da imagem aqui

WebDriverO 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: WebDriveras current_urlcaracterísticas da classe

  1. current_urlA característica é na verdade Command.GET_CURRENT_URLo resultado da execução do comando .

    @property
    def current_url(self):
         return self.execute(Command.GET_CURRENT_URL)['value']
    
  2. WebDriverO executemétodo da classe é command_executor.execute(driver_command, params)executado pelo comando.
    command_executorÉ uma string (URL do servidor) ou remote_connection.RemoteConnectionobjeto.

  3. remote_connection.RemoteConnectionA classe está localizada selenium\webdriver\remote\remote_connection.py.
    remote_connection.RemoteConnectionOs _commandsatributos da classe definem o relacionamento entre o comando e o terminal.
    Command.GET_CURRENT_URL: ('GET', '/session/$sessionId/url')
    remote_connection.RemoteConnectionO executemétodo da classe controla o servidor para executar comandos.

  4. WebDriverQuando a classe é instanciada command_executor, os command_executorparâ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:

  1. driver = webdriver.Firefox()Isto é selenium\webdriver\firefox\webdriver.py, a WebDriverclasse no par é instanciado, e as WebDriverherda uma classe a partir selenium\webdriver\remote\webdriver.pyda WebDriverclasse em. WebDriverO command_executorparâmetro no método de construção da classe é o endereço do servidor.
    Neste ponto, WebDriverinicie o navegador, carregue a webdriver.xpiextensão e ouça as WebDriversolicitações baseadas em protocolo.
    Um registro geckodriver.logsemelhante pode ser visto no arquivo de log 1116855012551 geckodriver INFO Listening on 127.0.0.1:54499.

  2. driver.get("http://www.baidu.com")É equivalente a executar um Command.GETcomando. WebDriverObjetos dependem de remote_connection.RemoteConnectionobjetos para command_executorexecutar comandos. O mapeamento remote_connection.RemoteConnectiondo comando para o WebDriverprotocolo é implementado na classe Command.GET: ('POST', '/session/$sessionId/url'). Executar o comando é equivalente a enviar uma solicitação correspondente ao navegador. WebDriverEnvie a solicitação para o navegador.

     def get(self, url):
         self.execute(Command.GET, {
          
          'url': url})
    
  3. 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). WebDriverPasse o resultado da resposta para o código.

Acho que você gosta

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