Использование расширений с Selenium (Python)

В настоящее время я использую Selenium для запуска экземпляров Chrome для тестирования веб-страниц. Каждый раз, когда запускается мой скрипт, запускается чистый экземпляр Chrome (чистый от расширений, закладок, истории просмотров и т. Д.). Мне было интересно, можно ли запустить мой скрипт с расширениями Chrome. Я попытался найти пример Python, но ничего не пришло, когда я гуглил это.

7 ответов

Решение

Вам следует использовать параметры веб-драйвера Chrome , чтобы установить список загружаемых расширений. Вот пример:

import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


executable_path = "path_to_webdriver"
os.environ["webdriver.chrome.driver"] = executable_path

chrome_options = Options()
chrome_options.add_extension('path_to_extension')

driver = webdriver.Chrome(executable_path=executable_path, chrome_options=chrome_options)
driver.get("http://stackru.com")
driver.quit()

Надеюсь, это поможет.

Главный ответ не сработал для меня, потому что я не осознавал, что вам нужно было указывать параметры веб-драйвера на .zip файл.

Т.е. chrome_options.add_extension('path_to_extension_dir') не работает
Тебе нужно: chrome_options.add_extension('path_to_extension_dir.zip')

После выяснения этого и прочтения нескольких постов о том, как создать zip-файл с помощью командной строки и загрузить его в seleniumЕдинственный способ, которым он работал для меня, заключался в том, чтобы сжать мои файлы расширений в том же скрипте Python. На самом деле это оказалось хорошим способом автоматического обновления любых изменений, которые вы могли внести в свое расширение:

import os, zipfile
from selenium import webdriver

# Configure filepaths
chrome_exe = "path/to/chromedriver.exe"
ext_dir = 'extension'
ext_file = 'extension.zip'

# Create zipped extension
## Read in your extension files
file_names = os.listdir(ext_dir)
file_dict = {}
for fn in file_names:
    with open(os.path.join(ext_dir, fn), 'r') as infile:
        file_dict[fn] = infile.read()

## Save files to zipped archive
with zipfile.ZipFile(ext_file), 'w') as zf:
    for fn, content in file_dict.iteritems():
        zf.writestr(fn, content)

# Add extension
chrome_options = webdriver.ChromeOptions()
chrome_options.add_extension(ext_file)

# Start driver
driver = webdriver.Chrome(executable_path=chrome_exe, chrome_options=chrome_options)
driver.get("http://stackru.com")
driver.quit()

Это связано с тем, что селен ожидает упакованные расширения в качестве аргумента расширения, который будет с .crx расширение.

У меня уже было расширение в моем хроме. Ниже приведены шаги, которые я выполнил, чтобы упаковать существующее расширение.

  1. Нажмите на свое расширение "подробности". В моей версии Chrome он был включенright top click (3 dots) -> 'More tools' -> 'Extensions'.
  2. Включите режим разработчика в вашем Chrome
  3. Нажмите "Упаковать расширение" (как показано выше) и упакуйте его.
  4. Это будет сохранено в расположении расширений. Для меня это было на/home/user/.config/google-chrome/Default/Extensions/fdjsidgdhskifcclfjowijfwidksdj/2.3.4_22.crx

Вот и все, вы можете настроить расширение в своем селене в качестве аргумента.

extension='/home/user/.config/google-chrome/Default/Extensions/fdjsidgdhskifcclfjowijfwidksdj/2.3.4_22.crx'
options = webdriver.ChromeOptions()
options.add_extension(extension)

ПРИМЕЧАНИЕ. Вы также можете найти идентификатор 'fdjsidgdhskifcclfjowijfwidksdj' в URL-адресе расширений в качестве параметра запроса.

Альтернативный способ - использовать метод распакованной папки. Я обнаружил, что методы crx и zip вообще не работают в Selenium Grid. В этом методе вам нужно скопировать расширение из пользовательских данных в версии Chrome, где вы уже установили его вручную, длинный идентификатор, состоящий из множества букв, таких как pehaalcefcjfccdpbckoablngfkfgfgj, в каталог пользовательских данных Chrome, управляемого Selenium ( который вы можете выбрать во время выполнения, используя первую строку этого кода, и он будет заполнен автоматически). Он должен находиться в том же эквивалентном каталоге (который является расширениями). Путь должен вести вас до каталога, в котором находится manifest.json, поэтому в этом примере «1.1.0»

      chrome_options.add_argument("user-data-dir=C:/Users/charl/OneDrive/python/userprofile/profilename"
unpacked_extension_path = 'C:/Users/charl/OneDrive/python/userprofile/profilename/Default/Extensions/pehaalcefcjfccdpbckoablngfkfgfgj/1.1_0'
chrome_options.add_argument('--load-extension={}'.format(unpacked_extension_path))
driver = webdriver.Chrome(options=chrome_options)   

Если вы хотите импортировать любое расширение Chrome в свой скрипт selenium python

  1. Поместите файл extension.crx.crx в ту же папку, что и ваш код, или укажите путь

  2. вы можете скопировать и вставить этот код и просто изменить имя файла crx.crx

    импорт ОС из селена импорт веб-драйвера из селена.webdriver.chrome.options Параметры импорта

    executable_path = "/webdrivers"
    os.environ["webdriver.chrome.driver"] = executable_path
    
    chrome_options = Options()
    
    chrome_options.add_extension('  YOUR - EXTIONTION  - NAME    ')
    
    driver = webdriver.Chrome(chrome_options=chrome_options)
    driver.get("http://stackru.com")
    

если этот код выдает ошибку, возможно, это решит ее

Мне также нужно было добавить расширение к хрому при использовании селена. Я сначала открыл браузер с помощью селена, а затем добавил расширение в браузер обычным способом, как вы это делаете в google chrome.

Я нашел самый простой способ.

Так что никакие способы у меня не работали, я пытался сделать файл crx и многое другое, но ничего не получилось. Поэтому я просто добавил распакованный путь расширения следующим образом:

      options.add_argument('--load-extension={}'.format("HERE YOUR EXTENSION PATH"))

Замените ЗДЕСЬ ВАШ ПУТЬ РАСШИРЕНИЯ на путь вашего расширения, который находится в одном из ваших профилей Chrome. Чтобы найти его, используйте этот путь в Windows:C:\Users[login_name]\AppData\Local\Google\Chrome\User Data\Default\Extensions

Затем вам нужно выбрать папку расширения, это по идентификатору, который вы можете найти в https://chrome.google.com/webstore/category/extensions, просто введите там имя вашего расширения, и в URL-адресе вы получите идентификатор. Потом там в этой папке будет версия ваших расширений типа: 10.0.3 выбираем и это будет ваш путь, значит путь должен заканчиваться версией.

Пример:

      options.add_argument('--load-extension={}'.format(r'C:\Users\nevo\AppData\Local\Google\Chrome\User Data\Default\Extensions\nkbihfbeogaeaoehlefnkodbefgpgknn\10.20.0_0'))

Обратите внимание на «r» перед строкой, чтобы сделать ее необработанной, иначе мне пришлось бы удвоить обратную косую черту.

И это работает!

Другие вопросы по тегам