How to accept the popup presented when installing

2019-01-07 01:08发布

问题:

I am using selenium for some browser automation. I need to install an extension in the browser for my work. I am doing it as follows:

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)

The browser is starting fine but I am prompted with a pop-up to confirm that I want to add the extension as follows:

and after I get this pop-up, Python soon returns with the following exception:

selenium.common.exceptions.WebDriverException: Message: u'unknown error: failed to wait for extension background page to load: chrome-extension://abhcfceiempjmchhhdhbnkbimnfpckgl/toolbar.html\nfrom unknown error: page could not be found: chrome-extension://abhcfceiempjmchhhdhbnkbimnfpckgl/toolbar.html\n (Driver info: chromedriver=2.12.301324 (de8ab311bc9374d0ade71f7c167bad61848c7c48),platform=Linux 3.13.0-39-generic x86_64)'

I tried handling the popup as a regular JavaScript alert using the following code:

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

However, this doesn't help. Could anyone please tell me how do I install this extension without the popup or a way to accept the popup? Any help would be greatly appreciated. Thanks!

回答1:

Usually, you cannot test inline installation of a Chrome extension with just Selenium, because of that installation dialog. There are a few examples in the wild that show how to use external tools outside Selenium to solve this problem, but these are not very portable (i.e. platform-specific) and rely on a state of Chrome's UI, which is not guaranteed to be consistent.

But that does not mean that you cannot test inline installation. If you replace chrome.webstore.install with a substitute that behaves like the chrome.webstore.install API (but without the dialog), then the end-result is the same for all intents and purposes.

"Behaves like chrome.webstore.install" consists of two things:

  • Same behavior in error reporting and callback invocation.
  • An extension is installed.

I have just set up such an example on Github, which includes the source code of the helper extension/app and a few examples using Selenium (Python, Java). I suggest to read the README and the source code to get a better understanding of what happens: https://github.com/Rob--W/testing-chrome.webstore.install.

The sample does not require the tested extension to be available in the Chrome Web store. It does not even connect to the Chrome Web store. In particular, it does not check whether the site where the test runs is listed as a verified website, which is required for inline installation to work.



回答2:

I had some really big code which I would have to re-write if I had to use Java. Luckily, python has a library for automating GUI events called ldtp. I used that to automate the clicking on the "Add" button. I did something on the following lines:

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)

Hope it helps somebody.