Template Troca de Senha com Selenium [AWS Console] - Passo a Passo

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:
image

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: