Automação de Testes: Navegando e Selecionando Elementos em Páginas com Frames no TestLink

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:

  1. Mudar o foco do driver para o frame titlebar.
  2. Loclaizar o elemento do tipo SELECT que representa o projeto de teste, geralmente identificado pelo atributo name='testproject'.
  3. Iterar sobre todas as opções (<option>) dentro do seletor.
  4. Comparar o texto ou valor de cada opção com o identificador do projeto de teste desejado.
  5. Clicar na opção correspondente quando encontrada.
  6. 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.
  7. 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:

  1. Retornar ao contexto principal (switch_to_default_content()) e, em seguida, mudar para o frame mainframe.
  2. 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.
  3. Clicar neste contêiner para expandir as opções disponíveis.
  4. 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 de find_element_by_link_text diretamente no driver pode não funcionar aqui, pois o texto pode estar dentro de um span ou 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>

Tags: Selenium Python testlink Automação de Testes frames

Publicado em 6-19 20:09