Python Selenium не находит chromedriver

#python #python-3.x #selenium #selenium-webdriver #selenium-chromedriver

#питон #python-3.x #селен #селен-веб-драйвер #селен-хромированный привод

Вопрос:

Я пытаюсь научиться веб-скребку с помощью Python и Selenium. Тем не менее, я получал сообщение об ошибке FileNotFoundError: [Errno 2] No such file or directory: 'chromedriver' , и я на 100% уверен, что файл расположен по пути, который я указал, так как раньше я пробовал использовать гораздо более простой подход, и все работало нормально.

Это мой код прямо сейчас;

 class Booking(webdriver.Chrome):  def __init__(self, driver_path=r"/Users/username/Desktop/SeleniumDriver/chromedriver"):  self.driver_path = driver_path  os.environ["PATH"]  = r"/Users/username/Desktop/SeleniumDriver"  super(Booking, self).__init__()   def land_first_page(self):  self.get("https://website.com")   inst = Booking() inst.land_first_page()  

Я пробовал разные пути с/без r в качестве префикса, а также /chromedriver с расширением exe или без него. Кажется, ничего не работает. Я получаю ошибку, о которой я упоминал выше, при создании экземпляра класса бронирования

Вместо использования ООП, если я использую веб-драйвер таким образом;

 os.environ["PATH"]  = r"/Users/username/Desktop/SeleniumDriver"  driver = webdriver.Chrome("/Users/username/Desktop/SeleniumDriver/chromedriver") driver.get("https://website.com")  

Это работает и не дает мне никаких ошибок, но я бы предпочел использовать подход ООП, так как мне гораздо понятнее с ним работать, особенно при создании ботов

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

1. убедитесь, что ваши хромированные драйверы находятся на вашем пути.

2. Я бы избегал использования классов, если бы просто пытался узнать, как работает селен. driver=webdriver.Chrome("r"/Users/username/Desktop/SeleniumDriver/chromedriver.exe") тогда driver.get("https://website.com") будет работать просто отлично

3. Какую ОС вы используете?

4. macOS Монтерей @DebanjanB

5. @God-статус да, это так; пожалуйста, проверьте отредактированный вопрос

Ответ №1:

Если вы используете Mac/Linux, расположение в порядке

 /Users/username/Desktop/SeleniumDriver/chromedriver  

Если вы используете Windows, вам может потребоваться указать с фактического диска

 C:/Users/username/Desktop/SeleniumDriver/chromedriver  

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

1. да, я использую Mac, и если я не использую подход ООП, путь работает нормально, но когда я создаю экземпляр класса бронирования, он выдает ошибку

Ответ №2:

Вы можете попробовать этот хак, изменив эту строку

 super(Booking, self).__init__()  

к этому

 super(Booking, self).__init__(driver_path)  

Ответ №3:

Если посмотреть исходный код __init__ метода, то там нет инициализированных переменных экземпляра. Под этим я подразумеваю, например, что нет ничего подобного self.driver_path = "path" .

 def __init__(self, executable_path="chromedriver", port=0,  options=None, service_args=None,  desired_capabilities=None, service_log_path=None,  chrome_options=None, keep_alive=True):  """  Creates a new instance of the chrome driver.   Starts the service and then creates new instance of chrome driver.   :Args:  - executable_path - path to the executable. If the default is used it assumes the executable is in the $PATH  - port - port you would like the service to run, if left as 0, a free port will be found.  - options - this takes an instance of ChromeOptions  - service_args - List of args to pass to the driver service  - desired_capabilities - Dictionary object with non-browser specific  capabilities only, such as "proxy" or "loggingPref".  - service_log_path - Where to log information from the driver.  - chrome_options - Deprecated argument for options  - keep_alive - Whether to configure ChromeRemoteConnection to use HTTP keep-alive.  """  if chrome_options:  warnings.warn('use options instead of chrome_options',  DeprecationWarning, stacklevel=2)  options = chrome_options   if options is None:  # desired_capabilities stays as passed in  if desired_capabilities is None:  desired_capabilities = self.create_options().to_capabilities()  else:  if desired_capabilities is None:  desired_capabilities = options.to_capabilities()  else:  desired_capabilities.update(options.to_capabilities())    self.service = Service(  executable_path,  port=port,  service_args=service_args,  log_path=service_log_path)  self.service.start()   try:  RemoteWebDriver.__init__(  self,  command_executor=ChromeRemoteConnection(  remote_server_addr=self.service.service_url,  keep_alive=keep_alive),  desired_capabilities=desired_capabilities)  except Exception:  self.quit()  raise  self._is_remote = False   def launch_app(self, id):  """Launches Chrome app specified by id."""  return self.execute("launchApp", {'id': id})   def get_network_conditions(self):  """  Gets Chrome network emulation settings.   :Returns:  A dict. For example:   {'latency': 4, 'download_throughput': 2, 'upload_throughput': 2,  'offline': False}   """  return self.execute("getNetworkConditions")['value']  

Таким образом, в вашем коде строка self.driver_path = driver_path ничего не делает. Он задает переменную экземпляра, которая не используется родительским классом.

Вы можете передать путь в инструкции super, чтобы он работал:

 super().__init__(executable_path = "/Users/username/Desktop/SeleniumDriver/chromedriver")