[Python + Selenium] Percorrer uma lista e clicar no link correto

Olá,

Atualmente estou tentando cadastrar um usuário e logo depois percorrer uma table e clicar exatamente no usuário recém cadastrado.

Meu código:

def create_fee_schedule(self):

    self.name = fake.name()

    self.find_element(FeeScheduleLocators.NAME).send_keys(self.name)

    self.find_element(FeeScheduleLocators.SAVE_BUTTON).click()
    WebDriverWait(self.driver, AUTOCOMPLETE_TIMEOUT).until(
        EC.text_to_be_present_in_element((By.CLASS_NAME, "success"), 'Fee added sucessfully'))

    self.fee_list = self.find_elements(FeeScheduleLocators.FEE_SCHEDULE_LIST)

    for each_register in self.fee_list:

        while each_register.text != self.name:

            self.find_element(FeeScheduleLocators.NEXT_LINK).click()
            time.sleep(2)

        else:

            each_register.click()

O meu problema é que após o código percorrer todas as páginas, ele não está conseguindo identificar o usuário e muito menos clicar nele, logo, não está executando o código èlse`

Alguém sabe como percorrer uma lista de várias páginas e clicar exatamente em um valor específico?

Att,
Rafael

@Rafa Como eu não vou conseguir colocar o script pra ti pois não sei como é a estrutura de tabela vai a dica que eu utilizo quando preciso fazer a mesma coisa:

  1. Percorrer a coluna em uma iteração (sugestão de fazer por for-i) com uma comparação dentro do laço para verificar se o nome que tu precisa e igual ao da linha atual na coluna
  2. Quando for igual clicar. Se tu tiver que clicar em um botão ou algo do gênero na mesma linha, mas em coluna diferente, é só aplicar um xpath com o número da linha igual a do “i” do laço


@eliasnogueira

Oi @Elias-Nogueira

A estrutura da tabela pode ser vista aqui (primeira página da tabela, pois são 4 páginas): https://gist.github.com/rafaelcs/f9dbf08abcfc3b72b4d96cc06dc69153

Abaixo eu estou colocando os locators que compõe o meu método acima (assim fica melhor de entender o código):

class FeeScheduleLocators(object):

  ADD_BUTTON = (By.ID, "save")
  NAME = (By.ID, "id_name")
  SAVE_BUTTON = (By.CSS_SELECTOR, "input[type='submit']")
  FEE_SCHEDULE_LIST = (By.TAG_NAME, "td")
  NEXT_LINK = (By.LINK_TEXT, "Next")

O meu desafio com esse método é que logo após registrar um novo usuário, este mesmo usuário aparece sempre na última página, então eu preciso percorrer toda a tabela (até a última página, clicando no link NEXT) e clicar neste usuário.

Até então o código está indo até a ultima página (executando o while), mas parece que não está fazendo a comparação se existe mesmo o usuário e muito menos clicando nele.

Eu confesso que não entendi muito bem o teu exemplo. Será que consegue postar em forma de código, por favor?

-1

@Rafa Peguei a estrutura da tua tabela e fiz este trecho de código, que funcionou, mas como eu não estou muito bom no Python fiz em Java :sweat_smile:

String nomePesquisado = "Dr. Izabelle Price DDS";
/*
 * Como tu tem um th e todos os nomes estao no td[1] é só iterar
 */
List<WebElement> colunaNome = driver.findElements(By.xpath("//td[1]"));
for (int i = 1; i < colunaNome.size(); i++) {
   if (colunaNome.get(i).getText().equals(nomePesquisado)) {
      System.out.println("Encontrou a pessoa: " + nomePesquisado);
      break;
   }
}

No teu caso é só substituir a impressão pelo clique.
Eu recomendo o uso do xpath neste caso por poder iterar pela tabela através do posicionamento se tu precisar fazer qualquer outra coisa nela.


@eliasnogueira

acredito que o teu código seja exatamente como o meu (mas em python).

Como eu havia dito, eu preciso percorrer 4 páginas até achar o meu usuário (e isso está fazendo bem), o meu problema é que quando ele passa pelo usuário correto, é ignorado. O erro acontece exatamente nesta condição:

while each_register.text != self.name:

Veja no código acima que eu atualizei a linha while each_register.text != self.name: colocando o .text

Não está havendo a comparação que eu preciso e nem o clique.

Olhei o post correndo… talvez seja problema de tipagem de objeto ou algum espaço em branco…
tenta ai:

while str(each_register.text).replace(' ','') != str(self.name):

Tu já chegou colocar um breakpoint na hora de percorrer a lista e ver se está “percorrendo” mesmo?

Pessoal,

Gostaria apenas de atualizar vocês e informar que o problema foi resolvido.

O grande problema é que quando eu criava um novo registro, ele era mostrado na última página da tabela, mas por uma questão de usabilidade, eu reportei e então o bug foi fixado colocando o primeiro registro aparecendo sempre na primeira página da tabela, logo, o meu código funcionou e ficou assim:
´´´
def select_created_fee(self):

    self.fee_list = self.find_elements(FeeScheduleLocators.FEE_SCHEDULE_LIST)

    for self.each_register in self.fee_list:

        if self.each_register.text == self.name:

            self.each_register.click()
            break;

´´

Log in to reply

Looks like your connection to Agile Testers was lost, please wait while we try to reconnect.