Похоже, ./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