В селене, как узнать точное количество ссылок XPATH с разными идентификаторами? - PullRequest
0 голосов
/ 16 октября 2019

С Python3 и селеном я хочу автоматизировать поиск на общедоступном информационном сайте. На этом сайте необходимо ввести имя человека, затем выбрать орфографию, выбранную для этого имени (без или с акцентами или вариациями имени), перейти на страницу со списком найденных исков, и в этом списке вы можете получить доступ к страницекаждого случая.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
import re

Имя, по которому будет производиться поиск

name = 'JOSE ROBERTO ARRUDA'

Создать путь, начальную ссылку поиска и пустой список для хранения информации

firefoxPath="/home/abraji/Documentos/Code/geckodriver"
link = 'https://ww2.stj.jus.br/processo/pesquisa/?aplicacao=processos.ea'
processos = []

Вызови перейдите на первую страницу поиска

driver = webdriver.Firefox(executable_path=firefoxPath)
driver.get(link)

Поместите курсор, заполните и нажмите

WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#idParteNome'))).click()
time.sleep(1)
driver.find_element_by_xpath('//*[@id="idParteNome"]').send_keys(name)
time.sleep(6)
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#idBotaoPesquisarFormularioExtendido'))).click() 

Отметьте все возможности правописания для поиска

WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#idBotaoMarcarTodos'))).click()
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#idBotaoPesquisarMarcados'))).click()
time.sleep(1)

Проверьте, сколько страницданных есть - для использования в «диапазоне»

capta = driver.find_element_by_xpath('//*[@id="idDivBlocoPaginacaoTopo"]/div/span/span[2]').text
print(capta)
paginas = int(re.search(r'\d+', capta).group(0))
paginas = int(paginas) + 1
print(paginas)

Процедура захвата

for acumula in range(1, paginas):

    # Fill the field with the page number and press enter
    driver.find_element_by_xpath('//*[@id="idDivBlocoPaginacaoTopo"]/div/span/span[2]/input').send_keys(acumula)
    driver.find_element_by_xpath('//*[@id="idDivBlocoPaginacaoTopo"]/div/span/span[2]/input').send_keys(Keys.RETURN)
    time.sleep(2)

    # Captures the number of processes found on the current page - qt
    qt = driver.find_element_by_xpath('//*[@id="idDivBlocoMensagem"]/div/b').text
    qt = int(qt) + 2
    print(qt)

    # Iterate from found number of processes
    for item in range(2, qt):

        # Find the XPATH of each process link - start at number 2
        vez = '//*[@id="idBlocoInternoLinhasProcesso"]/div[' + str(item) + ']/span[1]/span[1]/span[1]/span[2]/a'
        print(vez)

        # Access the direct link and click
        element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, vez)))
        element.click()

        # Run tests to get data
        try:
            num_unico = driver.find_element_by_xpath('//*[@id="idProcessoDetalhesBloco1"]/div[6]/span[2]/a').text
        except NoSuchElementException:
            num_unico = "sem_numero_unico"

        try:
            nome_proc = driver.find_element_by_xpath('//*[@id="idSpanClasseDescricao"]').text
        except NoSuchElementException:
            nome_proc = "sem_nome_encontrado"

        try:
            data_autu = driver.find_element_by_xpath('//*[@id="idProcessoDetalhesBloco1"]/div[5]/span[2]').text
        except NoSuchElementException:
            data_autu = "sem_data_encontrada"

        # Fills dictionary and list
        dicionario = {"num_unico": num_unico,
                      "nome_proc": nome_proc,
                      "data_autu": data_autu
                                 }
        processos.append(dicionario)

        # Return a page to click on next process
        driver.execute_script("window.history.go(-1)")

# Close driver
driver.quit()

В этом случае я захватил количество страниц ссылок (3) и общее количествоссылок (84). Поэтому моя первоначальная идея состояла в том, чтобы сделать «for» три раза, и внутри них разделить 84 ссылки

Прямой адрес каждой ссылки указан в XPATH (// * [@ id = "idBlocoInternoLinhasProcesso"] / div [41] / span [1] / span [1] / span [1] / span [2] / a), который я заменяю на «элемент», нажимая

Например, когда он достигает номера 42У меня есть ошибка, потому что первая страница только до 41

Моя проблема заключается в том, как перейти на вторую страницу и затем перезапустить только "для" вторичного

Я думаю, что идеальным было бызнаете точное количество ссылок на каждой из трех страниц

У кого-нибудь есть идеи?

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Вы можете попробовать запустить цикл, пока следующая кнопка не появится на экране. логика будет выглядеть так:

try:
    next_page = driver.find_element_by_class_name('classSpanPaginacaoProximaPagina')
    if(next_page.is_displayed()):
        next_page.click()

except NoSuchElementException:
     print('next page does not exists')  
1 голос
/ 16 октября 2019

Код, приведенный ниже: «Режим захвата»:

wait = WebDriverWait(driver, 20)

#...    

while True:
    links = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//span[contains(@class,'classSpanNumeroRegistro')]")))
    print("links len", len(links))
    for i in range(1, len(links) + 1):
        # Access the direct link and click
        .until(EC.element_to_be_clickable((By.XPATH, f"(//span[contains(@class,'classSpanNumeroRegistro')])[{i}]//a"))).click()

        # Run tests to get data
        try:
            num_unico = driver.find_element_by_xpath('//*[@id="idProcessoDetalhesBloco1"]/div[6]/span[2]/a').text
        except NoSuchElementException:
            num_unico = "sem_numero_unico"

        try:
            nome_proc = driver.find_element_by_xpath('//*[@id="idSpanClasseDescricao"]').text
        except NoSuchElementException:
            nome_proc = "sem_nome_encontrado"

        try:
            data_autu = driver.find_element_by_xpath('//*[@id="idProcessoDetalhesBloco1"]/div[5]/span[2]').text
        except NoSuchElementException:
            data_autu = "sem_data_encontrada"

        # Fills dictionary and list
        dicionario = {"num_unico": num_unico,
                      "nome_proc": nome_proc,
                      "data_autu": data_autu
                      }
        processos.append(dicionario)

        # Return a page to click on next process
        driver.execute_script("window.history.go(-1)")

    # wait.until(EC.presence_of_element_located((By.CLASS_NAME, "classSpanPaginacaoImagensDireita")))
    next_page = driver.find_elements_by_css_selector(".classSpanPaginacaoProximaPagina")
    if len(next_page) == 0:
        break
    next_page[0].click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...