Nodriver не принимает исключение, если элемент не найден?Python

Программы на Python
Ответить
Anonymous
 Nodriver не принимает исключение, если элемент не найден?

Сообщение Anonymous »

Я пытаюсь найти элементы на веб-странице и использовал различные методы, включая текст и XPath. Похоже, что опция timeout работает не так, как я ожидал, и никаких исключений не возникает, даже если текст или XPath отсутствуют в HTML-коде веб-сайта. Код ниже показывает, почему я запутался.
Существует три запроса page.find. Первый просто удаляет всплывающее окно с файлами cookie, поэтому его можно игнорировать.
Второй запрос:

Код: Выделить всё

page.find(("emailOrGhin", timeout = 1)
работает, и, как показывают результаты, он выполняется примерно за 0,01 секунды, и это здорово.
У меня есть вопросы по третьему запросу:

Код: Выделить всё

page.find("emailOrGhinnowayjunkXyq", timeout=1)
Как видно из результатов, выполнение этого оператора занимает 1,52 секунды, что превышает указанное время ожидания в 1 секунду. Почему это происходит?
Еще интереснее то, что когда запросу не удается найти соответствующий элемент, исключение (например, ElementNotFound) не создается. Я попробовал и то, и другое, кроме asyncio.TimeoutError и кроме Exception as e, но оператор завершается успешно и возвращает None. Я понимаю, что могу проверить None, но я ожидал, что будет вызвано исключение. К сожалению, я нигде не могу найти список исключений Nodriver.
Я надеюсь на понимание/совет по двум вопросам:
  • Почему опция timeout ведет себя таким образом.
  • Какая ошибка может быть перехвачена, если элемент не найден, поскольку в настоящее время оператор возвращает None.
Вот соответствующий код:

Код: Выделить всё

from datetime import timedelta
from time import sleep
import asyncio
import datetime
import sys
import nodriver as uc

passed_website = "https://www.google.com"

# Main Processing Controller! = Mainline
def a_main_processor():
loop =asyncio.new_event_loop()
print("Line 20")
driver = loop.run_until_complete(b_main_line_processing())
driver.stop()
print("Line 28")
return driver

# Main Line Processing Controller! = Mainline
async def b_main_line_processing():
driver = await uc.start()  # maximize=True) # Start a new Chrome instance
await driver.main_tab.maximize()
sleep(1)

ghin_url = "http://www.ghin.com/lookup.aspx"
try:
page = await driver.get(ghin_url, new_tab=False, new_window=False)
except asyncio.TimeoutError:
print("C100 - error", e)
return driver

# Find and Select Reject All Cookie Settings
try:
cookies = await page.find("Reject All")
await cookies.click()
except asyncio.TimeoutError:
print("C105 - error:0, e")

return driver

# Find UserName Entry field name
try:
timepoint = datetime.datetime.now()
user_name = await page.find("emailOrGhin", timeout = 1)
print("First checkpoint =", str(datetime.datetime.now() - timepoint)[-9:-4], user_name)
except Exception as e:
print("First error took", str(datetime.datetime.now() - timepoint)[-9:-4], e)
return driver

# Pass bogus name to trip error
try:
timepoint = datetime.datetime.now()
user_name = await page.find("emailOrGhinnowayjunkXyq", timeout=1)
print("Second checkpoint =", str(datetime.datetime.now() - timepoint)[-9:-4], user_name)
#except Exception as e:
except asyncio.TimeoutError:
print("Second error took", str(datetime.datetime.now() - timepoint)[-9:-4], e)
return driver

driver = a_main_processor()
print("Line 62")
Результаты:

Код: Выделить всё

Line 20
First checkpoint = 00.01 
Second checkpoint = 01.52 None
Line 28
Line 62
successfully removed temp profile C:\Users\pinev\AppData\Local\Temp\uc_5yaidgqs
Process finished with exit code 0
Веб-сайт работает, и код должен работать.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -not-found
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»