Arhn - архитектура программирования

Как принять всплывающее окно, представленное при установке расширения в Selenium?

Я использую селен для некоторой автоматизации браузера. Мне нужно установить расширение в браузере для моей работы. Я делаю это следующим образом:

import selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
executable_path = "/usr/bin/chromedriver"
options = Options()
options.add_extension('/home/TheRookie/Downloads/extensionSamples/abhcfceiempjmchhhdhbnkbimnfpckgl.crx')
browser = webdriver.Chrome(executable_path=executable_path, chrome_options=options)

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

введите здесь описание изображения

и после того, как я получаю это всплывающее окно, Python вскоре возвращается со следующим исключением:

selenium.common.exceptions.WebDriverException: Сообщение: неизвестная ошибка: не удалось дождаться загрузки фоновой страницы расширения: chrome-extension://abhcfceiempjmchhhdhbnkbimnfpckgl/toolbar.html\nиз неизвестной ошибки: страница не найдена: chrome-extension ://abhcfceiempjmchhhdhbnkbimnfpckgl/toolbar.html\n (информация о драйвере: chromedriver=2.12.301324 (de8ab311bc9374d0ade71f7c167bad61848c7c48),platform=Linux 3.13.0-39-generic x86_64)'

Я попытался обработать всплывающее окно как обычное предупреждение JavaScript, используя следующий код:

alert = browser.switch_to_alert()
alert.accept()

Однако это не помогает. Может ли кто-нибудь сказать мне, как мне установить это расширение без всплывающего окна или способ принять всплывающее окно? Любая помощь будет принята с благодарностью. Спасибо!



Ответы:


1

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

Но это не означает, что вы не можете протестировать встроенную установку. Если вы замените chrome.webstore.install заменой, которая ведет себя как chrome.webstore.install API (но без диалоговое окно), то конечный результат одинаков для всех намерений и целей.

«Ведет себя как chrome.webstore.install» состоит из двух вещей:

  • Такое же поведение при сообщении об ошибках и вызове обратного вызова.
  • Установлено расширение.

Я только что установил такой пример на Github, который включает исходный код вспомогательного расширения/приложения и несколько примеров с использованием Selenium (Python, Java). Я предлагаю прочитать README и исходный код, чтобы лучше понять, что происходит: https://github.com/Rob--W/testing-chrome.webstore.install.

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

22.02.2015
  • Использует developerPrivate... Похищает ID из белого списка.. ХААААААХ! ;) 23.02.2015
  • Ваше решение работает с webdriver.Remote и можете привести пример? Я использую webdriver.Remote для подключения к удаленному браузеру Chrome. И как мне установить вспомогательные расширения в удаленном браузере? 23.02.2015
  • И можно ли установить расширение из Интернет-магазина Chrome? Наш веб-сайт устанавливает наше расширение из Интернет-магазина Chrome, когда пользователь нажимает кнопку. 23.02.2015
  • @Uri Для удаленной работы вы должны использовать add_extension с zip-файлом, как показано здесь: github.com/Rob--W/testing-chrome.webstore.install/commit/. Вспомогательное приложение/расширение загружается нормально, но ЕСЛИ ваше расширение содержит фоновую страницу, оно не работает, потому что ChromeDriver ожидает загрузки фоновой страницы. Способ решить эту проблему — скопировать файлы zip/crx в фиксированное место на удаленном хосте и указать пути в load-extension=path/to/helper,path/to/helper-app,path/to/extension/etc. 23.02.2015
  • @Uri Этот трюк с установкой без пользовательского интерфейса работает только потому, что расширение, которое вы тестируете, уже предустановлено (хотя и отключено). Установка последней версии из CWS невозможна без пользовательского интерфейса. Технически можно достичь цели путем (автоматической) загрузки и распаковки CRX перед тестированием, а также добавления логических проверок, которые также используются в интернет-магазине Chrome (например, проверка сайта), но я этого не делал, т.к. не хотел тратить больше времени на написание этого демо. 23.02.2015
  • @RobW возможно ли это сейчас с селеном? 03.03.2016
  • @AllIsWell Не уверен, я так не думаю. 04.03.2016

  • 2

    У меня был действительно большой код, который мне пришлось бы переписать, если бы мне пришлось использовать Java. К счастью, в python есть библиотека для автоматизации событий графического интерфейса, которая называется ldtp. Я использовал это, чтобы автоматизировать нажатие кнопки «Добавить». Я сделал что-то в следующих строках:

    from ldtp import *
    from threading import Thread 
    import selenium
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    def thread_function():
        for i in range(5):
            if activatewindow('Confirm New Extension'):
                generatekeyevent('<left><space>')
                break
            time.sleep(1)
    
    def main():
        executable_path = "/usr/bin/chromedriver"
        options = Options()
        options.add_extension('/home/TheRookie/Downloads/extensionSamples/abhcfceiempjmchhhdhbnkbimnfpckgl.crx')
        thread.start()
        browser = webdriver.Chrome(executable_path=executable_path, chrome_options=options)
    

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

    13.11.2014
  • Этот код работает? Как установить ldtp? Вы используете thread, но импортируете Thread, Python чувствителен к регистру. Когда я пытаюсь использовать ваш код, я вижу, что thread не определено. 22.02.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..