#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")