Использование расширений с 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
расширение.
У меня уже было расширение в моем хроме. Ниже приведены шаги, которые я выполнил, чтобы упаковать существующее расширение.
- Нажмите на свое расширение "подробности". В моей версии Chrome он был включен
right top click (3 dots) -> 'More tools' -> 'Extensions'.
- Включите режим разработчика в вашем Chrome
- Нажмите "Упаковать расширение" (как показано выше) и упакуйте его.
- Это будет сохранено в расположении расширений. Для меня это было на
/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
Поместите файл extension.crx.crx в ту же папку, что и ваш код, или укажите путь
вы можете скопировать и вставить этот код и просто изменить имя файла 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» перед строкой, чтобы сделать ее необработанной, иначе мне пришлось бы удвоить обратную косую черту.
И это работает!