Ao automatizar interações com o sistema TestLink, a identificação e seleção de elementos específicos em páginas que utilizam frames pode apresentar desafios. Este guia aborda a estratégia para superar essas dificuldades.
A estrutura de páginas do TestLink frequentemente emprega múltiplos frames. Como ilustrado, a página é dividida em dois frames principais: um para a barra de título (titlebar) e outro para o conteúdo principal (mainframe). Para interagir com elementos dentro de um frame específico, é necessário primeiro mudar o foco do driver para esse frame.
<frameset rows="70,*" frameborder="0" framespacing="0">
<frame src="lib/general/navBar.php?tproject_id=0&tplan_id=0&updateMainPage=1" name="titlebar" scrolling="no" noresize="noresize" />
<frame src="lib/general/mainPage.php" scrolling='auto' name='mainframe' />
<noframes>
<body>TestLink requires a frames supporting browser.</body>
</noframes>
</frameset>
Selecionando o Projeto de Teste:
Para selecionar um projeto de teste a partir de um menu suspenso, o processo envolve as seguintes etapas:
- Mudar o foco do driver para o frame
titlebar. - Loclaizar o elemento do tipo
SELECTque representa o projeto de teste, geralmente identificado pelo atributoname='testproject'. - Iterar sobre todas as opções (
<option>) dentro do seletor. - Comparar o texto ou valor de cada opção com o identificador do projeto de teste desejado.
- Clicar na opção correspondente quando encontrada.
- Após a seleção do projeto, pode ser necessário um pequeno atraso (
time.sleep) para que a interface se atualize antes de prosseguir. - Em seguida, pode-se clicar em um botão de ação, como o de executar casos de teste, identificado por um título de imagem (
title='执行').
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time
# Assumindo que 'browser' é uma instância do WebDriver configurada
# e 'testconfig' é um dicionário com as configurações necessárias
# Exemplo de como alternar para o frame e selecionar o projeto
browser.switch_to_frame("titlebar")
print(f"URL atual do frame: {browser.current_url}")
# Selecionar o projeto de teste
project_selector = browser.find_element_by_name("testproject")
all_options = project_selector.find_elements_by_tag_name("option")
target_project_id = testconfig['testprojectid'] # Supondo que este ID esteja no texto da opção
for option in all_options:
print(f"Valor da opção: {option.get_attribute('value')}")
print(f"Texto da opção: {option.text}")
if target_project_id in option.text:
option.click()
print(f"Projeto '{option.text}' selecionado.")
break
time.sleep(1) # Aguardar atualização da interface
# Clicar no botão de execução de casos de teste
browser.find_element_by_xpath("//img[@title='执行']").click()
Identificando e Selecionando o Plano de Teste em um Eleemnto Customizado:
A seleção do plano de teste pode ser mais complexa se ele não for um elemento SELECT padrão, mas sim um componente customizado como o Chosen, que é estilizado para parecer um seletor, mas internamente usa divs e outros elementos.
O HTML para um elemento Chosen pode se parecer com:
<div class="chosen-container chosen-container-single" style="width: 85%;" title="">
<a tabindex="-1" class="chosen-single">
<span>Terceiro Ciclo de Teste</span>
<div><b></b></div>
</a>
<div class="chosen-drop">
<div class="chosen-search">
<input type="text" autocomplete="off">
</div>
<ul class="chosen-results">
<li data-option-array-index="0" style="" class="active-result">xxxx</li>
<li data-option-array-index="1" style="" class="active-result">xxxx</li>
<li data-option-array-index="2" style="" class="active-result">Ixxxx</li>
<li data-option-array-index="3" style="" class="active-result">Primeiro Ciclo de Teste</li>
<li data-option-array-index="4" style="" class="active-result result-selected">Terceiro Ciclo de Teste</li>
<li data-option-array-index="5" style="" class="active-result">Quinto Ciclo de Teste</li>
<li data-option-array-index="6" style="" class="active-result">Quarto Ciclo de Teste</li>
</ul>
</div>
</div>
Estratégia de Automação para o Plano de Teste Chosen:
A interação com um componente Chosen requer uma abordagem em várias etapas:
- Retornar ao contexto principal (
switch_to_default_content()) e, em seguida, mudar para o framemainframe. - Localizar o contêiner principle do componente Chosen. Um seletor XPath genérico como
//div[contains(@class,'chosen-c')]pode ser um ponto de partida. - Clicar neste contêiner para expandir as opções disponíveis.
- Após um breve atraso, localizar o item específico da lista (
<li>) que contém o texto do plano de teste desejado. O uso defind_element_by_link_textdiretamente no driver pode não funcionar aqui, pois o texto pode estar dentro de umspanou outro elemento aninhado, e a estrutura não é um link tradicional. Uma abordagem mais robusta seria encontrar a lista de resultados e depois iterar sobre seus itens.
# Retornar ao frame principal e selecionar o plano de teste
browser.switch_to_default_content()
browser.switch_to_frame("mainframe")
print(f"URL atual do frame principal: {browser.current_url}")
target_plan_text = testconfig['testplan']
print(f"Tentando selecionar o plano de teste: {target_plan_text}")
# Clicar no elemento Chosen para expandi-lo
# Um seletor mais específico pode ser necessário dependendo da página
chosen_container_xpath = "//div[contains(@class, 'chosen-container-single')]"
browser.find_element_by_xpath(chosen_container_xpath).click()
time.sleep(1) # Aguardar a exibição das opções
# Localizar a lista de resultados e a opção desejada
# O XPath para a lista de resultados pode precisar ser ajustado
results_list_xpath = f"{chosen_container_xpath}/div[@class='chosen-drop']/ul[@class='chosen-results']"
results_ul = browser.find_element_by_xpath(results_list_xpath)
options = results_ul.find_elements_by_tag_name("li")
for option_li in options:
if option_li.text == target_plan_text:
option_li.click()
print(f"Plano de teste '{target_plan_text}' selecionado.")
break
else:
print(f"Erro: Plano de teste '{target_plan_text}' não encontrado.")
# Alternativas que podem não funcionar diretamente com Chosen:
# browser.find_element_by_xpath("//div[contains(@class,'chosen-c')]").click()
# browser.find_element_by_link_text('IOS_D10V100_rc4') # Provavelmente falhará
# Select(browser.find_element_by_name('testplan')).select_by_visible_text(testconfig['testplan']) # Não aplicável se não for um <select>
</select>