Ошибка поиска элемента с Selenium в результате веб-формы - PullRequest
1 голос
/ 24 января 2020

Может ли кто-нибудь помочь мне в этом коде?

Я пытаюсь заставить этот скребок произойти, но у меня возникли небольшие проблемы с завершением этой части:

driver.find_element_by_id("Cpf").send_keys(sheet.cell(row=Count, column=2).value, Keys.RETURN)

results = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "table[class*='table table-striped table-bordered dataTable'] > tbody > tr[class*=odd]")))
resultado_cnpc = results[0].text.strip() if "EmptyDataRow" in results[0].get_attribute("class") else results[0].find_element_by_xpath("./td[1]").text.strip()
resultado_nome = results[0].text.strip() if "EmptyDataRow" in results[0].get_attribute("class") else results[0].find_element_by_xpath("./td[2]").text.strip()
resultado_registro = results[0].text.strip() if "EmptyDataRow" in results[0].get_attribute("class") else results[0].find_element_by_xpath("./td[3]").text.strip()
resultado_uf = results[0].text.strip() if "EmptyDataRow" in results[0].get_attribute("class") else results[0].find_element_by_xpath("./td[4]").text.strip()
resultado_inclusao = results[0].text.strip() if "EmptyDataRow" in results[0].get_attribute("class") else results[0].find_element_by_xpath("./td[5]").text.strip()

На этой веб-странице : http://www1.cfc.org.br/sisweb/Registro/ConsultaCNPC с этими данными во втором поле: 336.174.128-90

Я получаю эту ошибку:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"./td[2]"}

Я все еще новичок в python

Ответы [ 2 ]

3 голосов
/ 24 января 2020

Похоже, ./td[2] выбрасывает NoSuchElementException в случае, когда в <tr class='odd'> находится только один элемент td. Это происходит в тех случаях, когда в таблице нет результатов.

Эту проблему можно решить, проверив количество дочерних элементов перед вызовом driver.find_element_by_xpath("./td[2]"). Я бы реорганизовал этот код для большей ясности в сценарии, где есть результаты поиска, а не результаты поиска.

Кроме того, я заметил, что некоторые результаты поиска показывают <tr class='odd'>, а другие <tr class='even'>. Я не уверен, что вы намеревались исключить строки класса even, поэтому я включу образец для обоих.

В следующем примере выполняется поиск с использованием поля 'CPF', а затем ожидание появления строк результатов. Код перебирает строки результата и печатает текст ячейки. Если в таблице нет результатов, l oop прервется.

driver = webdriver.Chrome()
driver.get("http://www1.cfc.org.br/sisweb/Registro/ConsultaCNPC")

wait = WebDriverWait(driver, 30)

# search in CPF
wait.until(EC.presence_of_element_located((By.ID, "Cpf"))).send_keys("336.174.128-90" + Keys.ENTER)

# use this XPath to wait on all rows in the table -- rows are either class='odd' or class='even'
results = wait.until(EC.visibility_of_all_elements_located((By.XPATH, "//tr[@class='odd'] | //tr[@class='even']")))

# optional: use below line to exclude 'even' rows:
#results = wait.until(EC.visibility_of_all_elements_located((By.XPATH, "//tr[@class='odd']")))

# loop through result rows
for result in results:

    # get child td elements under this row
    child_elements = result.find_elements_by_xpath("td")

    # if there is only one td child element, then no results are present in the table
    if len(child_elements) == 1:
        print("No results returned")
    else:

        # if row has child elements, loop through elements and print text
        for child in child_elements:
            print(child.text)

Вывод теста, который я провел:

420
FRANCISCO ANTONIO PARADA VAZ FILHO
SP-253063 / O
CRC-SP
17/06/2016
Detalhes
0 голосов
/ 24 января 2020

Чтобы получить все столбцы для первой строки, вы можете использовать //table[@id='table-cnpc']//tr[1]//td[not(@class='dataTables_empty')] xpath. Этот xpath также содержит пустые результаты.

row = wait.until(EC.visibility_of_element_located(
    (By.XPATH, "//table[@id='table-cnpc']/tbody/tr[1]")))

results = row.find_elements_by_xpath(".//td[not(@class='dataTables_empty')]")
# or css selector
# results = row.find_elements_by_css_selector("td:not(.dataTables_empty)")
if results:
    resultado_cnpc = results[0].text.strip()
    resultado_nome = results[1].text.strip()
    resultado_registro = results[2].text.strip()
    resultado_uf = results[3].text.strip()
    resultado_inclusao = results[4].text.strip()
else:
    print("Não existe registro")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...