Este artigo irá explicar o passo a passo da criação de um template de troca de senha web utilizando o protocolo Selenium.
Pré-requisitos: Selenium IDE, Inspecionar Elementos no navegador
Explicação: Todos os termos entre colchetes com o nome genérico são informações para substituir.
1. Realizar Troca de Senha pelo Selenium
Utilize o aplicativo Selenium, nesse artigo é utilizado a extensão para Chrome Selenium IDE. Acesse a aplicação e clique em “Record a new test in a new project”. Após isso, preencha um nome arbitrário para o projeto e em “Ok”.
A URL Base é a URL de autenticação para o website, nesse caso: https://[ACCOUNT_ID].signin.aws.amazon.com/console.
Clique para iniciar gravação e irá abrir uma nova guia, com o informativo que o Selenium IDE está gravando, como mostrado abaixo:
Agora, autentique na solução e faça a troca de senha com a IDE gravando. O passo a passo para a Console AWS é:
Autenticar → Usuário → Credenciais de Segurança → Atualizar Senha do Console.
Realize toda a gravação, feche o navegador da IDE e veja as informações no aplicativo, como abaixo:
Iremos utilizar as informações presentes dos elementos que foram clicados durante a troca de senha.
2. Comandos mais utilizados no Selenium Explicados
ATENÇÃO: Durante a criação do template é necessário encontrar os elementos que precisamos interagir, como campos para preenchimento e botões, para encontrar os elementos utilizamos principalmente os parâmetros Xpath (caminho completo do elemento) ou Name (informação relacionada ao nome do elemento). O parâmetro mais confiável é o Xpath, porém temos um momento em específico que não é possível utilizar, que será descrito daqui a pouco.
- Comentários - Utilizados para receber um feedback da execução de troca de senha.
print("[comment]")
- Acessar a URL - Utilizado para acessar URL, principalmente no início do template e no momento que precisamos ir em uma nova URL (exemplo: tela para troca de senha).
self.driver.get("[target_url]")
- Esperar tempo até a presença do elemento - Importante no momento que é aberto uma nova aba ou tela, para dar um tempo para os elementos carregarem, antes de executar algo.
WebDriverWait(self.driver, [time_seconds]).until(expected_conditions.presence_of_element_located((By.XPATH, '[xpath_element]')))
- Esperar tempo até um elemento sumir - possui a mesma utilização do comando anterior, porém ao contrário do elemento aparecer, ele deve sumir
WebDriverWait(self.driver, 10).until(expected_conditions.invisibility_of_element_located((By.XPATH, '//*[@id="signin_button"]')))
- Encontrar Elemento e Preencher - primeiro encontramos o elemento que precisamos preencher, como o campo de usuário, depois o comando “send_keys” preenche automaticamente.
self.driver.find_element(By.XPATH, '[xpath_element]').send_keys("[text]")
- Encontrar Elemento e Preencher com parâmetro Name
self.driver.find_element(By.NAME, "[name_element]").send_keys("[text]")
- Encontrar Elemento e clicar - utilizado para clicar nos botões
self.driver.find_element(By.XPATH, '[xpath_element]').click()
TAGs mais utilizadas na criação de template:
- [#HOSTNAME#]: Hostname do dispositivo
- [username#]: Username da credencial
- [#NEW_PASSWORD#]: Valor da nova senha
- [#CURRENT_PASSWORD#]: Valor da senha atual
3. Passo a Passo para Criação do Template
Primeiro, é necessário criar o template de troca de senha com o protocolo Selenium, seguindo o seguinte caminho:
Executions → Configurações → Modelo → Novo.
A criação deve seguir o seguinte modelo:
A criação do template seguirá passo a passo, a recomendação é sempre realizar uma etapa por vez, testar a troca de senha, verificando nos logs a partir dos comentários como está o processo de execução.
3.1. Autenticação
Primeiramente, é necessário abrir o link que vai a tela de autenticação:
self.driver.get("https://[ACCOUNT_ID].signin.aws.amazon.com/console")
Para autenticar, é necessário preencher os campos de usuário e senha e depois clicar no botão de Login. Logo, é necessário copiar o XPath destes 3 elementos e de modo a facilitar, é copiado a partir da IDE, selecionando o elemento desejado e verificando o “Target”, como mostrado abaixo:
Logo, o XPath do campo de usuário é //*[@id=“username”]. Adaptando os comandos dados na seção 2, primeiro temos que aguardar a execução abrir a página, aguardando o campo de usuário aparecer:
WebDriverWait(self.driver, 10).until(expected_conditions.presence_of_element_located((By.XPATH, '//*[@id="username"]')))
self.driver.find_element(By.XPATH, '//*[@id="username"]').send_keys("[#USERNAME#]")
self.driver.find_element(By.XPATH, '//*[@id="password"]').send_keys("[#CURRENT_PASSWORD#]")
No XPath do botão de Login, temos o seguinte: xpath=//div[@id=‘input_signin_button’]/a. Quando o Selenium trouxer o XPath com div ou /a, pode substituir o div por * e ignorar o /a, ficando apenas: //[@id=‘input_signin_button’] para padronização. Logo, para autenticar com o clique no botão:
self.driver.find_element(By.XPATH, '//*[@id="signin_button"]').click()
3.2. Tela para troca de senha
No caso da AWS, para realizar a troca de senha precisamos clicar no usuário ir em “Credenciais de Segurança”.
Esse caso mostra o principal problema relacionado a execução web, os menus flutuantes. Não é possível coletar um identificador do elemento, logo é melhor utilizar o comando para abrir uma nova URL. Portanto, é só copiar a URL que aparece ao clicar no botão de Credenciais.
Abrindo a nova URL:
self.driver.get("https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/security_credentials?section=IAM_credentials")
No caso do botão “Atualizar Senha do Console”, temos o seguinte problema com o XPath puro: ele muda sempre ao atualizar a página. É possível perceber essa situação sempre que existir alguns números em sequência no identificar. Como por exemplo, ao copiar o XPath bo botão: //*[@id=“awsui-tabs-0-8102-IAM_credentials-panel”].
Para clicar no campo de trocar a senha, é necessário utilizar outra forma do Selenium encontrar esse elemento. Para isso, podemos utilizar o “contains”, uma forma de encontrar o elemento pelo o que ele contém visualmente. Seguindo essa lógica, o Xpath fica da seguinte forma: //button[contains(.,‘Update console password’)].
Logo, aguardando a presença do elemento e clicando:
WebDriverWait(self.driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH, "//button[contains(.,'Update console password')]")))
self.driver.find_element(By.XPATH, "//button[contains(.,'Update console password')]").click()
3.3. Realizando a troca de senha:
Para realizar a troca de senha é apenas preencher as seguintes informações e clicar em Confirmar:
Como esses campos estão em uma tela flutuante, o seletor via XPath altera também ao atualizar a página, logo iremos encontrar os elementos a partir do identificador Name. No caso do preenchimento da senha atual temos o seguinte nome:
Logo, preenchendo todos os campos de senha:
self.driver.find_element(By.NAME, "current").send_keys("[#CURRENT_PASSWORD#]")
self.driver.find_element(By.NAME, "new").send_keys("[#NEW_PASSWORD#]")
self.driver.find_element(By.NAME, "confirm").send_keys("[#NEW_PASSWORD#]")
Para finalizar o template, clicando para confirmar:
self.driver.find_element(By.XPATH, "//*[contains(.,'Change password')]").click()
A próxima seção trará o template completo para copiar, com todos os comentários e o resultado da troca de senha, demonstrando a importância de se utilizar o comando print.
4. Template Pronto para Cópia
# Open login URL
print("Open login URL")
self.driver.get("https://[ACCOUNT_ID].signin.aws.amazon.com/console")
# Waiting for username field
print("Waiting for username field")
WebDriverWait(self.driver, 10).until(expected_conditions.presence_of_element_located((By.XPATH, '//*[@id="username"]')))
#Filling Username and Password
print("Filling Username and Password")
self.driver.find_element(By.XPATH, '//*[@id="username"]').send_keys("[#USERNAME#]")
self.driver.find_element(By.XPATH, '//*[@id="password"]').send_keys("[#CURRENT_PASSWORD#]")
#Authentication
self.driver.find_element(By.XPATH, '//*[@id="signin_button"]').click()
WebDriverWait(self.driver, 10).until(expected_conditions.invisibility_of_element_located((By.XPATH, '//*[@id="signin_button"]')))
print("Authentication with success")
#Open Password Change URL
self.driver.get("https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/security_credentials?section=IAM_credentials")
print("Open Password Change URL")
print("Waiting for password change field")
WebDriverWait(self.driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH, "//button[contains(.,'Update console password')]")))
print("Found the Password Change Field")
#Click on Password Change Field
self.driver.find_element(By.XPATH, "//button[contains(.,'Update console password')]").click()
#WebDriverWait(self.driver, 10).until(expected_conditions.invisibility_of_element_located((By.XPATH, "//button[contains(.,'Update console password')]")))
print("Clicked on Rotate Password")
#Filling the Password Changes Informations
#WebDriverWait(self.driver, 10).until(expected_conditions.presence_of_element_located((By.XPATH, "//button[contains(.,'Change Password')]")))
print("Screen for password rotation")
self.driver.find_element(By.NAME, "current").send_keys("[#CURRENT_PASSWORD#]")
self.driver.find_element(By.NAME, "new").send_keys("[#NEW_PASSWORD#]")
self.driver.find_element(By.NAME, "confirm").send_keys("[#NEW_PASSWORD#]")
print("Filled All Information")
#Confirm the Password Rotation
self.driver.find_element(By.XPATH, "//span[contains(.,'Change password')]").click()
print("It worked")
Resultado da execução: