В селене, как избежать ошибки TimeoutException после нескольких попаданий в последовательности? - 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'

        # Access the direct link and click
        time.sleep(2)
        WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, vez))).click()
        time.sleep(1)

        # 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()

После примерно 30 обращений к прямым ссылкам с информацией о каждом процессе у меня есть этоошибка:

---------------------------------------------------------------------------
TimeoutException                          Traceback (most recent call last)
<ipython-input-10-a901a514bd82> in <module>
     16 
     17         time.sleep(2)
---> 18         WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, vez))).click()
     19         time.sleep(1)
     20 

~/Documentos/Code/publique_se/lib/python3.6/site-packages/selenium/webdriver/support/wait.py in until(self, method, message)
     78             if time.time() > end_time:
     79                 break
---> 80         raise TimeoutException(message, screen, stacktrace)
     81 
     82     def until_not(self, method, message=''):

TimeoutException: Message: 

Судя по всему, сайт работает медленно и скрипт выдает ошибку, потому что не может найти информацию, верно?

Пожалуйста, на сайтах, где селен пересекает несколько страниц, естьМожно ли избежать такого рода ошибок?

Может ли сам сайт замедляться при последовательном восприятии обращений?

1 Ответ

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

Вы используете потоки для ожидания, что не является хорошим способом, и вызывают ошибки, поскольку вы получаете

, который вы используете time.sleep(2), вместо этого используйте явные ожидания селена

Пример:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "myXpath")))

element.click();

Примечание. Вам нужно изменить время с 20 на время, указанное в вашей заявке, приблизительно в 10 * раз, когда вы наблюдаете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...