有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

python在Selenium中安装扩展时如何接受弹出窗口?

我正在使用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)

浏览器启动正常,但弹出窗口提示我确认要添加扩展,如下所示:

enter image description here

在我得到这个弹出窗口后,Python很快返回,但出现以下异常:

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)'

我尝试使用以下代码将弹出窗口作为常规JavaScript警报处理:

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

然而,这并没有帮助。有人能告诉我如何在没有弹出窗口或接受弹出窗口的情况下安装此扩展吗?任何帮助都将不胜感激。谢谢


共 (2) 个答案

  1. # 1 楼答案

    我有一些非常大的代码,如果我必须使用Java,我必须重新编写这些代码。幸运的是,python有一个自动化GUI事件的库,名为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)
    

    希望它能帮助别人

  2. # 2 楼答案

    通常,由于安装对话框的原因,您无法仅使用Selenium测试Chrome扩展的内联安装。有几个例子展示了如何使用Selenium之外的外部工具来解决这个问题,但这些工具的可移植性不强(即特定于平台),并且依赖于Chrome的UI状态,不能保证其一致性

    但这并不意味着不能测试内联安装。如果将chrome.webstore.install替换为行为类似于^{}API的替换(但没有对话框),那么最终结果在所有意图和目的上都是相同的

    “行为像chrome.webstore.install”由两部分组成:

    • 错误报告和回调调用中的行为相同
    • 安装了一个扩展

    我刚刚在Github上建立了这样一个示例,其中包括helper扩展/应用程序的源代码,以及一些使用Selenium(PythonJava)的示例。我建议阅读自述文件和源代码,以便更好地了解发生了什么:https://github.com/Rob W/testing-chrome.webstore.install

    该示例不要求在Chrome网络商店中提供经过测试的扩展。它甚至没有连接到Chrome网络商店。特别是,它不会检查测试运行的站点是否被列为已验证的网站which is required for inline installation to work