import json import os import urllib import requests class Chrome: """ ## Instância do Chrome --- Esta classe utiliza o serviço "svc_chrome.exe" para fazer manipulações no navegador. Ela mapeia o robo através da propriedade rid. "EP" significa endpoint, e aponta para o endereco na web on se hostea o serviço, por padrão é: https://localhost:8443 """ ep: str = "" def __init__(self): self.ep = "https://localhost:8443" def __request_get__(self, data: str): """ ## HTTP GET --- Este método é responsável por realizar requisições HTTP do tipo GET. Ele retorna o corpo de resposta da requisição, ou uma mensagem de erro, que indica qual foi a irregularidade ocorrida ao chamar a API. """ url = self.ep + data print("Calling: " + url) apikey = os.environ.get('REPLAY_APIKEY') headers = {"X-API-KEY": apikey} res = requests.get(url, headers=headers, verify=False) if res.status_code >= 400: raise Exception(f"HTTP ERROR: {str(res.status_code)} - {res.text}") if res.headers.get("Content-Type") != None and res.headers.get("Content-Type").find("json") != -1: return json.loads(res.text) else: return res.text def __request_json_post__(self, path: str, object: dict): """ ## HTTP JSON POST --- Este método é responsável por realizar requisições HTTP do tipo POST para objetos JSON. Ele retorna o corpo de resposta da requisição, ou uma mensagem de erro, que indica qual foi a irregularidade ocorrida ao chamar a API. """ url = self.ep + path print("Calling: " + url) apikey = os.environ.get('REPLAY_APIKEY') headers = {"X-API-KEY": apikey} res = requests.post(url, json = object, headers = headers, verify = False) if res.status_code >= 400: raise Exception(f"HTTP ERROR: {str(res.status_code)} - {res.text}") if res.headers.get("Content-Type") != None and res.headers.get("Content-Type").find("json") != -1: return json.loads(res.text) else: return res.text def __request_raw_post__(self, path: str, data: str): """ ## HTTP RAW POST --- Este método é responsável por realizar requisições HTTP do tipo POST para objetos RAW. Ele retorna o corpo de resposta da requisição, ou uma mensagem de erro, que indica qual foi a irregularidade ocorrida ao chamar a API. """ url = self.ep + path print("Calling: " + url) apikey = os.environ.get('REPLAY_APIKEY') headers = {"X-API-KEY": apikey} res = requests.post(url, data = data, headers = headers, verify = False) if res.status_code >= 400: raise Exception(f"HTTP ERROR: {str(res.status_code)} - {res.text}") if res.headers.get("Content-Type") != None and res.headers.get("Content-Type").find("json") != -1: return json.loads(res.text) else: return res.text def start (self, to: int = 120): """ ## Chrome Start Inicia uma nova sessão/instância do Google Chrome na máquina. --- #### IMPORTANTE: É um erro comum já estar com o Google Chrome aberto para realizar outras tarefas enquanto programa. Porém, para que este método funcione corretamente, é necessário que não haja nenhuma instância do Chrome, em primeiro ou segundo plano, ativa. --- #### Parâmetros: - to: Tempo em segundos que a API esperará pela abertura do Chrome. Caso o tempo seja excedido sem que o Chrome seja aberto com sucesso, é retornado um erro. --- #### Retorna: "" -> String vazia """ return self.__request_get__(f"/ipc/chrome/start?to={to}") def start_headless (self): """ ## Chrome Start Headless Inicia uma nova sessão/instância do Google Chrome em segundo plano na máquina. --- #### IMPORTANTE: É um erro comum já estar com o Google Chrome aberto para realizar outras tarefas enquanto programa. Porém, para que este método funcione corretamente, é necessário que não haja nenhuma instância do Chrome, em primeiro ou segundo plano, ativa. --- #### Parâmetros: --- --- #### Retorna: "" -> String vazia """ return self.__request_get__("/ipc/chrome/startHeadless") def stop (self): """ ## Chrome Stop Finaliza todas as sessões/instâncias ativas, em primeiro ou segundo plano, da máquina. Caso não haja nenhuma sessão ativa, não faz nada. --- #### IMPORTANTE: Este método funciona apenas com instâncias inicializadas pelo Client do Chrome. Caso uma sessão do Chrome tenha sido iniciada por outros modos, não surtirá efeito. --- #### Parâmetros: --- --- #### Retorna: "" -> String vazia """ return self.__request_get__("/ipc/chrome/stop") def new (self, url: str = "https://www.google.com"): """ ## Chrome New Abre uma nova aba na instância do Google Chrome inicializada pelo client. --- #### Parâmetros: - url: Endereço web do site que se deseja acessar na nova aba. --- #### Retorna: -> ID da aba aberta. """ url = urllib.parse.quote(url, "") return self.__request_get__(f"/ipc/chrome/new?url={url}") def close (self, id: str): """ ## Chrome Close Fecha a aba cujo ID foi informado como parâmetro. --- #### Parâmetros: - id: Identificador da aba que se deseja fechar. --- #### Retorna: "" -> String vazia """ return self.__request_get__("/ipc/chrome/close/"+id) def eval (self, id: str, command: str) -> dict: """ ## Chrome Eval Digita o comando recebido no Console JavaScript da página cujo ID foi recebido. --- #### Parâmetros: - id: Identificador da aba em que se quer acessar o console. - command: Comando DOM JavaScript --- #### Retorna: -> ? """ raw_return = self.__request_raw_post__("/ipc/chrome/eval/"+id, command) return raw_return['result']['result']['value'] if ('value' in raw_return['result']['result']) else ""