Загрузить расширение Chrome с помощью селена

Все, что я хочу, это загрузить расширение Chrome из интернет-магазина. Я много искал, чтобы понять это, но только узнал, что мы можем загрузить расширение с локальной машины. Мне действительно интересно, если у селена нет функциональности для загрузки расширения из интернет-магазина или из URL.

Пожалуйста, дайте мне знать, что я пытаюсь использовать селен?

9 ответов

Я сделал это с Python на тот случай, если кто-то ищет.

Все, что вам нужно сделать, это загрузить файл.crx (я использовал https://chrome-extension-downloader.com/) и сохранить его где-нибудь, чтобы Python мог получить к нему доступ. В моем примере я импортировал его в ту же папку, что и мой скрипт Python, чтобы загрузить exampleOfExtensionDownloadedToFolder.crx.

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

options = webdriver.ChromeOptions()
options.add_extension('./exampleOfExtensionDownloadedToFolder.crx')
driver = webdriver.Chrome(chrome_options=options) 
driver.get('http://www.google.com')

Я не уверен, почему вы особенно заинтересованы в загрузке из интернет-магазина и последующей установке в Chrome.

Я нашел несколько шагов для загрузки расширений Chrome:

-С помощью компьютера, подключенного к Интернету, установите расширение со страницы расширения: https://chrome.google.com/webstore/detail/
- Перейдите к расширению исходного кода. В XP это находится по адресу: C: \ Documents and Settings \\ Local Settings \ Application Data \ Google \ Chrome \ User Data \ Default \ Extensions \
-Вы должны увидеть папку с версией (т. Е. "0.0.21_0"). Скопируйте эту папку и переместите ее на компьютер, на который хотите установить.
-Открой хром на отключенном станке и зайди в гаечный ключ -> Инструменты -> Расширения
-Нажмите + рядом с режимом разработчика, чтобы отобразить параметры разработчика
-Нажмите "Pack extension..." и выберите папку версии в качестве корневого каталога. Оставьте файл закрытого ключа пустым. Это создаст файл.crx в папке версии вместе с закрытым ключом, как если бы вы были разработчиком.

--Или же--

1. Найдите идентификатор интересующего вас расширения. На странице сведений о расширении это будет что-то вроде: bfbmjmiodbnnpllbbbfblcplfjjepjdn после https://chrome.google.com/webstore/detail/

2- Вставьте это в любой другой браузер (кроме Chrome): https://clients2.google.com/service/update2/crx?response=redirect&x=id%3D~~~~%26uc

3- и замена ~~~~ идентификатором расширения. Вам будет предложено сохранить файл CRX. Перетащите этот файл в окно Chrome и продолжите установку.

Источник: https://productforums.google.com/forum/

Наконец, используйте загруженный файл.crx в ChromeOptions, чтобы загрузить расширение.

ChromeOptions options = new ChromeOptions();
options.addExtensions(new File("/path/to/extension.crx"));
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
ChromeDriver driver = new ChromeDriver(capabilities);

Источник: https://sites.google.com/a/chromium.org/chromedriver/extensions

вот как загрузить расширение chrome в chrome Selenium Python

Date = 20-12-19
Версия Chrome = 79.0.3945.88

Новая версия Chrome поддерживает crx.crx (crx3), и если вы используете crx, она выдаст ошибку.
если вы используете Chrome версии 73 или выше, выполните только этот шаг


1> Создайте файл crx3.

1. Зайдите в Интернет-магазин Chrome и найдите расширение, скопируйте ссылку на расширение. Снимок экрана
2. Перейдите на этот сайт, вставьте ссылку и загрузите crx-файл для своего расширения Chrome.
3. Перейдите на эту страницу GitHub и загрузите модуль, который преобразует ваш файл crx в crx3 или crx.crx.
4. Теперь у вас есть файл crx.crx или (crx3).


2> Код Python для добавления расширения Chrome в селен.

1. Поместите файл extension.crx.crx в ту же папку, что и код, или укажите путь
2. Вы можете скопировать и вставить этот код и просто изменить имя файла crx.crx наchrome_options.add_extension(' YOUR - EXTENSION - NAME ')

import os
    from selenium import webdriver
    from selenium.webdriver.chrome.options import 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")
  1. Поместите chromedriver exe в ваш файл документа, если вы хотите следовать этому и иметь успешный результат.

  2. Загрузите расширение "GET CRX" от Google.

  3. Загрузите ваше расширение (т. Е. Мое - "DHS" для тестирования Rest API).

  4. Перейдите в Интернет-магазин Chrome >> найдите расширение (которое вы уже загрузили) >> щелкните его правой кнопкой мыши и выберите:: GET CRX
    (Это должно загрузить файл CRX. Для моего случая файл CRX "extension_1_2_5.crx")

  5. Перетащите файл CRX в любое окно Chrome (это может отклонить его, но не стоит беспокоиться).

  6. Теперь создайте свой тест и выполните

    public static void openChromeExtension(){
    
        System.setProperty("webdriver.chrome.driver", "/Users/[your local name]/Documents/chromedriver");
    
        ChromeOptions options = new ChromeOptions();
        options.addExtensions(new File("/Users/[your local name]/Documents/extension_1_2_5.crx"));
    
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(ChromeOptions.CAPABILITY, options);
        ChromeDriver driver = new ChromeDriver(capabilities);
        System.out.println("Opening extension");
        driver.get("chrome-extension://**aejoelaoggembcahagimdiliamlcdmfm**/dhc.html"); 
    
        driver.navigate().refresh();
        System.out.println("Refresh successfully");
    }
    

    // это URL расширения или вы можете получить идентификатор в chrome://extensions/ найти расширение и скопировать идентификатор. Тем не менее, URL должен быть расширением URL.

Не уверен почему, но кто-то удалил их ответ, который был правильным. Вот содержимое (взято из @parishodak):

ChromeOptions options = new ChromeOptions();
options.addExtensions(new File("/path/to/extension.crx"));
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
ChromeDriver driver = new ChromeDriver(capabilities);

Этот конкретный пример на Java

Вышеуказанные решения, хотя технически обоснованные, не всегда работают как задумано, поэтому я подумал о другом способе сделать это. Потому что много раз мне нужно много вещей, которые лучше сделать вручную, аутентификации, определенные куки и т. Д.

Я использую папки в качестве профилей, я запускаю:

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com")

Затем я вручную устанавливаю расширения и выполняю необходимые мне входы каждый раз, когда запускаю Webdriver с этой папкой, там все есть

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com") #Now you can see the Extensions and the logins done are present

Преимущество заключается в том, что вы можете использовать несколько папок с разными настройками и расширениями без необходимости устанавливать и удалять расширения, изменять настройки, входить в систему и т. Д.

3 способа добавить расширение Chrome (полный скрипт)

      import glob2,itertools,os, pyautogui, shutil, time, pyperclip, subprocess, keyboard as kb
from datetime import datetime
from zipfile import ZipFile

now = datetime.now()
dt_string: str = now.strftime("%d-%b-%Y, %H:%M:%S")
print(dt_string)
from selenium import webdriver
from selenium.webdriver import DesiredCapabilities
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
from concurrent.futures import ThreadPoolExecutor
from os import path
#references: date-time format: https://www.programiz.com/python-programming/datetime/current-datetime

ссылка на дату и время

Метод 1: добавить после запуска Chrome через Chrome-store

      def ext_update_method1(ps, section=''):

global w, p2s
text_temp, p2s =  [''] * len(ps), []

def button_click(p, parms = ['',True]):
    #parms[0] = ID, parms[1] = click?
    ID,click = parms[0], parms[1]
    global text_temp
    text_temp[p] = ''
    ID = ['omghfjlpggmjjaagoclmmobgdodcjboh'] if ID == '' else ID #default i= Browsec if no ID entered
    d[p].get(f'https://chrome.google.com/webstore/detail/{ID[0]}')
    w[p] = WebDriverWait(d[p], 10)
    w[p].until(lambda x: x.execute_script("return document.readyState") == "complete")
    button = w[p].until(lambda x: x.find_element_by_class_name('g-c-R'))
    text_temp[p] = button.text
    if click == True:  button.click()

def add_remove():
    global p2s
    for i, y in enumerate(ys):  activ(i, ys), (ss, 0.5), keys([(pr, 'tab'), (pr, 'space')])
    after2, ys2 = gwwt(''), []
    for x in after2:
        if (x not in before) and (x not in ys_remove): ys2 = ys2 + [x, ]
    #    ys2 = ys2 + [x,] if (all(x not in before) and (x not in ys_remove)) else ys2
    for i, y in enumerate(ys2): activ(i, ys), (ss, 0.5), keys([(pr, 'tab'), (pr, 'space')])
    ss(1)
    after2, ys2 = gwwt(''), []
    for x in after2:
        if (x not in before) and (x not in ys_remove) and (x not in a[0] for a in wd): ys2 = ys2 + [x, ]
    for i, y in enumerate(ys2):
        if all(y != x[0] for x in wd): y.close()
    if len(ys_remove) > 0:
        for i, y in enumerate(ys_remove):
            activ(i, ys_remove), pr('space'), ss(0.5)
            p2s = p2s + [i, ]
        if section == 1:
            return 'complete 2nd iteration' #prevent endless loop (see next comment)
        else:
            print('removed add-in, now adding back again....')
            cc(2)
            thread_all(ps, close_extra)
            ext_update_method1(p2s, 1) #loop back on self to add
    else:
        return 'complete 1st iteration'

def close_extra(p):
    global w
    w_old = w[p]
    w[p] = WebDriverWait(d[p], 10)
    tabs_close_extra(p)
    tabs_close_extra(p)
    activ(p), pr('a'), activ(p), pr('enter')
    w[p].until(lambda x: x.execute_script("return document.readyState") == "complete")
    w[p] = w_old

thread_all(ps, tabs_close_extra)
before = gwwt('')
thread_all(ps, button_click)
cc(2) #cc(5)
after = gwwt('')
ys, ys_remove, p2s = [], [], []
ys_remove = gwwt('remove')
print(f'ys_remove = {ys_remove}')
for x in after:
    if (x not in ys_remove) and (x not in before): ys = ys + [x, ]
print(add_remove())
cc(2)
thread_all(ps, close_extra)
thread_all(ps,button_click,['',False])
qs = []
for x in text_temp: qs = qs + [1,] if 'add' in x.lower() else qs
print(f'qs: {qs}')
if section == 2: return #prevent never-ending loop (see next comment)
if len(qs) > 0: ext_update_method1(qs,2) #loop back on self in case 'add extension' still present in web-store

Примечания: можно загрузить несколько версий одного и того же расширения в один и тот же браузер.

  1. Внимание: 3-й параметр в n_i_c по умолчанию установлен на 1: это очистит вашу папку загрузок. Установите 0, если этого не хотите.
  2. Аргументы:
    • args: n_i_c [0] = количество раз, которое вы хотите загрузить данное расширение в тот же браузер.
    • n_i_c 1 = элемент глобального списка: ext_details, см. vars () n_i_c 2 = 1, чтобы очистить папку
    • n_i_c 3= 0 => загружать только распакованную папку (не загружая ее тоже)
    • Требуются приведенные ниже методы ('nice to have', vars) - код можно изменить, чтобы исключить их.

Способ 2. Загрузите и загрузите файл .crx после запуска Chrome

      def ext_update_method2(ps, n_i_c=[2, 0, 1,1], section = ''):  # same order as it would 

appear for single set of extensions (iro one tab)...
        # parms = [2,0,0,0] =>
        # 0. repetitions - e.g. 2 downloads : uBlock
        # 1. 0 [index value - e.g.  uBlock  = 4, below] downloaded and unzipped/installed on profile p
        # 2: clear folder
        # 3: is_load  = 0 => only download unpacked folder (not loading it too)

    global start, w, files_old, ev, d, parent, txt
    global tabs_before
    global files, files_new, index_latest_files, index_redo, index_hks
    hks2, index_ext, clear_folder, is_load = n_i_c[0], n_i_c[1], n_i_c[2], n_i_c[3]  # ID, alias =  cred[0], cred[1], cred[2]
    hks2 = hks if hks == '' else hks2
    ID, alias = ext_details[index_ext][1], ext_details[index_ext][0]
    url_robwu = '''https://robwu.nl/crxviewer/?crx=https://chrome.google.com/webstore/detail/''' + str(ID)
    if clear_folder == 1:
        folder_clear(del_dir=os.path.join(os.path.expanduser("~"), 'Downloads', '*'))
    def thread_all_0(p): #set up stuff
        global d, w, index_hks2
        if 'error' in str(tabs_close_extra(p)):
            tab_close(p)
        d[p].implicitly_wait(5)
        w[p] = WebDriverWait(d[p], 5)
        index_hks2[p] = ''
        d[p].get('chrome://extensions')
        code_0 = '''var tags = document.querySelector('body').querySelector('extensions-manager')['shadowRoot'].querySelector('cr-view-manager').querySelector('extensions-item-list')["shadowRoot"].querySelector('#container').querySelectorAll('extensions-item'); return tags.length;'''
        index_hks[p]=ev[p](code_0)
        print(index_hks[p])
    #
    thread_all(ps, thread_all_0)
    #
    def thread_all_1(p): #open website to download crx (multi-thread to expedite)
        d[p].get(url_robwu)

    #
    if len(ps) >= 2: #prevent overloading website - only do 3 at a time if more than 2 browsers being used
        groups = list(data_mygrouper(2, ps))
        for x in groups: thread_all(x, thread_all_1,workers = 3, chunk = 3)
    else:
        thread_all(ps, thread_all_1)
    files_old = glob2.glob(os.path.join(os.path.expanduser("~"), 'Downloads', '*.zip'))
    def thread_all_2(p):
        try:
            w[p].until(lambda x: x.find_element_by_id("download-link")).click()
            print('lambda wait passed !!')
        except:
            print('lambda wait failed :(')
            return
    start_temp = time.time()
    while (time.time() - start_temp <= 90) and (len(glob2.glob(os.path.join(os.path.expanduser("~"), 'Downloads', '*.zip'))) -  len(files_old) < hks2 * (len(ps))) or (kb.is_pressed('escape') == True):
        if kb.is_pressed('escape') == True: break
        thread_all(ps, thread_all_2), ss(1)
    files = glob2.glob(os.path.join(os.path.expanduser("~"), 'Downloads', '*.zip'))
    files_new = []
    for keep in files:
        if str(keep) not in files_old: files_new = files_new + [str(keep), ]
    # thread_all(files_new, z_extension_unzip, alias)
    path_dir_core = os.path.join(os.path.expanduser("~"), 'Downloads')
    index_latest_files = [''] * len(files_new)
    #
    def thread_all_3(j):  # unzip
        global index_latest_files
        index_latest_files[j] = os.path.join(path_dir_core, alias + str(j))
        with ZipFile(files_new[j], 'r') as zipObj:
            zipObj.extractall(index_latest_files[j])
        os.remove(files_new[j])
    #
    thread_all(list(range(len(files_new))), thread_all_3)
    if is_load != 1: return
    code1 = '''if(document.querySelector('body').querySelector('extensions-manager')["shadowRoot"].querySelector('extensions-toolbar').attributes.length !=2){document.querySelector("body").querySelector("extensions-manager")["shadowRoot"].querySelector("extensions-toolbar")["shadowRoot"].querySelector("cr-toolbar").querySelector(".more-actions").querySelector("#devMode")["shadowRoot"].querySelector("#knob").click() } else {'dev mode already activated!'}'''
    code2 = '''document.querySelector('body').querySelector('extensions-manager')["shadowRoot"].querySelector('extensions-toolbar')["shadowRoot"].querySelector("#loadUnpacked").click()'''
    #
    def thread_all_4(p):
        d[p].get('chrome://extensions/'), ss(1)
        ev[p](code1)
    for y in range(hks2):
        thread_all(ps, thread_all_4)
        windows_before = gwwt('Select the extension directory')
        for p in ps:
            try:
                if path.exists(os.path.join(path_dir_core, index_latest_files[p + len(ps) * (y)])):
                    try:
                        ev[p](code2)
                    except:
                        continue
                    start_temp = time.time()
                    while (time.time() - start_temp <= 30) and (
                            len(gwwt('Select the extension directory')) - len(windows_before)) < 1 and (
                            'select the extension directory' not in gawt().lower()): pass  # len(ps) - len(errors_chrome()): pass
                    tabs_before = len(d[p].window_handles)
                    windows_A = gwwt('')
                    try:
                        keys([(tw, index_latest_files[p + len(ps) * (y)]), (ss, 0.5), (pr, 'enter'), (pr, 'tab'),(pr, 'space')], 0.75)
                        if len(windows_A) < len(gwwt('')):
                            d[p].refresh()
                            print('would break1')
                        else:
                            window_target = gwwt('Select the extension directory')[0]
                            try:
                                window_target.activate()
                            except:
                                window_target.minimize()
                                window_target.restore()
                            finally:
                                pyperclip.copy(index_latest_files[p  + len(ps) * (y)]), ss(0.5)
                                keys([(hk, 'ctrl', 'l'), (kd, 'shift'), (pr, 'tab', 4), (ku, 'shift'), (hk, 'ctrl', 'v'), (pr, 'enter'), (pr, 'tab'), (pr, 'space')])
                    except:
                        d[p].refresh()
                        pr('escape', 2)
                        print('would break2')
                    tabs_close_extra(p)
                else:  continue
            except:  continue
    def thread_all_5(p):
        global qs
        d[p].get('chrome://extensions/shortcuts')
        code_0 = '''return document.querySelector('body').firstElementChild["shadowRoot"].querySelector("cr-view-manager").querySelector('extensions-keyboard-shortcuts')['shadowRoot'].querySelector('#container').querySelectorAll('.shortcut-card').length'''
        index_hks[p] = int(ev[p](code_0)) - index_hks[p]
        qs = qs + [p,] if index_hks[p] < hks2 else qs
        print(f'index_hks[{p}] = {index_hks[p]}')
        index4[p] = 0
    qs = []
    if clear_folder == 1:
        thread_all(ps, thread_all_5)
    if section == 1: return
    if len(qs) > 0:  ext_update_method2(qs, n_i_c = [hks2, index_ext, 0, 1], section = 1)
    qs = []
    for p in range(len(ps)): qs = qs + [p,]

Метод 3: нормальный / лучший способ (то есть при создании экземпляра драйвера Chrome)

      def new_profile(p, section=''):
    global d, parent, ev, hs, start, index,index2
    #
    def new_profile_support(p):
        global index
        index[p] = f'x{p}' if p <= 9 else f'y{p}'
        try:  d[p].get('https://'+index[p])
        except:  pass
        # try:   ev[p]('''open('https://''' +  index[p] + '''')''')
        # except:  pass
        return  gwwt(index[p])

    caps2 = caps.copy()
    caps2["pageLoadStrategy"] = "eager"
    o = Options()  # webdriver.ChromeOptions()
    o = options_get(p, o)
    # temp_str = f'https://x{p}' if p < 10 else f'https://y{p}'
    d[p] = webdriver.Chrome(options=o, executable_path=path_exec, desired_capabilities=caps2)
    # d[p].set_network_conditions(offline = True, latency = 100000, download_throughput = 0, upload_throughput = 0)

    index2[p] = d[p].window_handles
    for h in index2[p]:
        d[p].switch_to.window(h)
        if 'data' in d[p].current_url.lower():
            parent[p], [ev[p]] = h, [d[p].execute_script]
            break

    start[p] = time.time()
    url_kargs = ['installed','congratulations']
    url_kargs2= []
    while (time.time() - start[p] < 60): #close annoying 'thank you for installing' tabs
        if len(url_kargs2) >= 2: break
        for h in d[p].window_handles:
            if h != parent[p]:
                d[p].switch_to.window(h)
                for i, x in enumerate(url_kargs):
                    if x.lower() in d[p].current_url.lower():
                        #d[p].close()
                        d[p].close()
                        #ev[p]('''close()''')
                        url_kargs.pop(i)
                        url_kargs2.append(x)
                        d[p].switch_to.window(parent[p])


        restore_support(p) #for issues re: installing extension through 'ordinary' options method
        [ev[p]] = [d[p].execute_script]
        wd[p] = new_profile_support(p) #assign windows for switching

        


def restore_support(p):
    global p2s
    # d=webdriver.Chrome()
    # p2s = ['']*L
    p2s[p] = ''
    global parent, ev, w2
    try:
        for h in d[p].window_handles:
            d[p].switch_to.window(h)
            parent[p], [ev[p]], w2[p] = h, [d[p].execute_script], WebDriverWait(d[p], 2)
            p2s[p] = p
            return True
    except:
        return False


def options_get(p, o):
    # https://stackoverflow.com/questions/51320322/how-to-disable-site-isolation-in-google-chrome
    opts = [
        "--disable-sync",
        "--no-first-run",
        "--no-crash-upload",
        "--disable-breakpad",
        "--disable-translate",
        "--disable-default-apps",
        "--disable-hang-monitor",
        "--allow-nacl-socket-api",
        "--disable-dev-shm-usage",
        "--disable-restore-state",
        # "--restore-last-session=0",
        "--disable-popup-blocking",
        "--metrics-recording-only",
        "--disable-blink-features",
        "--disable-prompt-on-repost",
        "--disable-restore-session-state",
        "--disable-background-networking",
        "--disable-browser-side-navigation",
        "--safebrowsing-disable-auto-update",
        "--disable-features=site-per-process",
        "--disable-background-timer-throttling",
        "--disable-client-side-phishing-detection",
        "--enable-easy-off-store-extension-install",
        "--disable-blink-features=AutomationControlled",
        "--disable-features=IsolateOrigins,site-per-process"]

    #
    for opt in opts:
        o.add_argument(opt)
    for ext in [ext_0 + str(p) + '.crx', ext_1 + str(p) + '.crx', ext_2 + str(p) + '.crx',
                ext_3 + str(p) + '.crx']: o.add_extension(ext)
    o.add_experimental_option("excludeSwitches", ["enable-automation"])
    o.add_experimental_option('useAutomationExtension', False)
    #
    return o

Метод удаления программным способом

      def ext_remove(ps,ext):
    for p in range(len(ps)):
        try:
            activ(p)
            d[p].get('chrome://extensions/')
            #pr('f12'),ss(1)
            hk('ctrl', 'shift', 'j'), ss(1)
            code = '''var tags = document.querySelector('body').querySelector('extensions-manager')['shadowRoot'].querySelector('cr-view-manager').querySelector('extensions-item-list')["shadowRoot"].querySelector('#container').querySelectorAll('extensions-item'); for (i = 0;i <= tags.length; i ++) {try {if(tags[i]['shadowRoot'].querySelector('#a11yAssociation').innerText.toLowerCase().indexOf("''' + str(ext) +'''") > 0) {tags[i]['shadowRoot'].querySelector('#remove-button').click();break} } catch {}}'''
            pyperclip.copy(code), ss(0.5)
            # pr('tab'), ss(0.5)
            temp_rep = 1 if type(ext) == str else len(ext)
            for _ in range(temp_rep):
                hk('ctrl', 'v'), ss(0.5)
                pr('enter'), ss(0.5)
                pr('space'), ss(0.5)
                tabs_close_extra(p)

            pr('f12'), ss(0.5) #hk('ctrl', 'shift', 'j'), ss(0.5)
        except: pass

Некоторые из приятных вещей

  1. Активировать окно
  2. В сокращении: имитируйте нажатие на клавиатуру
  3. Методы: списки подразделов, закрытые вкладки, пул потоков (многопоточность) и мозаичные окна *

* (включая сценарии Java - для сохранения в том же месте, что и этот сценарий

Активировать окно

      pyautogui.FAILSAFE = False

def activ(p, index_wd=''):
    global   index_activ
    try:
        if index_wd == '':
            index_wd = wd[p][0]
        else:
            index_wd = index_wd[p]
    except:
        index_wd = wd[p]

    print(f'active {w}')
    index_activ[p] = False
    try:
        index_wd.activate()
        index_activ[p] = True
        return index_activ[p]
    except:
        try:
            index_wd.minimize()
            index_wd.restore()
            index_activ[p] = True
            return index_activ[p]
        except:
            index_activ[p] = False
    index_activ[p] = False
    return index_activ[p]

Быстрые клавиши

      def keys(actions, delay=0.5):

# global BL3
print(f'def keys()')  # {actions}') #, profile {p}')
outcome = []
for action in actions:
    print(f'action {action}')
    if len(action) == 4:
        outcome = outcome + [action[0](action[1], action[2], action[3]), ]
    elif len(action) == 3:
        outcome = outcome + [action[0](action[1], action[2]), ]
    elif (len(action) == 2) and (action[1] != ''):
        outcome = outcome + [action[0](action[1]), ]
    else:
        outcome = outcome + [action[0](), ]
    ss(delay)  # await ass(delay)
return outcome

Подразделить списки

      def data_mygrouper(n,
                   iterable):
    args = [iter(iterable)] * n
    return ([e for e in t if e != None] for t in itertools.zip_longest(*args))

ссылка на переполнение стека ( data_mygrouper )

ThreadPool

      def thread_all(ps, fn, parm='', actions=[], workers=6, chunk=1):
    # https://stackoverflow.com/questions/42056738/how-to-pass-a-function-with-more-than-one-argument-to-python-concurrent-futures/42056975
    print(f'thread_all({ps}, {fn}, {parm}, {actions}')
    if parm == '':
        with ThreadPoolExecutor(max_workers=max(1, workers)) as executor:
            return executor.map(fn, ps, timeout=90, chunksize=max(1, chunk))
    else:
        with ThreadPoolExecutor(max_workers=max(1, workers)) as executor:
            return executor.map(fn, ps, itertools.repeat(parm, L), timeout=90, chunksize=max(1, chunk))

thread-pool_exector ссылка: здесь

Другие методы

      def tab_close(p):
    print(f'def tab_close {p}')
    # d[p].switch_to.window(parent[p])
    for h in d[p].window_handles:
        d[p].switch_to.window(h)
        parent[p] = h
        [ev[p]] = [d[p].execute_script]
        break
    # parent[p] = d[p].current_window_handle
    for h in d[p].window_handles:
        if h != parent[p]:
            d[p].switch_to.window(h)
            if len(d[p].window_handles) > 1: d[p].close()
            else: break
    d[p].switch_to.window(parent[p])



def tabs_close_extra(p):
    # alternative method (much slower): https://stackoverflow.com/questions/12729265/switch-tabs-using-selenium-webdriver-with-java
    try:
        for h in d[p].window_handles:
            d[p].switch_to.window(h)
            parent[p] = h
            break
        # parent[p] = d[p].current_window_handle
        tabs_original = len(d[p].window_handles)
        if tabs_original > 1:
            for h in d[p].window_handles:
                if h != parent[p]:
                    d[p].switch_to.window(h)
                    activ(p), hk('ctrl', 'w')
                    if len(d[p].window_handles) == tabs_original:
                        d[p].close()
                    # d[p].switch_to.window(parent[p])
            d[p].switch_to.window(parent[p])
    except:
        print(f'error in tabs_close_extra {p}')

Переменные

      def vars():
    print('def vars()')
    global index, index2, index3, index4, index5, index6
    global index_activ, index_activ2, hks, pycharm_win
    global index_latest_files, index_hks, index_hks2
    global parent, d,  w, w2
    global path_chrome, path_exec, path_core, path_temp, profile, done, caps, pycharm_win
    global ps, p2s, qs
    global L, tile_type, compact, outcome
    global kd, ku, hk, pr, tw, wr, cl
    global gats, gaws, gwwt, gawt, gaw
    global cc, ss, start, start2, start_overall
    global wd, wd2, ev, errors, errors2, errors3
    global ext_0, ext_1, ext_2, ext_3,ext_details
    caps = DesiredCapabilities.CHROME.copy()
    [cc, ss, kd, ku, hk, pr, tw, wr, cl] = [pyautogui.countdown, time.sleep, 
    pyautogui.keyDown, pyautogui.keyUp, pyautogui.hotkey, pyautogui.press,,pyautogui.typewrite, pyautogui.write, pyautogui.click]
    [gats, gaws, gwwt] = [pyautogui.getAllTitles, pyautogui.getAllWindows, pyautogui.getWindowsWithTitle]
    [gawt, gaw] = [pyautogui.getActiveWindowTitle, pyautogui.getActiveWindow]
    L = 4
    qs, p2s, ps, = list(range(L)), list(range(L)), list(range(L))
    text_temp, start = [''] * L, [0] * L
    index_hks, index_hks2 = [hks] * L, [0] * L
    index_latest_files = ['']
    parent, w, ev, d, wd = [''] * L, [''] * L, [''] * L, [''] * (L + 1), [['']]*L
    start_overall, outcome = '', ''
    try: pycharm_win = [gaw()]
    except: pass
    path_chrome = "C:\Program Files\Google\Chrome\Application\chrome.exe"
    path_core = os.path.join(os.path.expanduser("~"), 'PyCharmProjects', 'Parallel')
    path_exec = os.path.join(path_core, "chromedriver.exe")
    ext_details = [ ['ublock', 'cjpalhdlnbpafiamejdnhcphjbkeiagm'], ['keyboard_shortcuts', 'dkoadhojigekhckndaehenfbhcgfeepl'], ['browsec', 'omghfjlpggmjjaagoclmmobgdodcjboh'], ['itrace', 'njkmjblmcfiobddjgebnoeldkjcplfjb']]
    ext_0= os.path.join(path_core, "Browsec")
    ext_1 = os.path.join(path_core, "Keyboard")
    ext_2 = os.path.join(path_core, "itrace")
    ext_3 = os.path.join(path_core, "ublock")

Основной код

      if __name__ == '__main__':
    ps =''
    vars()
    if len(ps) > 3:
        ps_new = list(data_mygrouper(int(round(len(ps) / 2, ndigits=0)), ps))
        for x in range(2): thread_all(ps_new[x], new_profile, workers=len(ps_new[x]) + 1, chunk=len(ps_new[x]) + 1), cc(5)
    # new_profile
    else:   thread_all(ps, new_profile, workers=L + 1, chunk=L+1)
    #thread_all(ps,new_profile)
    tile_windows('v')
    ext_update_method1(ps)
    ext_remove(ps,'browsec')
    ext_update_method2(ps)

Чтобы добавить любое расширение Chrome с помощью selenuim и Java , я пробовал много способов, но мне помогло следующее. С помощью мы можем добавить любое расширение/плагин Chrome и запустить его также через скрипт.

Шаг 1. Откройте Chrome https://chrome.google.com/webstore/category/extensions driver.get("https://chrome.google.com/webstore/category/extensions");

Найдите необходимое расширение в поле поиска (Google Translate). И нажмите нужный из списка самовнушения. Затем нажмите на заголовок расширения. Затем откроется страница сведений о расширении.

Шаг 2: Без использования шага 1 мы также можем открыть эту страницу расширения непосредственно по идентификатору плагина. Непосредственно откройте следующую ссылку.
Пример:https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb driver.get("https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb");

Теперь нажмите «Добавить в Chrome», обработайте всплывающее окно с помощью клавиш робота, таких как TAB и EN.

              Robot rb=new Robot();
        rb.keyPress(KeyEvent.VK_TAB);
        Thread.sleep(300);
        rb.keyRelease(KeyEvent.VK_TAB);
        Thread.sleep(1000);
        rb.keyPress(KeyEvent.VK_ENTER);
        Thread.sleep(300);
        rb.keyRelease(KeyEvent.VK_ENTER);

Теперь успешно добавлено расширение Chrome в браузер Chrome. Чтобы запустить расширение Chrome, создайте ярлык для этого установленного расширения и используйте эту комбинацию клавиш для открытия расширения, когда вы хотите запустить/открыть его.

      driver.get("chrome://extensions/shortcuts");

щелкните значок ярлыка и нажмите сочетание клавиш, например: Control+Q. Используйте для этого ключи робота. После того, как вы добавили эту горячую клавишу, нажав эту клавишу, вы можете запустить расширение.

using System.IO;
using System.IO.Compression;



  public static class ChromeExtension
        {
            public static string Execute()
            {
                var ParentPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent;
                var DirectoryPath = ParentPath.FullName.Remove(ParentPath.FullName.IndexOf(ParentPath.Name));

                string startPath = $"{DirectoryPath}\\Exchanger\\ChromeExtension";
                string zipPath = $"{DirectoryPath}Exchanger\\Extension.zip";

                if (System.IO.File.Exists(zipPath))
                {
                    System.IO.File.Delete(startPath);
                }

                ZipFile.CreateFromDirectory(startPath, zipPath);


                if (System.IO.File.Exists($"{DirectoryPath}\\Exchanger\\Extension.crx"))
                {
                    System.IO.File.Delete($"{DirectoryPath}\\Exchanger\\Extension.crx");
                }

                System.IO.File.Move(zipPath, $"{DirectoryPath}\\Exchanger\\Extension.crx");

                return $"{DirectoryPath}\\Exchanger\\Extension.crx";
            }

        }

....////....

Used: 
var options = new ChromeOptions();   
options.AddExtension(ChromeExtension.Execute());

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