Исключение Selenium WebDriverException, когда self.driver_.get(«http://www.stockbroking.com.my»)

#python #docker #selenium #selenium-webdriver #synology

Вопрос:

У меня есть бот для покупки акций Кена*** (Кен*** — брокерская фирма), получивший название «Кенбот», который работает уже год, и я потратил большую часть времени, пытаясь устранить ошибки. До недавнего времени у меня была новая обратная связь, на которой я зашел в тупик. Это происходит только изредка в некоторые дни и не в другие.

Kenbot работает через мой NAS Synology на изображении докера (selenium/автономный-chrome:последняя версия) каждое утро перед открытием рынка он размещает заказы на несколько акций. Он работает через Селен.

Прямо сейчас у меня нет другого решения, кроме как создать декоратора @retry, который будет повторно размещать заказы на акции, если возникнет исключение WebDriverException.

Как мне решить эту проблему?

 Traceback (most recent call last):
  File "/volume1/homes/admin/Drive/stock/order/downloadContractNote.py", line 23, in main
    with docker_selenium() as _, Kenbot(headless=True) as bot:
  File "/volume1/homes/admin/Drive/stock/logs/logger.py", line 58, in wrapper
    return func(*args, **kwargs)
  File "/volume1/homes/admin/Drive/stock/order/kenbot.py", line 100, in __init__
    self.bot.login()
  File "/volume1/homes/admin/Drive/stock/order/kenbot.py", line 70, in f_retry
    return f(*args, **kwargs)
  File "/volume1/homes/admin/Drive/stock/order/kenbot.py", line 176, in login
    self.driver_.get("http://www.stockbroking.com.my")
  File "/volume1/homes/admin/venv/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 333, in get
    self.execute(Command.GET, {'url': url})
  File "/volume1/homes/admin/venv/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/volume1/homes/admin/venv/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: net::ERR_NAME_NOT_RESOLVED
  (Session info: headless chrome=94.0.4606.81)
 

Комментарии:

1. Здравствуйте, не могли бы вы добавить код, который вы использовали, чтобы мы могли вам помочь?

2. Вы пытались отладить программу? Например, ошибка подразумевает, что попытка self.driver_.get("http://www.stockbroking.com.my") не удалась. Вы проверяли, доступен ли веб-сайт и находится ли он в Сети в то время, когда это происходит? Заметили ли вы какую-либо закономерность в том, когда он выходит из строя? Вы пробовали использовать поисковую систему для поиска сообщения об ошибке? Вы пробовали читать документацию по Селену?

Ответ №1:

Предполагается, что вы используете docker-compose, вы можете добавить IP-адрес www.stockbroking.com.my :

 ...
services:
  <app>:    
    extra_hosts:
    - "www.stockbroking.com.my:<add IP address here>"
...
 

Или, docker run --add-host www.stockbroking.com.my:<add IP address here> ...

Или с помощью Python docker SDK, как показано в комментарии:

контейнер = клиентом.контейнеры.запустить(‘селен/автономный-хром’, пользователь = ‘корень’, отсоединить=правда, auto_remove=true, то среда = [«ТЗ=Азия/Kuala_Lumpur»], порты={‘4444/TCP для’:(‘127.0.0.1’,4444)}, extra_hosts={‘www.stockbroking.com.my’: ‘999.99.99.999’}, привилегированных = истина)

Комментарии:

1. Не докер-сочиняй. «‘контейнер = клиент.контейнеры.запуск(‘selenium/автономный-chrome’, пользователь = ‘root’, отсоединение=True, auto_remove=True, среда = [«TZ=Азия/Куала_Лумпур»], порты={‘4444/tcp’:(‘127.0.0.1’,4444)}, привилегированный = True)»» Что делает —рекламный хост?

2. Он вставляет «www.stockbroking.com.my» с соответствующим IP — адресом в файле хостов контейнера, чтобы selenium мог разрешить имя во время выполнения. То же самое можно сделать с помощью python docker sdk extra_hosts

3. Вот что я сделал « контейнер = клиент.контейнеры.запуск(‘selenium/автономный-chrome’, пользователь = ‘root’, отсоединение=True, auto_remove=True, среда = [«TZ=Азия/Куала_Лумпур»], порты={‘4444/tcp’:(‘127.0.0.1’,4444)}, дополнительные хосты={‘www.stockbroking.com.my/’: ‘999.99.99.999’}, привилегированный = True)«

4. Удалите обратную косую extra_hosts={'www.stockbroking.com.my': '999.99.99.999'} черту . Это уже работает?

5. Попробуйте принять к сведению IP nslookup www.stockbroking.com.my -адрес . Когда он снова выйдет из строя, выполните nslookup и сравните IP-адрес. Если он продолжает меняться, вам нужно найти способ использовать статический IP-адрес для этого хоста, если нет, в вашей сети должен быть DNS-сервер, который может динамически преобразовывать имя в постоянно меняющийся IP-адрес хоста.